Einzelnen Beitrag anzeigen

AlexanderVieth

Registriert seit: 17. Aug 2009
Ort: Düren
13 Beiträge
 
Delphi 2010 Professional
 
#1

Schnittpunkte von Strecken

  Alt 25. Aug 2009, 16:17
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.
  Mit Zitat antworten Zitat