Hallo,
Wer behauptet denn, das double-Berechnungen langsam sind?.
Musst Du die Daten so gigantisch übergeben?.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| type
tKoor = record x, y :integer end;
tStrecke = record P1, P2: tKoor; end; function LineIntersect(const S1,S2:tStrecke,var S:tkoor;):boolean; |
Vielleicht hilft es durch tauschen von P1,P2 dafür zu sorgen, das P1 immer den linken Punkt darstellt.Also immer P1.x<P2.x
Wenn
S1.P2.x < S2.P1.x //S1 liegt rechts von S2
oder
S1.P1.x > S2.P2.x //S1 liegt links von S2
ist schon Schluss
jetzt das selbe indem man jetzt dafür sorgt, das P1 immer den unteren Punkt darstellt.
Wenn
S1.P2.y < S2.P1.y //S1 liegt unterhalb von S2
oder
S1.P1.y > S2.P2.y //S1 liegt oberhalb von S2
ist schon wieder Schluss.
Sonst Verschiebst du alle Punkte , also Ursprungsverschiebung P(0,0)-> P0(?,?)
P0.X = Min(x aller Punkte ) und wenn das nicht hilft P0.x = (Max(x aller Punkte)-Min(x aller Punkte)) Div 2
analog für y.
p1-> p1 - p0
Sei P0.x= Min(x aller Punkte ) und zufällig Cx1
c1 := a1*cX1 + b1*cY1; wäre dann
c1 := a1*0 + b1*(cY1-CX1); Wenn sich alles in einem Quadranten abspielt wird es also kleiner
Am Ende addierst Du P0 auf die Lösung und hast die Koordinaten wieder zurück geschoben
Gruß Horst
EDIT:
Du willst ja eine große Menge an Strecken verarbeiten.
Dann musst Du den Ansatz ändern.
Suche mal nach plane sweep schnittpunkt
www.informatik.uni-l...G_WS08-09/AG_2.2.pdf
www.ads.tuwien.ac.at...a/mmgdv/k3___003.htm