Ursprung des Koordinatensystems ändern

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Tritium

Betreff: Ursprung des Koordinatensystems ändern

BeitragDo, Sep 27, 2012 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

wie kann ich bei Max2D den Ursprung des grafischen Koordinatensystems (also 0,0 mit y-Achse nach unten -> linkshändig) so verändern, dass er dem "normalen" (z.B. mathematischen) Koordinatensystem (Ursprung links unten, y-Achse nach oben -> rechtshändig) entspricht?

Bisher hab ich nur SetOrigin fürs verschieben und SetRotation fürs rotieren gefunden, aber nichts, um es von linkshändig in rechtshändig zu ändern. Würd mich freuen, wenn mir da jemand weiterhilft Smile

D2006

Administrator

BeitragDo, Sep 27, 2012 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
SetScale 1,-1


Das könnte hilfreich dafür sein, wobei dann sicher dennoch der Ursprung angepasst werden muss. Allgemein empfehl ich aber die Mathematik in dem Fall zu vergesssen und dich an das Koordinatensystem zu gewöhnen. Es schlichtweg Standard und wird dir immer wieder in der Programmierung so begegnen.

EDIT: whoops. Hab das gerade mal ausprobiert. Bei BMax beeinflusst SetScale ja gar nicht die Positionierung wie ich das von anderswo gewöhnt bin. Sorry für die falsche Information!
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Xeres

Moderator

BeitragDo, Sep 27, 2012 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
SetOrigin könnte weiterhelfen - allerdings ist die Achse dann immer noch negativ. Am simpelsten wäre es vielleicht, in den Modulcode zu schauen, wie Graphics() arbeitet.
BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics(512, 512)

Local x:Float, y:Float
GetOrigin(x, y)
DrawText(x + ", " + y, 10, 10)
DrawRect(10, 25, 32, 32)

SetOrigin(0, 512)

GetOrigin(x, y)
DrawText(x + ", " + y, 10, -15)

DrawRect(10, -50, 32, 32)

Flip()
WaitKey()
End
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Lobby

BeitragDo, Sep 27, 2012 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist zwar unschön, aber über SetVirtualResolution würde das Ganze auch klappen. Allerdings muss man mit SetOrigin nachhelfen und bei den Maus-Positions-Funktionen manuell eine Korrektur vornehmen (also bei VirtualMouseX() und VirtualMouseY()).
So sähe das Ganze dann aus in BlitzMax: [AUSKLAPPEN]
SuperStrict

Graphics(400, 300, 0)
Local timer:TTimer = ttimer.Create(60, Null)

SetVirtualResolution(400, -300)
SetOrigin(0, -300)

While(Not(KeyHit(KEY_ESCAPE) Or AppTerminate()))
Cls()

DrawRect(VirtualMouseX(), 300 + VirtualMouseY(), 80, 80)

Flip()
timer.Wait()
Wend

End


Mit einem SetScale(1,-1) müsste man noch verhindern, dass auch die Grafiken auf dem Kopf gezeichnet werden, aber ich halte es für fraglich, dass sich der gesamte "Hack" lohnt.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

BlitzMoritz

BeitragDo, Sep 27, 2012 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wirklich am simpelsten wäre es, sich die paar Zeichenfunktionen, die es gibt, wie gewünscht anzupassen. Um den theoretischen "Unterbau", dass die y-Achse ja eigentlich oben hängt, macht man sich dann einfach gar keine Gedanken mehr - und fertig:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Const ScreenHeight% = 600
Graphics 800, ScreenHeight

Function Draw_Plot(x%, y%)
Plot x, ScreenHeight - y
End Function

Function Draw_Rect(x%, y%, w%, h%)
DrawRect x, ScreenHeight - y - h, w, h
End Function

Function Draw_Oval(x%, y%, w%, h%)
DrawRect x, ScreenHeight - y - h, w, h
End Function

Function Draw_Line(x1%, y1%, x2%, y2%)
DrawLine x1, ScreenHeight - y1, x2, ScreenHeight - y2
End Function

Function Draw_Image(img:TImage, x%, y%)
SetImageHandle(img, 0, img.height) '(sollte natuerlich ausserhalb der Funktion stehen)
DrawImage img, x, ScreenHeight - y
End Function

'DrawPoly fehlt noch, wird aber von den wenigsten benutzt ...


'--------------------------------------
'Beispiel:
SetColor 255,0,0
DrawRect 0,0,120,90
Local img:TImage = LoadImage(GrabPixmap(0,0,120,90))
Repeat
Cls
SetColor 255,255,255
Draw_Image(img, MouseX(), MouseY())
Flip
Until KeyDown(KEY_ESCAPE) Or AppTerminate()

Wie man sieht, ist dabei auch die Orientierung der Zeichenobjekte auf Links - Unten verlegt worden.

Edit: Ich hab' die Mausposition oben original gelassen, um die Umkehrung zu verdeutlichen. Wenn du die angepasste Maus-Interaktion allerdings im Code benötigst, musst du sie dir natürlich ebenso umschreiben, etwa: BlitzMax: [AUSKLAPPEN]
Function Mouse_Y%()
Return ScreenHeight - MouseY()
End Function
 

Tritium

BeitragFr, Sep 28, 2012 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
D2006 hat Folgendes geschrieben:
Allgemein empfehl ich aber die Mathematik in dem Fall zu vergesssen und dich an das Koordinatensystem zu gewöhnen. Es schlichtweg Standard und wird dir immer wieder in der Programmierung so begegnen.

Normalerweise richte ich mich auch immer nach dem Koordinatensystem, da es beim Programmieren für mich am intuitivsten ist. Diesmal mach ich aber viel mit Vektorrotationen etc. und da ist es praktisch, wenn ich die Sachen, die ich mir auf Papier ausdenke/herleite direkt in den Code übertragen kann, ohne auf Koordinatentransformationen achten zu müssen. Außerdem machts die Fehlersuche einfacher, wenn ich nicht ständig "auf dem Kopf" denken muss Wink

@Blitzmoritz: Ich hab mir jetzt nach Deiner Lösung eine Funktion geschrieben:
BlitzMax: [AUSKLAPPEN]
Function Y#(value#)
Return GraphicsHeight() - value
End Function

'Beispiel
DrawOval 100,Y(200),20,-20

Außerdem hab ich rausgefunden, dass man z.B. DrawOval auch eine negative Höhe übergeben kann, sodass der Kreis nach oben gezeichnet wird Very Happy Wusste ich bisher garnicht, dass das geht (bei Blitz3D war das glaub ich nicht möglich, oder?). Einziger Nachteil ist, dass man jetzt daran denken muss, dass bspw. Kreise ihren Handle links unten und nicht links oben haben. Logisch ists dennoch, denn jetzt gibt man für einen Kreis die Startposition und seine Breite und Höhe an - und im neuen Koordinatensystem, in dem Y nach oben zeigt, wird die Höhe immer noch in Richtung der y-Achse auf den Startwert addiert.

Bisher funktioniert die Lösung. Sollte ich noch einen Fehler oder eine Verbesserung finden schreib ichs hier rein. Danke für Eure Hilfe!

kog

BeitragSa, Sep 29, 2012 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen.

Ich wollte nur anmerken, das es möglich ist die normalen funktionen zu überschreiben:
Code: [AUSKLAPPEN]
Function Drawrect(x#,y#,w#,h#)
         brl.max2d.DrawRect(x,y,w,h)
End Function



Grüsse
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group