![]() |
allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Ich suche gerade ne allgemeine gleichung zur Berechunng, ich weiß, dass ne Kreisgleichung wie folgt aussieht:
(X-Mx)² + (Y-My)² = R² da ich 2 habe macht das: 1: (X-M1x)² + (Y-M1y)² = R1² 2: (X-M2x)² + (Y-M2y)² = R2² Wie komm ich nun auf die dumme Quadratische Gleichung? um zu den 2, 1 oder garkeinen Punkt zu kommen und alle, falls sie gleich sind ^^ Da ich das allgemein brauch, peil ich schon gar net mehr durch :wall: Ich steh irgendwie mächtg aufm Schlauch, man das is so lang her ^^ Mag wer helfen`? |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Liste der Anhänge anzeigen (Anzahl: 1)
Past das schon mal so, oder hab ich mich verrechnet?
|
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
[quote="Kedariodakon"]Ich suche gerade ne allgemeine gleichung zur Berechunng, ich weiß, dass ne Kreisgleichung wie folgt aussieht:
(X-Mx)² + (Y-My)² = R² da ich 2 habe macht das: 1: (X-M1x)² + (Y-M1y)² = R1² 2: (X-M2x)² + (Y-M2y)² = R2² Wie komm ich nun auf die dumme Quadratische Gleichung? um zu den 2, 1 oder garkeinen Punkt zu kommen und alle, falls sie gleich sind ^^ [quote] * Alle Punkte sind gleich, wenn der Mittelpunkt und der Radius beider Kreise gleich ist. * es gibt genau einen gemeinsamen Punkt, wenn der Abstand der Mittelpunkte gleich der Summe oder Differenz beider Radien ist:
Delphi-Quellcode:
nicht berücksichtigt ist, wenn der Mittelpunkt eine Kreises im anderen Kreis liegt.
mabstand := SQRT((M1x-M2x)^2+(M1y-M2y)^2); // Abstand der Mittelpunkte
if mabstand = R1+R2 then ShowMessage('Berührung; 1 Punkt') else if mabstand < R1+R2 then ShowMessage('2 Schnittpunkte') else ShowMessage('keine Schnittpunkte'); |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Liste der Anhänge anzeigen (Anzahl: 2)
Nu bin ich so weit und steh voll aufm Schlauch, ich komm einfach net zu der Quadratischen gleichung der For: x²+p*x+q=0
So weit bin ich nun schon: (ich hoffe das past ^^) Na klasse und nu will der Formeleditor net werter machen, weil die Formael zu groß ist... So ein sch***.... Edit: Ok ich glaub ich hab es, wär nett, wenn da mal jemand rüberschauen könnte, ich werd das mal in Code umwandeln, mal schaun obs past :zwinker: |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Ok passt mal gar nicht, bei
M1( 414 ; 248 ) M2( 414 ; 5 ) R1 = 243 R2 = 2 * R1 * Sin( 36° ) ~ 285,66363261 gibts bei meiner Formel ne 0er Division :wall: Und das auch verständlicher weise :nerd: Weiter gehts :coder: |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Ich erinnere mich dunkel, dass wir damals eine Koordinatenverschiebung verwendet haben.
Dadurch wurde (X-M1x)^2 zu M1x^2 und entsprechend bei M2x. Das ist aber schon lange her. Schlag mich also nicht, wenn der Ansatz nicht ganz korrekt ist. Der Grundgedanke war, einen Term zu vereinfachen. |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Delphi-Quellcode:
liefert die Schnittpunkte im 1.Quadranten, ansonsten Vorzeichen der Wurzel für P.Y ändern!
TPunkt = record
X,Y: real; end; TKreis = record Mx,My: Integer; R: Word; end; procedure Kreisschnittpunkte (AK1,AK2: TKreis; var P1,P2: TPunkt); var A1,C1,F1, A2,C2,F2, A,C,F, Ha,Hb,Hc,P,Q,D: Real; begin P1.X := NAN; //keine Lösung P2.X := NAN; //keine Lösung // x²+ax+b+y²+cy+d=e A1 := -2*AK1.Mx; C1 := -2*AK1.My; A2 := -2*AK2.Mx; C2 := -2*AK2.My; // x²+ax+y²+cy=f f=e-b-d F1 := Sqr(AK1.R)-Sqr(AK1.Mx)-Sqr (AK1.My); F2 := Sqr(AK2.R)-Sqr(AK2.Mx)-Sqr (AK2.My); // x²+ax+y²+cy-f=x²+ax+y²+cy-f // nach Y umstellen C := (C1-C2); A := (A2-A1)/C; F := (F1-F2)/C; // y= ax+f // in Kreis 1 einsetzen Ha := Sqr(A)+1; Hb := A1+2*A*F+C1*A; Hc := Sqr(F)+C1*F-F1; // Normalform P := Hb/Ha; Q := Hc/Ha; // lösen D := Sqr(P/2)-Q; if D>0 then begin P1.X := -P/2-Sqrt(D); P2.X := -P/2+Sqrt(D); P1.Y := +Sqrt(Sqr(AK1.R)-Sqr(P1.X-AK1.Mx))+AK1.My; P2.Y := -Sqrt(Sqr(AK2.R)-Sqr(P2.X-AK2.Mx))+AK2.My; end else if Math.IsZero(D,1E-08) then begin P1.X := -P/2; P1.Y := Sqrt(Sqr(AK1.R)-Sqr(P1.X-AK1.Mx))+AK1.My; end; end; viel Spaß //EDIT: Optimierungen sind absichtlich weggelassen :) |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Ich teste das mal ^^
|
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Liste der Anhänge anzeigen (Anzahl: 2)
Hab mich mal drangemacht:
Das sind die allgemeinen Herleitungen für die Koordinaten der Schnittpunkte, wenn die Koordinaten der Mittelpunkte M und die Radien bekannt sind. Hoffe, das es das ist, was du brauchst. mfg |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Zitat:
|
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
[ups]
|
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
irgendwie geht gar nix :pale:
@Kroko1999 ich seh bei dem code mal gar nicht durch, nur berechnet der mir was falsches irgendwie zumindest... Als ifo ich bewege mich im 2ten Quadranten, sprich:
Code:
Ich brauch das um was darzustellen, aber aufm Bildschirm ist ja (0;0) net unten links (vom 1 Quadranten aus gesehen), sondern oben links, darum nehm ich die y-Koordinaten vorher mal -1 und nach der berechnung wieder mal -1, vielleicht liegt ja auch da der Fehler???
y
| | ----+---- X | | Hier ^^ | |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Hier meine komplette Testunit:
Delphi-Quellcode:
unit unitTestKreis;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Buttons, StdCtrls; type TVektor2D = record X,Y: Extended; end; TKreis2D = record M: TVektor2D; R: Extended; end; TForm1 = class(TForm) PaintBox1: TPaintBox; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure PaintBox1Paint(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); private { Private-Deklarationen } FCircle: Boolean; Kreis1, Kreis2: TKreis2D; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} uses Math; const coMx = 300; coMy = 300; procedure Kreisschnittpunkte (AK1,AK2: TKreis2D; var P1,P2: TVektor2D); var A1,C1,F1, A2,C2,F2, A,C,F, Ha,Hb,Hc,P,Q,D: Real; begin P1.X := NAN; //keine Lösung P2.X := NAN; //keine Lösung // x²+ax+b+y²+cy+d=e A1 := -2*AK1.M.X; C1 := -2*AK1.M.Y; A2 := -2*AK2.M.X; C2 := -2*AK2.M.Y; // x²+ax+y²+cy=f f=e-b-d F1 := Sqr(AK1.R)-Sqr(AK1.M.X)-Sqr (AK1.M.Y); F2 := Sqr(AK2.R)-Sqr(AK2.M.X)-Sqr (AK2.M.Y); // x²+ax+y²+cy-f=x²+ax+y²+cy-f // nach Y umstellen C := (C1-C2); A := (A2-A1)/C; F := (F1-F2)/C; // y= ax+f // in Kreis 1 einsetzen Ha := Sqr(A)+1; Hb := A1+2*A*F+C1*A; Hc := Sqr(F)+C1*F-F1; // Normalform P := Hb/Ha; Q := Hc/Ha; // lösen D := Sqr(P/2)-Q; if D>0 then begin P1.X := -P/2-Sqrt(D); P2.X := -P/2+Sqrt(D); P1.Y := +Sqrt(Sqr(AK1.R)-Sqr(P1.X-AK1.M.X))+AK1.M.Y; P2.Y := -Sqrt(Sqr(AK2.R)-Sqr(P2.X-AK2.M.X))+AK2.M.Y; end else if Math.IsZero(D,1E-08) then begin P1.X := -P/2; P1.Y := Sqrt(Sqr(AK1.R)-Sqr(P1.X-AK1.M.X))+AK1.M.Y; end; end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin with PaintBox1.Canvas do begin Brush.Color := clInfoBk; FillRect (PaintBox1.ClientRect); if FCircle then begin Brush.Style := bsClear; Pen.Color := ClRed; Ellipse (Round (coMx+Kreis1.M.X-Kreis1.R), Round (coMy+Kreis1.M.Y-Kreis1.R), Round (coMx+Kreis1.M.X+Kreis1.R), Round (coMy+Kreis1.M.Y+Kreis1.R)); Pen.Color := ClBlue; Ellipse (Round (coMx+Kreis2.M.X-Kreis2.R), Round (coMy+Kreis2.M.Y-Kreis2.R), Round (coMx+Kreis2.M.X+Kreis2.R), Round (coMy+Kreis2.M.Y+Kreis2.R)); Pen.Color := clBlack; MoveTo (coMx,0); Lineto (coMx,PaintBox1.Height); Moveto (0,coMy); LineTo (PaintBox1.Width,coMy); end; end; end; procedure TForm1.SpeedButton1Click(Sender: TObject); begin FCircle := True; PaintBox1.Invalidate; end; procedure TForm1.FormCreate(Sender: TObject); begin Kreis1.M.X := 100; Kreis1.M.Y := 100; Kreis1.R := 80; Kreis2.M.X := 200; Kreis2.M.Y := 120; Kreis2.R := 60; end; procedure TForm1.SpeedButton2Click(Sender: TObject); var P1,P2: TVektor2D; begin Kreisschnittpunkte (Kreis1,Kreis2,P1,P2); Label1.Caption := FloatToStr (P1.X); Label2.Caption := FloatToStr (P1.Y); with PaintBox1.Canvas do begin Pen.Color := clGReen; MoveTo (0,coMy+Round(P1.Y)); LineTo (PaintBox1.Width,coMy+Round(P1.Y)); MoveTo (coMx+Round(P1.X),0); LineTo (coMx+Round(P1.X),PaintBox1.Height); end; Label3.Caption := FloatToStr (P2.X); Label4.Caption := FloatToStr (P2.Y); with PaintBox1.Canvas do begin Pen.Color := clPurple; MoveTo (0,coMy+Round(P2.Y)); LineTo (PaintBox1.Width,coMy+Round(P2.Y)); Moveto (coMx+Round(P2.X),0); Lineto (coMy+Round(P2.X),PaintBox1.Height); end; end; end. |
Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
Zitat:
Hast bestimmt beim umstellen der Typen nen Fehler eingebaut :zwinker: Aber da ich die Berechnung nicht wirklich verstanden hab, konnt ich den auch net finden :angel2: Danke :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 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-2025 by Thomas Breitkreuz