Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.06.2016, 20:23

Eckpunkte in einem Rechteck

Guten Abend,

in Erinnerung an meiner Schulzeit werden die Eckpunkte in einem Rechteck beginnend links unten und dann gegen den Uhrzeigersinn angegeben. Leider ist das nicht einheitlich, Microsoft verwendet gerne links-oben, rechts-oben, links-unten, rechts-unten. Beginnend Links-oben im Uhrzeigersinn kommt auch häufig vor.

Bei mir ist die Schulzeit schon ne Weile her, vielleicht erinnere ich mich auch falsch. Vielleicht gibt es aber auch einen Standard? Wie würdet ihr die Eckpunkte (P1-P4) eines Rechtecks zuordnen?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

15.06.2016, 21:07

Kommt auf den Kontext an. Für welche Berechnungen braucht man das Rechteck? So könnte es sinnvoller sein, nicht ein Rechteck, sondern 2 Dreiecke zu speichern, sollte man bspw. mit 3D Rendering zu tun haben.
Andererseits speichert man idealerweise nicht die Eckpunkte, sondern die Ausmaße des Rechtecks (und ggf. Position und Rotation), gerade weil man so Inkonsistenzen vermeiden kann. Ein Rechteck hat immer 4 rechte Winkel, 4 unabhängig voneinander gespeicherte Punkte könnten diese Eigenschaft aber ggf. nicht erfüllen.

Aber insgesamt kann man sagen: es gibt nicht den einen Standard.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

3

16.06.2016, 08:24

Der Kontext ist einfache 2D Vectorberechnungen und Ausgabe mit GDI. Vor einiger Zeit hatte ich das für ein Spiel mit GDI entwickelt. Der Kern ist eine 2D Vector Struktur die neben Operationen Längen und Rotationsfunktionalität bietet. Das Object Rechteck ist nicht ganz sauber, eigentlich ist es unnötig aber vereinfacht den Umgang und die Drehung von Bitmaps. Der rechte Winkel wird nicht geprüft und treffender wäre Parallelogram. Aber auch die gegenüberliegende Seitenlänge wird nciht geprüft und letztendlich wäre dann ein Viereck die richtige Klassifizierung. Dann müsste ich aber konsequent Funktionen wie Center sauber aufbauen und nicht nur die halbe Länge/Höhe zurückgeben. Dürfen sich im Viereck Linien kreuzen? Auf jeden Fall ist das ein guter Hinweis wo noch Überarbeitungen notwendig sind. Wahrscheinlich ist es vorerst bei den Bitmaps besser aufgehoben mit einer Bezeichnung wie z.B. ImageFrame.

Bei den Eckpunkten habe ich mich an Sytem.Drawing.DrawImage orientiert - zu dem Zeitpunkt kannte ich nur GDI. Jetzt spiele ich ein bisschen mit Monogame rum und würde gerne so eine Funktionalität wie Origin implementieren. Dazu muss ich ziemlich oft die Eckpunkte anfassen. Die Bezeichnung der Punkte kann ich zwar später mit Refactoring leicht ändern, wenn aber aus P3 dann anstelle von links-unten rechts-unten wird müsste es überarbeitet werden. Wenn ich später also feststelle, die ganze Welt verwendet für ein Viereck die Punktreihenfolge ausgehend von links-oben im Uhrzeigersinn und nur die eine Microsoftroutine und mein ImageFrame(Rechteck)-Klasse verwengen eine andere Reihenfolge, würde mich das nerven.

Von daher hoffe ich jemand hat hier bereits etwas Überblick über die verschiedenen Frameworks und Libs und kann mir eine Empfehlung geben wie es meist oder oft verwendet wird.

Und weil ich gerade am posten bin, würdet ihr eine Bezeichnung wie Center den Mittelpunkt vom Nullpunkt aus vermuten oder das Offset vom links-oben zum Mittelpunkt? Oder wäre es besser Center vom Nullpunkt aus zu definieren und eine weitere Funktion wie CenterOffset?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

16.06.2016, 08:28

Typischerweise wird ein Quad entweder völlig unabhängig durch 4 Punkte beschrieben, wobei egal ist, welcher der erste ist. Oder es wird ein Achsen-ausgerichtetes Rechteck beschrieben durch die Position der linken oberen Ecke, Höhe und Breite. Die dafür notwendigen 4 Vertices berechnen die Frameworks dann intern. Ein Origin bezieht sich dann immer auf die linke obere Ecke. Rotation bezieht sich dann auf diesen Origin. Center ist eigentlich eine recht unnütze Eigenschaft. Bei undefinierten Vierecken (ja, sie dürfen sich bei einem Viereck überkreuzen!) sogar noch mehr als bei konvexen Polygonen (Rechtecke, Parallelogramme, Trapeze, etc).
Eine Image-Frame-Klasse sollte also überhaupt gar keine Definition von Eckpunkten zulassen, sofern Du damit ein Rechteck beschreiben willst. Linke obere Ecke, Breite, Höhe.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

