2D: Zoom und Verschiebung

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
joggel

2D: Zoom und Verschiebung

Beitrag von joggel »

Hallo,

ich gebs auf! Ich weiß nicht, wie ich es umsetzen soll.

Folgendes Problem, alles in 2D:
- ein Spielfeld, von Oben betrachtet (sagen wir ein haufen Kreise)
- wenn ich das Mausrate betätige will ich in das Spiel reinzoomen, also alle Geometrie die ich zeichne soll eben großer gezeichnet werden

Mal ne Skizze:
Skizze1.JPG
Das ist das gesamte Spielfeld (alles sehr schematisch).
Angenommen ich gehe nun mit der Maus auf das Zenrum und scrolle rein, dann möchte ich den Bildschirmausschnitt dort vergrößern.
Wieder eine Skizze:
Skizze2.JPG
Das schwarze Rechteck möchte ich nun auf den Bildschirm bringen und den Inhlat an die Zoomstufe angepasst haben:
Skizze3.JPG
Man beachte, das ich nicht einfach ein "Screenshot" machen möchte, sondern die gesamten Objekte eben nur größer zeichnen will.
Also bei Kreisen den Radius und Position anpassen!!

Das Problem:
Wie zur Hölle funktioniert das??
Ich habe mir folgendes schon überlegt:
Ich habe eine Klasse "ViewOfSpielFeld". Diese kapselt die Zoomstufe und den anzuzeigenden Spielfeldausschnitt!
"rectToRenderOnScreen": ist das Rechteck auf dem Bildschirm in dem dann gezeichnet werden soll (ist in der Mitte des ProgrammFensters)
Naja, mal etwas Code:

Code: Alles auswählen

void Renderer::draw(CL_GraphicContext &gc, ViewOfSpielfeld* viewOfSpielfeld, const CL_Rect& rectToRenderOnScreen )
{
	CL_Pointf lo(rectToRenderOnScreen.get_top_left().x,rectToRenderOnScreen.get_top_left().y);

	// "ViewOfSpielfeld::getAllKreiseInViewRect()": 
	// liefert alle Kreise vom Spielfeld (bei Zoomstufe 1.0)
	// die sich in dem Ausschnitt befinden, der angezeigt werden soll!
	// Die Funktion funktioniert auch!
	std::vector<Kreis> kreise( viewOfSpielfeld->getAllKreiseInViewRect()); 

	std::vector<Kreis>::const_iterator iter(kreise->begin());
	for(iter; iter!=kreise->end(); ++iter)
	{
		Kreis derKreis(*(iter));
		CL_Pointf mitte(derKreis->mMittePos);  
	        // angabe der Mitte u. Radius des Kreises in OriginalKoordinaten (zoomstufe 1.0)
		float radius(derKreis->mRadius * viewOfSpielfeld->mZoomFaktor); 

		CL_Pointf neuMitte(/* some Magic *~~~~~* */);
		mKreiszeichner.draw(gc,neuMitte,radius);
	}
}
Ja, das ist nun mein Problem!
Hat jemand eine Idee? Irgendwie verhädder ich mich immer..

Gruß
Zuletzt geändert von joggel am 19.05.2011, 13:11, insgesamt 1-mal geändert.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: 2D: Zoom und Verscheibung

Beitrag von Chromanoid »

Matrizen sind auch für 2D Sachen nett. Meistens reicht eine Object Space to Screen Space Matrix, die man dann bei den Renderen setzt. Die meisten modernen Render-Apis unterstützen oft das setzen von Matrizen. Wenn du das ganze selbst machen musst, wäre bei Ellipsen wohl angesagt, zunächst aus Radius/Radien + Zentrum 2 bzw. 3 Punkte zu bauen, die dann transformiert werden und dann kannst du eine Ellipse durch die Punkte malen. Ist vielleicht ganz hilfreich: http://help.adobe.com/en_US/FlashPlatfo ... atrix.html
Die Inverse der Matrix wendest du dann übrigens auf die Cursor-Position an um die Maus im Object Space zu ermitteln. Dein someMagic müsste übrigens (bildschirm_versatz+alte_mitte)*zoom sein.
joggel

Re: 2D: Zoom und Verscheibung

Beitrag von joggel »

Okay,
danke!

Werde mir mal das mal anschauen und überlegen wie ich das umsetze.
Wenns geklappt hat, sage ich bescheid :) ..

Gruß
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: 2D: Zoom und Verscheibung

Beitrag von Chromanoid »

Wichtig ist vor allem, dass du den Versatz richtig bestimmst. Ist in der Bildschirmmitte 0,0 oder links oben usw.
joggel

Re: 2D: Zoom und Verscheibung

Beitrag von joggel »

Links oben ist (0,0).
Möchte ja aber noch transormieren, in das Rechteck, das in der Mitte des Bidlschirmes ist, aber wenn ich erstmal die Koordinaten im ScreenSpace raus habe, ist das dann kein Problem mehr, denke ich.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: 2D: Zoom und Verscheibung

Beitrag von Chromanoid »

ich würde evt. das pixelzeichnen um (screen_w/2,screen_h/2) nochmal versetzen, damit 0,0 die Bildschirmmitte ist, das müsste leichter gehen.
joggel

Re: 2D: Zoom und Verscheibung

Beitrag von joggel »

Nunja, ansichtsache ^^..
Aber interessanter Ansatz, werd mal überlegen ob mir das was bringt.
Ich werde das erstmal so probieren wie Du oben beschrieben hast, besser gesat, überlegen!
Heute wird wohl eher nichts..^^
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: 2D: Zoom und Verscheibung

Beitrag von Chromanoid »

Also besonders innovativ ist das von mir jetzt nicht gewesen :) Habe mich da einfach an Flash & Co. orientiert... Habe mal eine Art Pixel Art Tool mit Flash gebaut, da musste man auch zoomen können - also funktionieren sollte der Ansatz auf jeden Fall ;)...
joggel

Re: 2D: Zoom und Verscheibung

Beitrag von joggel »

Chromanoid hat geschrieben:(bildschirm_versatz+alte_mitte)*zoom .
Ich lese mir das gerade nochmal durch, kann aber nix machen/probieren da ich auf Arbeit bin.
Aber:
Ich habe mal das mit paar Zahlen probiert.
alte_mitte = (1000,100) (nur mal angenommen mein Spielfeld ist ziemlich groß).
bildschirm_versatz = (100,100)
zoom = 2.5 (reingezoomt/vergrößert)

Dann wäre das Ergebnis:
(1100,200)*zoom => (2750,500). Nich gut

Ich probiere mal rum:
(bildschirm_versatz + ( alte_mitte - ecke_links_oben_des_Ausschnitss_was_vom_Spielfeld_angezeigt_werden_soll ) )*zoom

Oder befinde ich mich hier auf dem Holzweg?
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4262
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: 2D: Zoom und Verscheibung

Beitrag von Chromanoid »

"ecke_links_oben_des_Ausschnitts_was_vom_Spielfeld_angezeigt_werden_soll" ist das was ich mit "um (screen_w/2,screen_h/2) nochmal versetzen, damit 0,0 die Bildschirmmitte ist, das müsste leichter gehen." meinte :). müsste eigentlich so gehen...
joggel

Re: 2D: Zoom und Verscheibung

Beitrag von joggel »

Danke!
Hat geklappt. :)
Antworten