Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   allgemeine Gleichung von Schnitpunkten 2er Kreise ? (https://www.delphipraxis.net/44881-allgemeine-gleichung-von-schnitpunkten-2er-kreise.html)

Kedariodakon 26. Apr 2005 12:03


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`?

Kedariodakon 26. Apr 2005 12:34

Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Past das schon mal so, oder hab ich mich verrechnet?

shmia 26. Apr 2005 12:36

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:
  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');
nicht berücksichtigt ist, wenn der Mittelpunkt eine Kreises im anderen Kreis liegt.

Kedariodakon 26. Apr 2005 12:56

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:

Kedariodakon 26. Apr 2005 14:29

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:

Jasocul 26. Apr 2005 14:56

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.

Kroko1999 26. Apr 2005 14:59

Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
 
Delphi-Quellcode:
  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;
liefert die Schnittpunkte im 1.Quadranten, ansonsten Vorzeichen der Wurzel für P.Y ändern!

viel Spaß


//EDIT: Optimierungen sind absichtlich weggelassen :)

Kedariodakon 26. Apr 2005 15:02

Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
 
Ich teste das mal ^^

gordon freeman 26. Apr 2005 15:45

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

ibp 26. Apr 2005 15:58

Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
 
Zitat:

Zitat von gordon freeman
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 Martin Skrodzki

dann löse Dein Ergebnis doch mal nach y auf....

Khabarakh 26. Apr 2005 16:29

Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
 
[ups]

Kedariodakon 26. Apr 2005 16:35

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:
    y

    |
    |
 ----+---- X
    |
    | Hier ^^
    |
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???

Kroko1999 26. Apr 2005 17:06

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.

Kedariodakon 27. Apr 2005 12:42

Re: allgemeine Gleichung von Schnitpunkten 2er Kreise ?
 
Zitat:

Zitat von Kroko1999
Hier meine komplette Testunit:
...

Das ging :)

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