Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Koordinatensystem und Rects

  Alt 12. Mai 2014, 20:43
Ich sehe es eher umgekehrt, man sollte sich in Teilen der Mathematik und im Alltag abgewöhnen, bei 1 anzufangen zu zählen (ich meine das natürlich nur halb ernst, es ist in unseren Köpfen und der Sprache zu etabliert um es zu ändern). In der Algorithmenvorlesung wurden hier z.B. aus irgendwelchen Gründen Heaps mit 1-basierten Arrays gezeigt. Mit 0-basierten Arrays wären die Formeln im allgemeinen viel kürzer gewesen... und das ist nicht selten so. Eigentlich ist es willkürlich bei 1 anzufangen, bei 0 erscheint es mir logischer.

Der einzige Vorteil, wenn man bei 1 anfängt zu zählen, ist, dass der Index vom letzten Element = die Anzahl der Elemente ist. Aber das ist in der Praxis, finde ich, nicht so ein großer Vorteil und dafür hat man Nachteile, die überwiegen.

Und was im eindimensionalen gilt, gilt im mehrdimensionalen erst recht. Wie SMO schon schrieb, würde auch ich schon rein intuitiv nie das obere linke Pixel mit (1,1) bezeichnen, sondern immer mit (0,0).

Aber abgesehen davon wäre vieles tatsächlich umständlicher mit einem Ursprung in (1,1). Bei Grafikschnittstellen, die über die Fähigkeiten der GDI herausgehen, ist es etwa üblich, wenn man z.B. ein Objekt gedreht oder an einen anderen Ort zeichnen möchte, das Koordinatensystem zu transformieren. Man könnte sich als Beispiel das Zeichnen eines Buttons vorstellen. Dazu schreibt man sich eine Routine, die einen Button immer achsenparallel in den Bereich zwischen (0.0, 0.0) und (1.0, 1.0) zeichnet (wobei die Koordinaten aber relativ sind). Wenn man jetzt einen Button mit den Ausmaßen 50*20 zeichnen will, dann setzt man vor dem Aufruf der Routine einfach eine Transformationsmatrix, die alle Y-Koordinaten um den Faktor 20 und alle X-Koordinaten um den Faktor 50 streckt. Und wenn man den Button woanders als in den Ursprung zeichnen will, dann setzt man eine Transformationsmatrix, die zu X und Y jeweils einen bestimmten Wert addiert, etc. – so kann man auch Drehungen, Spiegelungen und Kombinationen aus allem umsetzen. Zurück zu unserem Button: Wenn die Routine von (0,0) als Ursprung ausgeht, ist das alles ziemlich einfach – wenn man dagegen von (1.0, 1.0) nach (2.0, 2.0) gezeichnet hätte, würde auch der „Offset“ mitgestreckt und man müsste dann wieder was abziehen etc., und falls die Routine wiederum eine verschachtelte Zeichenroutine aufruft, dann würde mit jeder Rekursionsebene der Ursprung eins weiter nach unten rechts rücken, und man müsste vor jedem Funktionsaufruf daran denken, ihn erst eins nach links oben zu verschieben, damit es sich wieder aufhebt etc., mit anderen Worten, es wäre ein totaler Rückschritt.

Geändert von Namenloser (12. Mai 2014 um 20:57 Uhr)
  Mit Zitat antworten Zitat