Entwickler-Ecke

Sonstiges (Delphi) - Kleines Matheproblem - 2


Aya - Mo 25.11.02 03:16
Titel: Kleines Matheproblem - 2
Hi,

user defined image

Gegeben sind die X und Y Koordinaten von A,B,C,D,P1,P2.

Wie bekomme ich raus ob sich P1 bzw. P2 innerhalb des Rechteckes befinden???

Au'revoir,
Aya


Anonymous - Mo 25.11.02 09:55

Ist das ein Matheproblem oder Programmtechnisches Problem? Für das eine Braucht man Formeln für das andere gibts Funktionen.


Delete - Mo 25.11.02 12:35

@Popov: PtInRect läßt sich nur auf ein nicht gedrehtes Rechteck anwenden. Falls du das mit
Zitat:

andere gibts Funktionen.

meinst.

Mein Vorschlag wäre das ganze zu drehen und dann OtInRect darauf anwenden. Wie man Punkte dreht, haben wir ihr ja lang und breit erklärt.


Anonymous - Mo 25.11.02 13:00

Luckie hat folgendes geschrieben:
@Popov: PtInRect läßt sich nur auf ein nicht gedrehtes Rechteck anwenden. Falls du das mit
Zitat:

andere gibts Funktionen.

meinst.


Nein, ich meinte PtInRegion. Hab es zwar noch nicht angewand,


Quelltext
1:
function PtInRegion(Rgn: HRgn; X, Y: Integer): Bool;                    


sieht aber nicht viel anders aus wie PtInRect. Das einzig komplizierte wird das Erstellen der Region sein. Obwohl so kompliziert ist das auch nicht.

PS: Ich sollte dir Bescheid sagen.


Aya - Mo 25.11.02 17:30

Hi,

es ist ein Mathematisches Problem.. das ganze dann in Delphi reinzubekommen ist kein problem

Und ich weiß das es eigentlich ne recht einfache Formel ist, denn früher im Mathe unterricht haben wir mal irgendwie sowas gemacht, nur ich erinner mich kein bisschen mehr daran.... :oops:

Au'revoir,
Aya

PS: Die sache mit dem, das ich alles drehe bis es gerade steht geht zwar sicherlich, aber ist nicht die beste lösung.... :)


OregonGhost - Mo 25.11.02 20:32

Das ist relativ einfach. Du musst für jede der Seiten überprüfen, auf welcher Seite davon der Punkt liegt. Liegt er bei allen auf der Innenseite, liegt er auch im Rechteck. Und das geht so, für jede Seite:

1. Seite in Gerade umwandeln, und zwar in Parameterform:
g1: x = s + p1 * r1
Dabei ist s für die erste Gerade A, für die zweite B etc.
r1 ist dann (B-A), (C-B) etc.
2. Senkrechten Vektor zu Vektor r1 finden (Punktprodukt):
cos(90°) = 0 = (r1 * r2) / (|r1| * |r2|)
Dabei gilt: Zähler muss 0 sein, damit das ganze 0 ist.
3. Gerade in Parameterform erstellen, die r2 als Richtungsvektor und P als Stützvektor hat:
g2: x = P + p2 * r2
4. Schnittpunkt g1 g2 berechnen:
s + p1 * r1 = P + p2 * r2
5. Wenn du immer im Uhrzeigersinn gehst, wird der Parameter p2 immer positiv oder negativ sein für den Schnittpunkt. Das musst du mal ausprobieren, davon ist dann abhängig, auf welcher Seite der Geraden der Punkt P liegt.

user defined image

Im R³ wird's übrigens einfacher, weil man r2 entweder schon hat (wenn man die Ebenen als Normalenform hat) oder direkt aus dem Kreuzprodukt der beiden Richtungsvektoren bekommt.


Aya - Mo 25.11.02 20:39

Danke :)