Avatar billede golyf Nybegynder
26. april 2005 - 16:04 Der er 1 kommentar og
1 løsning

For stor Panel

Jeg er ved at lave et tegne program og til det areal, som jeg tegner på bruger jeg et Panel, som har samme størrelse som vinduet. Dermed kan det højest være ca. 1000*700 på en SVGA skærm.
Jeg vil gerne en løsning hvor mit areal kan være meget større end skærmen. F.x. at jeg kunne sætte mit Panel til at være 10.000 punkter på hver led og så kun se noget af den. Dermed skal jeg jo selvfølgelig også have nogle SchrollBars til at definere hvad jeg vil se. Det er brugt i næsten alle tegne/billed programmer, så det er kendt teknik og forhåbentlig er der også en let løsning, men hvordan gør man i VB.NET ?

Alle former for hjælp modtages med glæde.

BP
Avatar billede thlund Nybegynder
26. april 2005 - 19:42 #1
Jeg ville sige at du skal arbejde med 2 koordinat systemer, dvs et for skærmen og et for papiret. På den måde kan du zoome og trække papiret og desuden er der ingen grænser for hvor stort dit faktiske areal er.

Nu har jeg for nylig lavet noget lignende og jeg gjorde som følger:
Du skal tage den skærmkoordinat din mus er i, og regne den om til papirkoordinat.
Papirkoordinaten gemmer du, da den er den størrelse der er uændret uanset om
du zoomer eller trækker papiret rundt på skærmen. Når du så skal tegne igen
(refreshe) skal du tage den gemte papir koordinat og regne tilbage til skærm
koordinater før du tegner på skærmen. I praksis kan det godt betale sig at gemme
skærmkoordinaten, da den er uændret så længe du ikke zoomer og trækker, men den
skal genberegnes når du gør det.

Hvis du har et fast koordinat system på skærmen, dvs 0 <= x <= 1000 og 0 <= y <Z 700,
og dit papir er placeret således at skærm (0,0) = papir (x0,y0) og skærm (1000,700) = papir (x1,y1), så er din transformation fra skærm til papir

xp = x0 + xs*(x1-x0)/1000
yp = y0 + ys*(y1-y0)/700

Hvor xp,yp er papir koordinater og xs,ys er skærm ditto. Den anden vej er så :

xs = (xp-x0)*1000/(x1-x0)
ys = (yp-y0)*700/(y1-y0)

Tjek lige at jeg regner rigtig.

Var det svar nok : Du får alle dine handlinger i skærm koordinater, du regner om til papir koordinater for at få handlingen i "den virkelige verden". Når du tegner så tager du "den virkelige verden" og regner om til skærmen og tegner der. Træk og zoom ved at ændre i de koordinater der udtrykker papirets position i forhold til skærmens (0,0) og (1000,700).

Muligvis skal du korrigere for at skærmen har en y-akse retning der er modsat dit papir, eller også kan du sætte dit papir til at have samme retning.

Håber det var svar nok.

Thomas
Avatar billede golyf Nybegynder
26. april 2005 - 20:16 #2
Havde håbet (og troet) at der var en "automatisk metode. Det andet har jeg selv gang i på stående fod. I så fald skal man jo 'lave det hele selv'. Lidt skuffet, må jeg tilstå at jeg havde formodet at vb.net var kommet længere end c/c++ :-P

Tak dog og værsko.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester