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

tnecniv

Treue Seele

  • »tnecniv« ist der Autor dieses Themas

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

1

15.12.2006, 20:53

sechsecke

Hi!
Ich hab so eine art map, wo jedes gebiet durch ein sechseck dargestellt wird.
die sechsecke ergeben so eine vollständig geschlossene fläche.
wenn ich nun ein neues gebiet hinzufüge identifiziere ich es über eine x und eine y koordinate. die verices verschiebe ich dann relativ zu diesem punkt.
das funktioniert alles wunderbar, nur will ich jetzt abfragen auf welches sechseck ich klicke, wenn ich denn klicke. dazu berrechne ich einen schnittpunkt mit der ebene, auf der sich die sechsecke befinden und dem mouseray(oder so..). wie bekomm ich jetzt die x und y koordinate aus dem schnittpunkt?irgendwie krieg ich das nicht hin...
Gruß Vincent

/\/\/\
| | | |
\/\/\/
.| | | usw..
/\/\/
programmiert mit tribase
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

16.12.2006, 12:02

Also, alle deine 6-Ecke befinden sich in einer Ebene. Jeder Punkt dieser Ebene ist definiert durch:

P = O + x * X + y * Y

Die Vektoren X und Y (Richtungsvektoren) sind nicht parallel zueinander und spannen die Ebene auf. Der Vektor O (als Ortsvektor interpretiert) definiert einen Punkt in der Ebene. (x, y) sind dann die Koordinaten des Punktes in dieser Ebenendarstellung.

Normalerweise wird man für deinen Fall für O den Nullpunkt und für X und Y die X- respektive Y-Achse nehmen. In diesem Fall bekommst du deine Ebenenkoordinaten einfach dadurch, dass du die z-Koordinate des Schnittpunktes ignorierst. Für den allgemeinen Fall setzt du einfach den Punkt in der Gleichung oben ein und löst nach x und y auf.

Bisher waren das alles noch die Zeichenkoordinaten für deine Vertizes. Kniffliger wird es dann, aus diesen Ebenen-Koordinaten wieder an die richtigen logischen Koordinaten des 6-Eck zu kommen, das um den gefundenen Punkt liegt. Dazu muss man aber wissen, wie die logische Nummerierung der Felder ist.

Vermutlich bist du dicht an der Karo-Struktur, also Zeilenweise und Spalten im "Zickzack" untereinander.

Als erstes sucht man sich die Zeile n raus, in der der Punkt liegt. Der Abstand der oberen und unteren Ecke deines 6-Eck definiert die Höhe jeder Zeile. Da es Überlappungen zwischen diesen Zeilen gibt -- die 6-Ecke sind ja verzahnt -- muss das nicht unbedingt eindeutig sein. Es reicht, wenn man die erste Zeile nimmt, die man findet.

Dann berechnet man m, indem von der x-Koordinate in der Ebene der Zeilenoffset(n) abgezogen und dann durch die Breite (Abstand zweier gegenüberliegender Seiten) eines 6-Eck geteilt wird.

Wenn der Punkt im Kernbereich der Zeile liegt (ohne Dreieck oben und unten), ist man schon fertig. (Dann war auch die Zeile eindeutig zu bestimmen) und die logische Koordinate ist (m, n).

Sonst war das der Überlappungsbereich oben oder unten. Ich beschreibe das jetzt nur für den Bereich oben, unten gilt das aber analog (Blos der Zeilenindex des Nachbarn ist n + 1).

Liegt der Ebenenpunkt links von der Mitte des 6-Eck (m, n), kommt als zweites 6-Eck nur (m, n - 1) in Frage. Der Punkt liegt in dem 6-Eck, dessen Mittelpunkt dichter liegt.

Liegt der Ebenenpunkt rechts von der Mitte des 6-Eck (m, n), kommt als zweites 6-Ecke nur (m + 1, n - 1) in Frage.


Ich gebe zu, das liest sich recht kompliziert, wenn man das als Text liest, aber mit ein paar Zeichnungen wird das sofort klarer.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

tnecniv

Treue Seele

  • »tnecniv« ist der Autor dieses Themas

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

3

17.12.2006, 13:55

wow...
ich hätt ehrlich gesagt nicht gedacht, dass jemand mein problem so schnell durchschaut!
ich danke vielmals, das war echt eine hilfe!
Danke!
Gruß Vincent
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

4

18.12.2006, 06:44

Hehe,

ich hab sowas schonmal selbst gemacht (vor langer Zeit), da wusste ich noch in etwa, womit ich zu kämpfen hatte.

Lass doch mal hören, ob das am Ende auch gut funktioniert. Ich habe das einfach so aus dem Kopf aufgeschrieben (mit wenigen kleinen Bleistiftzeichnungen auf alten Briefumschlägen)

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

tnecniv

Treue Seele

  • »tnecniv« ist der Autor dieses Themas

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

5

21.12.2006, 15:56

Ich hab jetzt leider keine zeit vor weihnachten mehr das noch richtig auszuprobieren. aber soweit ich mir das klar machen konnte klingt es logisch...
Ich geb bescheid, wenn ichs drinn hab!
Gruß Vincent
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

Werbeanzeige