Entwickler-Ecke

Sonstiges (Delphi) - Kreuzung ermitteln


Ice - Di 25.02.03 13:33
Titel: Kreuzung ermitteln
Hallo Leute,

mit folgendem Quelltext:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
function TMath.Collision(P1,P2,PW1,PW2:TPointS;Anzahl:integer):boolean;//funktion zum ermitteln ob Wand im Weg steht oder nicht
var
 y1,y2,m1,n1,m2,n2:extended;
 x1,x2 : integer;
begin
 result := false;
 zaehl := 0;
 if (P2.x-P1.x) = 0 then
   m1 := (P2.Y-P1.Y)/0.00001
 else
   m1 := (P2.Y-P1.Y)/(P2.X-P1.X)
 n1 := P1.Y-m1*P1.X;
 if (PW2.X-PW1.X) = 0 then
  m2 := (PW2.Y-PW1.Y)/0.00001
 else 
  m2 := (PW2.Y-PW1.Y)/(PW2.X-PW1.X);
 n2 := PW1.Y-m2*PW1.X;// Werte ermittelt (m und n) anhand y = mx + n
 for x1 := 1 to Anzahl do 
begin
   for x2 := 1 to Anzahl do 
 begin
     y1 := m1*x1+n1;//ermitteln der y - Werte
     y2 := m2*x2+n2;
     if(y1=y2)and(x1=x2)then // wenn x,y-Werte identisch sollen Punkte gespeichert werden
      begin
       result := true;
       zaehl := zaehl+1;
       SaveWall(zaehl,PW1,PW2);
      end
     else
       result := false;
    end;
  end;
end;


versuche ich herauszufinden wen sich zwei gedachte Wände kreuzen und versuche diese dann abzuspeichern,
nur leider funktioniert das nicht .... :cry:
sieht einer von euch den fehler?

Vielen dank schonmal im voraus..

mfg
Ice

Moderiert von user profile iconKlabautermann: Code-Tags hinzugefügt.


Ex0rzist - Di 25.02.03 17:24

Ist Anzahl ausreichend groß?
Weil es vorkommen kann, dass der einzige Schnittpunkt der Wände sich genau zwischen zwei X-Werten befindet und somit unbetrachtet bleibt.

Ich nehme mal, dass es sich hierbei um die Anzahl der Punkte handelt, die du untersuchst, oder?

Anstatt alle möglichen Punkte abzusuchen - die bei nichtganzzahligen Koordinaten-Werten enorm viele sind (genauer gesagt unendlich viele) - würde ich die beiden Geradengleichungen (als Vektoren) gleichsetzen.

Ich hoffe mal, dass dir das weiterhilft.


Christian S. - Di 25.02.03 20:21

Ex0rzist hat vollkommen recht. Du setzt die Gleichung der beiden Geraden gleich und verwendest zur Lösung der Gleichung in beiden Formeln das selbe x. Also: m1*x+n1 = m2*x+n2

Folgendes musst Du noch prüfen:
(1) ist m1=m2? Wenn ja, muss n2=n1 sein, damit die beiden Geraden gleich sind, ist n2<>n1 haben die beiden keinen Schnittpunkt

(2) ist die Gerade "senkrecht" handelt es sich nicht mehr um eine Funktion. Hier muss irgendein x-Wert der einen mit irgendeinem x-Wert der anderen übereinstimmen. Dann sind die beiden Wände gleich, ansonsten haben sie keinen Schnittpunkt.

MfG,
Peter


Ice - Mi 26.02.03 09:59

:) Alles klar vielen Dank für eure Antworten, hat mir sehr geholfen.

mfg
Ice