16.06.2016, 10:58

Es wäre gut, wenn der origin nicht zwingend die obere linke Ecke sein müsste. Würde man das auf andere Formen übertragen wollen, müsste man erst wieder bestimmen, welche Ecke die "obere Linke" Ecke ist. Stellt man sich ein Gleichseitiges Achteck vor, hat man 2 Punkte, die beide gleichermaßen die "obere linke Ecke" sein könnten, woraus folgt, dass es nicht die eine Ecke gibt, die als Ersatz dafür dienen könnte.
Selbst wenn man die obere linke Ecke der AABB dafür verwendet, kommt man dann wieder zu Problemen, wenn man 2 Formen hat, die sich bis auf die "Rotation" unterscheiden, bei denen der Origin dennoch unterschiedlich wäre.

Center ist eigentlich eine recht unnütze Eigenschaft.
Kommt darauf an, was man unter der Bezeichnung "Center" versteht. Wenn der origin im Mittelpunkt liegt, würde center die Position bestimmen. Ob das wiederum sinnvoll ist, kommt auf den Kontext an. Wenn man Polygone hat, die über ihre Eckpunkte definiert werden, kann es durchaus passieren, dass der Mittelpunkt aus allen Punkten (bzw. der Mittelpunkt gemessen am Flächeninhalt) nicht mehr mit dem Origin übereinstimmt, dann würde center als Position der Form wieder keinen Sinn ergeben.


@IsaacCohen:
Du kannst im Grunde auch so vorgehen, dass du für deine eigene interne Datenstruktur festlegst, wie was angeordnet ist, und eine Übersetzung genau dann durchführst, wenn etwas anderes erwartet wird. (Aus Performancegründen kann man natürlich schauen, dass möglichst wenige oder möglichst selten solche Übersetzungen stattfinden müssen. Entweder indem man seine eigene Datenstruktur von Anfang an genauso hält, wie sie von anderer Stelle erwartet wird, oder indem man bestimmte Informationen, die sich seltener Ändern, redundant in unterschiedlichen Formaten vorhält.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

16.06.2016, 11:23

Würde man das auf andere Formen übertragen wollen
... was wir hier ja nicht tun, weil wir über Rechtecke reden. Bitte keine utopischen Diskussionen über Dinge führen, die nicht gefragt sind. "You ain't gonna need it" gilt auch hier.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

7

16.06.2016, 11:26

Bei undefinierten Vierecken (ja, sie dürfen sich bei einem Viereck überkreuzen!) sogar noch mehr als bei konvexen Polygonen (Rechtecke, Parallelogramme, Trapeze, etc).
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

16.06.2016, 11:30

Bitte nicht ohne Kontext zitieren. Das bezog sich auf die "Center"-Property. Die "Linke Obere Ecke" bezog sich eindeutig auf Rechtecke. Rechtecke sind keine beliebigen Vierecke.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Zipfelpilz

unregistriert

9

16.06.2016, 13:21

Mit Origin meint ihr jetzt aber den geometrischen Ursprung und nicht die Software von EA, oder? Und wo bitte ist "links oben", in welchem Bezugssystem?

Wie dem auch sei, es gibt keinen einheitlichen Standard. Also wäre es vermutlich das Beste, wenn du die für dich geeignetste Repräsentation wählst und dann auf die verschiedenen Render-Systeme übersetzt, wie schon von Sacaldur beschrieben.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

16.06.2016, 13:31

Ok, da es anscheinend nicht ersichtlich war:
Würde man das auf andere Formen übertragen wollen
... was wir hier ja nicht tun, weil wir über Rechtecke reden. [...]

Bei undefinierten Vierecken (ja, sie dürfen sich bei einem Viereck überkreuzen!) sogar noch mehr als bei konvexen Polygonen (Rechtecke, Parallelogramme, Trapeze, etc).



Mit Origin meint ihr jetzt aber den geometrischen Ursprung und nicht die Software von EA, oder?
Ja, dürfte soweit anhand des Kontext ersichtlich sein.
Und wo bitte ist "links oben", in welchem Bezugssystem?
Das bezieht sich auf unrotierte Rechtecke bzw. allgemein auf 2D Formen. "Links" und "oben" sind dabei eindeutig, wodurch "obere linke Ecke" bei einem unrotierten Rechteck eindeutig auf eine bestimmte Ecke des Rechtecks verweist.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige