AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schnittpunkte von Strecken

Offene Frage von "AlexanderVieth"
Ein Thema von AlexanderVieth · begonnen am 25. Aug 2009 · letzter Beitrag vom 26. Aug 2009
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz