So, nachdem ich nun den letzten geometry namespace mal in Aktion erleben konnte (baue gerade an einem kleinen Gameserver), war ich von der performance ein wenig enttäuscht. Das hat mich dann zu dem Entschluss gebracht, das ganze nochmal komplett neu zu designen und diesmal hoffentlich in eine finale Form zu bringen
Es passt daher eigentlich ganz gut, dass der letzte Eintrag hier auch über den geometry namespace handelt, aber eben in seiner alten Form.
Die neue Philosophie ist nun das templating statt der Polymorphie. Ich bin zu dem Schluss gekommen, dass Polymorphe Formen und Flächen ja ganz schön und gut sind (hat sich super handlen lassen) aber es praktisch einfach eine Ebene zu früh für die Polymorphie ist. Wir befinden uns hier auf einer Ebene, auf der es noch sehr auf Geschwindigkeit und Optimierung an kommt und dort hat sich die alte Herangehensweise als nicht optimal herausgestellt. Ich will hier nicht sagen, dass es grundsätzlich eine schlechte Idee ist, Polymorphe Flächen zu nutzen, allerdings sollte das eben durch entsprechende Wrapper Klassen erreicht werden und nicht schon an der Wurzel so funktionieren.
Soweit so gut:
Die beiden Klassen Point und Size sind nahezu unberührt geblieben und 1:1 übernommen worden. Die Klasse LineSegmen ist nun auch keine derived Class mehr, genauso die beiden Klassen Rectangle und Circle (ja, Triangle fehlt immer noch...).
Statt nun aber das Interface aller Klassen mit Methoden - wie z.B. contains, intersects oder overlaps - vollzumüllen, habe ich mich für ein externes handling dieser Algorithmen entschieden. D.h. der geometry namespace stellt verschiedene freie template Funktionen zur Verfügung (contains, intersects, overlaps...) die, je nach Funktionsweise, nur Flächen (type trait "IsArea") oder sonstige Objekte entgegen nimmt. D.h. meine gewünschte Funktionalität verschiedene Flächen miteinander kombinieren zu können ist weiterhin erhalten geblieben, lediglich die Syntax hat sich ein klein wenig verändert.
Ich habe dann auch einen kleinen Test laufen lassen, der mir gezeigt hat, dass die template Variante in etwa 40% performanter ist als die polymorphe (bei einer kleinen Liste von 100 Objekten die gegenseitig auf overlaps untersucht wurden).
Das war es dann auch schon wieder von meiner Front. Ich beabsichtige jetzt tatsächlich den namespace so beizubehalten
Dokumentation
Source
PS: Ich meine mit final natürlich nicht, dass ich komplett fertig bin, sondern dass das System, wie es jetzt ist, so bleiben soll. Es fehlen noch die ein oder anderen Kombinationen und auch Funktionen.