Ergebnis 1 bis 6 von 6

Thema: Punkt zwischen 4 Geraden ? (PB)

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #2
    auch wenn du das problem schon geloest hast ... irgendwie sieht mir das recht kompliziert aus ^^

    Ich hab mich mal ran gemacht und das ganze ueber eine Koordinatentransformation mit 2D Vektoren geloest ...

    Eine Raute wird ja ueber zwei Vektoren aufgespannt, ausgehend vom gleichen Startpunkt SS ... nennen wir sie E und F

    Wenn ich nun wissen will, ob der Mauspunkt (x,y) in der raute liegt, ist das einzige, was ich tun muss, die Mousekoordinaten in Koordinaten des Koordinatensystems, das durch E,F aufgespannt wird umwandeln (natuerlich muss das nicht rechtwinklig sein, sind also keine karthesischen koordinaten)

    Da der Maximal moegliche Punkt, der noch in der Raute liegt genau durch E+F gebildet wird (also der Punkt, der dem Ursprung gegenueber liegt) und der in den reformierten koordinaten natuerlich den Punkt (1,1) ausmacht, koennen wir einfach sagen, wenn die reformierten Mauskoordinaten fuer x und y zwischen 0 und 1 liegen, ist der Punkt in der Raute ....

    Noch ein kurzer Kommentar zu meiner Nomenklatur ...
    * Punkte mit zwei Grossbuchstaben sind in globalen kartesischen Koordinaten (also im allgemeinen Pixelkoordinaten)
    * Punkte mit einem Grossbuchstaben sind relativ zum neuen Ursprung SS
    * Die zwei Komponenten eines Punktes haben die Indices x bzw y
    * a,b sind die Koordinaten im nicht kartesischen Koordinatensystem, aufgespannt durch E,F mit Ursprung SS

    so ... nun zur Rechnung ...
    Die Raute wird durch die Punkte SS, PE und PF aufgespannt. Die Maus ist im Punkt PM. zuerst ueberfuehren wir die Koordinaten so, dass SS im Ursprung liegt durch eine einfache Translation.
    Code:
    Ex=PEx-SSx; Ey=PEy-SSy; // der eine Vektor der die Raute aufspannt
    Fx=PFx-SSx; Fy=PFy-SSy; // der zweite Vektor, der die Raute aufspannt
    Mx=PMx-SSx; My=PMy-SSy; // die Mausposition relativ zu SS
    Nun rechnen wir die Mauskoordinaten ins Koordinatensystem E,F um
    Code:
    a=(Mx*Fy-My*Fx)/(Ex*Fy-Ey*Fx); // Neue Mausposition entlang E
    b=(My*Ex-Mx*Ey)/(Ex*Fy-Ey*Fx); // Neue Mausposition entlang F
    Und nun die einfache Ueberpruefung ..
    Code:
    If a>=0 and a<=1 and b>=0 and b<=1 then .... // Maus ist in der Raute
    hoffe, du kannst damit was Anfangen .... zur Not geb ich dir auch die Herleitung der Formeln ^_____^

    So ists zumindest um einiges Uebersichtlicher ... eventuell kannst du dir in deinem konkreten Fall sogar viele Berechnungen Sparen, da du ja nur eine Map hast und deren Vektoren (relativ zum Ursprung) ja kennst.

    Das ganze ist nicht nur viel uebersichtlicher als die Geradenvariante, sondern bietet auch noch ein paar Vorteile ...

    A) Es ist egal, wie die Punkte SS,PE und PF liegen, die Raute wird immer korrekt aufgespannt.
    Es gilt immer: M = a*E + b*F bzw PM = a*E + b*F + SS ... daran aendert sich auch nichts, wenn die Vektoren z.B. negative Komponenten enthalten (z.B. wenn du das Koordinatensystem von rechts nach links laufen laesst), dann sind a und b trotzdem noch positiv, wenn die Maus in der Raute liegt.

    B) Solltest du deine Map mit vielen kleinen Rauten aufbauen (wie es bei isometrischer Ansicht ja meist der Fall ist) brauchst du als Raute nicht die Ganze Map angeben, sondern nur eine der kleinen Rauten. Dann bekommst du durch die umgerechneten Mauskoordinaten sofort raus, in welcher Raute sich die Maus befinet, indem du einfach die Nachkommastellen abschneidest ... und dann erhaellst du Beispielsweise dritte Raute nach rechts und zweite raute nach oben als Ergebnis (was sich sehr gut macht, wenn du die Rauten in einem 2D Array verwaltest). Dann musst du natuerlich nicht auf <=1 sondern auf <=MaxAnzahlAnRautenProAchse testen

    Hoffe, das dir das vielleicht etwas weiter hilft

    Gruss Ineluki

    Geändert von Ineluki (13.02.2004 um 23:05 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •