Hallo Allezusammen.
Ich versuche eine function zu schreiben, die Schnittpunkte von Strecken ermittelt (und ob sie sich überhaupt schneiden, da die strecken ja begrenzt lang sind),
und einen kleinen Bogen einzeichnet (um den schnittpunkt).
Ich erhalte aus einer anderen procedure einen Array, der Punktepaare enthält, d.h. auf Array[0].A befindet sich Punkt A und auf Array[0].B befindet sich Punkt B.
Die Punkte besitzen jeweils X und Y koordinaten.
Mein Problem ist jetzt folgendes:
Der Array ist nur begrenzt gefüllt, da für jede linie die neu gezeichnet wird, überprüft wird ob sie eine bereits gezeichnete Linie schneidet. Wenn ja, soll ein brückchen darüber gezeichnet werden (Canvas.Arc).
Aus Mathematischer sicht habe ich noch ein Problem, und zwar, den Sonderfall einer Senkrechten und einer Horizontalen strecke. so erhalte ich eine Divison durch 0 und somit einen Fehler.
Das hier habe ich bis jetzt:
Delphi-Quellcode:
function CheckCross(Canvas: TCanvas;LinArr: Array of TLine; Run: Integer): boolean;
var
t, s, A, B, C, D, E, F, G, H: real;
i: Integer;
VRun, VNorm, Vi, ViN: TVector;
OVA, OVB, OVM: TPoint;
begin
if Run <= 2 then
begin
Result := False;
exit;
end else
begin
for i := Run - 1 downto 0 do
begin
VRun := VRoute(GetVector(LinArr[Run].A),GetVector(LinArr[Run].B));
VNorm := Normalize(VRun);
Vi := VRoute(GetVector(LinArr[i].A),GetVector(LinArr[i].B));
A := GetVector(LinArr[Run].A).X;
B := GetVector(LinArr[Run].A).Y;
C := VRun.X;
D := VRun.Y;
E := GetVector(LinArr[i].A).X;
F := GetVector(LinArr[i].A).Y;
G := VRoute(getvector(LinArr[i].A), getvector(LinArr[i].B)).X;
H := VRoute(getvector(LinArr[i].A), getvector(LinArr[i].B)).Y;
if ((H*C)-(G*D)) <> 0 then
s := ((G * (B - F)) - (H * (A - E))) / ((H*C)-(G*D))
else
exit;
if (s < 1) and (s > 0) then
begin
OVM.X := round(GetVector(LinArr[Run].A).X + s * VRun.X);
OVM.Y := round(GetVector(LinArr[Run].A).Y + s*VRun.Y);
OVA := GetPoint(Add(GetVector(OVM), (mult(VNorm, -20))));
OVB := GetPoint(Add(GetVector(OVM), (mult(VNorm, 20))));
Canvas.LineTo(OVA.X, OVA.Y);
Canvas.Arc(OVM.X - 20, OVM.Y - 20, OVM.X + 20, OVM.Y + 20, OVA.X, OVA.Y, OVB.X, OVB.Y);
Canvas.MoveTo(OVB.X, OVB.Y);
LinArr[Run].A := OVB;
end;
end;
end;
end;
LinArr stellt meinen Array von Punktepaaren dar, (Array of TLine)
Run steht für die nummer der linie die ich gerade zeichne
Ich wäre dankbar für schnelle hilfe.