Berechnung der Schnittpunkte zweier Kreise



  • Hallo,

    ich habe in C# ein Programm zur Berechnung der Schnittpunkte zweier Kreise geschrieben und kann den Fehler nicht finden.
    Als Grundlage nehme ich die Kreisgleichungen:

    (x-x1)^2 + (y-y1)^2 = r1^2
    (x-x2)^2 + (y-y2)^2 = r2^2

    [code="cs"]

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace CircleXYR
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void cmdBerechnung_Click(object sender, EventArgs e)
    {
    double p1x = Convert.ToDouble(this.kreis1x.Text);
    double p1y = Convert.ToDouble(this.kreis1y.Text);
    double r1 = Convert.ToDouble(this.kreis1r.Text);

    double p2x = Convert.ToDouble(this.kreis2x.Text);
    double p2y = Convert.ToDouble(this.kreis2y.Text);
    double r2 = Convert.ToDouble(this.kreis2r.Text);

    double abc = Math.Sqrt((p2x - p1x)(p2x - p1x) + (p2y - p1y)(p2y - p1y));

    if (abc < 0.01)
    {
    this.ausgabeBerechnung.Text = "Die Kreismittelpunkte sind gleich";

    }
    else
    {
    double t1 = (p1y - p2y) / (p2x - p1x);
    double t2 = (p2x * p2x - p1x * p1x + p2y * p2y - p1y * p1y + r1 * r1 - r2 * r2 ) / (2 * p2x - 2 * p1x);
    double a = t1 * t1 + 1.0;
    double b = 2.0 * t1 * t2 - 2.0*t1*p1x - 2.0 * p1y;
    double c = t2 * t2 - 2.0 * t2 * p1x + p1x * p1x + p1y * p1y - r1 * r1;

    double resp1y = (-b + Math.Sqrt(b * b - 4.0 * a * c)) / (2.0 * a);
    double resp2y = (-b - Math.Sqrt(b * b - 4.0 * a * c)) / (2.0 * c);
    double resp1x = resp1y * t1 + t2;
    double resp2x = resp2y * t1 + t2;

    string ausgaberesp1x = Convert.ToString(resp1x);
    string ausgaberesp2x = Convert.ToString(resp2x);
    string ausgaberesp1y = Convert.ToString(resp1y);
    string ausgaberesp2y = Convert.ToString(resp2y);

    this.listBox1.Items.Add("else mit den Punkten: P1 ( " + kreis1x.Text + " / " + kreis1y.Text + " )" + "P2 ( " + kreis2x.Text + " / " + kreis2y.Text + " )");
    this.listBox1.Items.Add("Schnittpunkt 1 (" + ausgaberesp1x + " / " + ausgaberesp1y + " )");
    this.listBox1.Items.Add("Schnittpunkt 2 (" + ausgaberesp2x + " / " + ausgaberesp2y + " )");
    }

    }

    private void button1_Click(object sender, EventArgs e)
    {
    DialogResult Ende = MessageBox.Show("Wollen Sie das Programm wirklich beenden?",
    "Programm beenden",
    MessageBoxButtons.YesNoCancel,
    MessageBoxIcon.Warning,
    MessageBoxDefaultButton.Button1);

    if (Ende == DialogResult.Yes)
    {
    MessageBox.Show("Programm wird beendet!");

    this.Close();
    }
    else if (Ende == DialogResult.No)
    {
    MessageBox.Show("Programm-Ende abgebrochen!");
    }
    }
    }
    }

    Hoffe da kann mir jemand weiterhelfen bei dem Problem. Vielen Dank schon mal!
    Gruß
    twosteps



  • twosteps schrieb:

    Hallo,

    ich habe in C# ein Programm zur Berechnung der Schnittpunkte zweier Kreise geschrieben und kann den Fehler nicht finden.

    Hi,

    verrätst Du uns auch wie sich der Fehler äußert oder möchtest Du das lieber für Dich behalten? :p



  • Oh sry, das hab wohl vergessen ... 😮

    Die Berechnung vom Abstand wird richtig ausgeführt, jedoch sind die Schnittpunkte nur manchmal richtig.

    Bei der ersten Berechnung von
    P1(12,5/6) mit r1=3
    P2(18/6) mit r2=3
    erhalte ich als Schnittpunkte
    S1(15,25/7,19895) und
    S2(15,25/0,1389). S1 ist richtig, bei S2 stimmt nur der erste Wert (12,25).
    Richtig wäre S2(15,25/4,8).

    Bei der zweiten Berechnung von
    P1(10/10) mit r1=2
    P2(13/12) mit r2=2
    erhalte ich als Schnittpunkte
    S1(11,019/11,721) und
    S2(18,776/0,0853). S1 ist fast richtig, S2 ist komplett falsch.
    Richtig wäre S2(10/12,2).

    Vielen Dank für die schnelle Antwort! 🙂

    Gruß
    twosteps



  • double resp2y = (-b - Math.Sqrt(b * b - 4.0 * a * c)) / (2.0 * c);
    

    Das sollte wohl 2.0*a im Nenner heißen.



  • na sowas, ... hab ich total übersehen 🙂 .
    Vielen Dank!!! Es funktioniert.


Log in to reply