Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Schnittpunkt Linie vs. Kreis (https://www.delphipraxis.net/131499-schnittpunkt-linie-vs-kreis.html)

Namenloser 2. Mai 2009 05:05

Re: Schnittpunkt Linie vs. Kreis
 
Zitat:

Zitat von Uwe Raabe
Zitat:

// Gerade: P0 Punkt auf der Geraden, m: Steigung
Und wie gibt man damit eine Senkrechte an?

Indem man trickst und das Koordinatensystem um 90° dreht (so habe ich es gemacht, s.o.).

Draos 2. Mai 2009 11:21

Re: Schnittpunkt Linie vs. Kreis
 
Oder man hat mal was in Mathe von Analytik gehört und löst das Problem über Vektoren.

k: [vx-vm]²=r²

g: vx=vn+s*va

mit
vm.. Ortsvektor des Kreismittelpunktes
vn.. Stützvektor der Geraden
va.. Richtungsvektor der Geraden


1. Gleichsetzten der beiden Gleichungen
2. Umformen nach s (ensteht quadratische Gleichung, maximal 2 Werte oder auch keine Lösung falls Wurzelwert<0)
3. Einsetzen von s in g bringt die Ortsvektoren der Punkte

Nikolas 2. Mai 2009 14:27

Re: Schnittpunkt Linie vs. Kreis
 
Zitat:

Oder man hat mal was in Mathe von Analytik gehört und löst das Problem über Vektoren.
Oder man hat wirklich etwas von Analysis mitbekommen und weiss, das Vektoren in den Bereich der Algebra fallen.

Zitat:

[vx-vm]²=r²
meinst du vielleicht |vx-vm|=r^2 ?

3_of_8 2. Mai 2009 14:57

Re: Schnittpunkt Linie vs. Kreis
 
Jep, Analytik ist Chemie. :mrgreen:

(Der Ansatz über Vektoren führt aber im Endeffekt auch zum gleichen Ergebnis)

(Und wenn mans ganz genau nimmt, sind reelle Zahlen auch Vektoren, von daher ist der ursprüngliche Ansatz auch über Vektoren :lol: )

Draos 2. Mai 2009 15:40

Re: Schnittpunkt Linie vs. Kreis
 
1. Analytik war bei uns immer kurzform von Analytische Geometrie.

2. Entweder die Form
k: [vx-vm]²=r² oder die
k: |vx-vm|=r. Deine wäre falsch

Dipl Phys Ernst Winter 3. Mai 2009 12:36

Re: Schnittpunkt Linie vs. Kreis
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Und wie gibt man damit eine Senkrechte an?
Vielen Dank für diesen Einwand.

m:= 1e99 würde zwar das Problem lösen, ist aber nicht eingebbar.

Gerade mit Punkt und Steigung war zwar das Einfachste, ist aber ein Fehlgriff. Ich habe das Programm abgeändert auf Gerade durch zwei Punkte.

3_of_8 3. Mai 2009 12:46

Re: Schnittpunkt Linie vs. Kreis
 
Naja, bei einer senkrechten Gerade/Strecke ist der Fall doch trivial.
Es sei eine Strecke/Gerade [P1P2]/P1P2 gegeben durch die Punkte P1(x1|y1), P2(x2,y2) und ein Kreis k(M,r) mit dem Mittelpunkt M(xm,ym). Es gelte x1=x2.

Delphi-Quellcode:
dx := x1-xm;
disc := r*r-dx*dx;
if disc > 0 then
begin
  setlength(result, 2);
  result[0].X := x1;
  result[0].Y := ym + sqrt(disc);
  result[1].X := x1;
  result[2].Y := ym - sqrt(disc);
end
else if disc = 0 then
begin
  setlength(result, 1);
  result[0].X := x1;
  result[0].Y := ym;
end;
Die Schnittpunkte werden in result zurückgegeben.

(Bei einer Strecke muss man noch überprüfen, ob die gefundenen Schnittpunkte auch wirklich zwischen P1 und P2 liegen, da reicht die Überprüfung ((resultY <= y1) and (resultY >=y2)) or ((resultY >= <1) and (resultY <= y2)) )


Ich habe bisher alle Probleme dieser Art (z.B. Billardsimulation, Dreiecksaufgabe beim BWINF) so gelöst (Betrachtung als Funktion für x1!=x2, ansonsten Sonderfallbehandlung als senkrechte Gerade) und es funktioniert prima.

Xeridar 15. Okt 2012 18:16

AW: Re: Schnittpunkt Linie vs. Kreis
 
Ich grab mal diesen uralten Beitrag für eine Korrektur aus, da das einer der führenden Treffer in der Suche ist bei passenden Stichworten.

Zitat:

Zitat von Medium (Beitrag 896178)
Delphi-Quellcode:
// M : Mittelpunkt des Kreises
// r : Kreisradius
// A : Stützpunkt der zu schneidenden Strecke/Gerade
// V : Richtungsvektor der Strecke/Gerade (Wenn diese aus 2 Punkten A und B gebildet ist, ist dies B-A)
// U : Hilfsvektor
// p, q, d, x1, x2 : Hilfsvariablen (Skalare, keine Vektoren)

  U := A-M;
  p := U*V;
  q := U^2 - r^2;
  d := p^2 - q;

  if d < 0 then
    Kein_Schnittpunkt
  else
  begin
    d := sqrt(d / |V|);
    x1 := -p + d;
    x2 := -p - d;
  end;

  if (x2>x1) and (x1>0) then
    Schnittpunkt := A + x1*V
  else
  if (x1>x2) and (x2>0) then
    Schnittpunkt := A + x2*V
  else
    Kein_Schnittpunkt_Oder_Schnitt_Hinter_A;

Ich war zu faul zum selber rechnen, also hab ich Onkel Google gefragt, bin hier gelandet und dachte mir "hey, schön, fertiger Code zum übernehmen... ist zwar delphi statt java, aber ist ja selbsterklärend".

Ja, das funktioniert allerdings nicht ganz.

Hab jetzt doch selbst gerechnet und möchte das hier eben anmerken:
Das Problem liegt in diesen Zeilen:
Delphi-Quellcode:
p := U*V;
q := U^2 - r^2;
d := p^2 - q;
d := sqrt(d / |V|);
|V| soll wohl die quadrierte euklidische Norm sein, also V.x*V.x + V.y*V.y
Das ist elegant geschrieben, denn die Terme tauchen in der Rechnung wirklich als Nenner bei sowohl p als auch q auf.
So wie es hier geschrieben ist wird |V| aber nicht mit quadriert bei der Berechnung von "p*p - q". Außerdem müsste auch die Berechnung von x1 bzw. x2 dadurch falsch sein, wenn |V|!=1.

Delphi-Quellcode:
p := U*V / |V|;
q := (U^2 - r^2) / |V|;
d := p^2 - q;
d := sqrt(d);
Auf diese Lösung komme ich und das wirft auch ganz andere (und erwartete) Ergebnisse in meinem Programm.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz