Laden...

Flächeninhalt zwischen 3 Punkten ausrechnen

Erstellt von v3nom vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.803 Views
V
v3nom Themenstarter:in
2 Beiträge seit 2012
vor 12 Jahren
Flächeninhalt zwischen 3 Punkten ausrechnen

Hallo zusammen!
Ich möchte den Flächeninhalt zwischen 3 beliebigen 2-dimensionalen Punkten ausrechnen.
Hierzu bestimme ich zunächst den Winkel zwischen 2 Seiten (Schnittwinkel Berechnen)) und die Länge der Seiten und berechne dann damit den Flächeninhalt (Flächeninhalt berechnen).

Nun bekomme ich aber je nachdem welchen Punkt ich als erstes eingebe verschiedene Werte.
also Flaeche(A,B,C) = Flaeche(A,C,B) != Flaeche(B,A,C) != Flaeche(C, A, B)
Wie kann das sein, wo ist mein Denkfehler? 🤔

Hier meine Funktion:


        private double Flaeche(PointF A, PointF B, PointF C)
        {
            //winkel alpha zw. AB und AC bestimmen
            double m1 = B.Y - A.Y / B.X - A.X; //steigung m1
            double m2 = C.Y - A.Y / C.X - A.X; //steigung m2
            double alpha = Math.Atan(Math.Abs((m1 - m2) / (1 + m1 * m2)));
            //länge der seiten ab/ac berechnen
            double ab = Math.Sqrt(Math.Pow(A.X - B.X,2) + Math.Pow(A.Y - B.Y,2));
            double ac = Math.Sqrt(Math.Pow(A.X - C.X,2) + Math.Pow(A.Y - C.Y,2));
            //flächenberechnung 
            double flaeche = 0.5 * ac * ab * Math.Sin(alpha);
            return flaeche;
        }

Kann mir jemand auf die Sprünge helfen?

A
1 Beiträge seit 2012
vor 12 Jahren

Hi,

also ich würde Klammern setzen bei m1 und m2.
(B.Y - A.Y) / (B.X - A.X)
Punktrechnung geht vor Strichrechnung so hab ich das mal gelernt.

V
v3nom Themenstarter:in
2 Beiträge seit 2012
vor 12 Jahren

Danke! 👍 Was ein Anfängerfehler. X(

hier der verbesserte Code, der noch den Fall abdeckt, dass eine der Steigungen zufällig 0 ist. (Könnte man wahrscheinlich auch eleganter lösen)


        private double Flaeche(PointF A, PointF B, PointF C)
        {
            //winkel alpha zw. AB und AC bestimmen (de.wikipedia.org/wiki/Schnittwinkel_%28Geometrie%29)
            //wenn eine der beiden steigungen unendlich ist (senkrecht), dann muss man einen anderen winkel sein, 
            //in einem (nicht degeneriertem) dreieck kann es nicht vorkommen, dass die steigungen aller seiten unendlich sind.
            if (((B.X - A.X) == 0) || ((C.X - A.X) == 0)){
                if ((B.X - C.X) == 0)
                    //alle drei punkte liegen auf einer gerade -> die fläche ist 0
                    return 0;
                else
                    return Flaeche(B, C, A);
            }
            double m1 = (B.Y - A.Y) / (B.X - A.X); //steigung m1
            double m2 = (C.Y - A.Y) / (C.X - A.X); //steigung m2
            double alpha = Math.Atan(Math.Abs((m1 - m2) / (1 + m1 * m2))); //winkel alpha
            //länge der seiten ab/ac berechnen
            double ab = Math.Sqrt(Math.Pow(A.X - B.X,2) + Math.Pow(A.Y - B.Y,2));
            double ac = Math.Sqrt(Math.Pow(A.X - C.X,2) + Math.Pow(A.Y - C.Y,2));
            //flächenberechnung nach de.wikipedia.org/wiki/Dreiecksfl%C3%A4che#Zwei_Seitenl.C3.A4ngen_und_eingeschlossener_Winkel_gegeben
            double flaeche = 0.5 * ac * ab * Math.Sin(alpha);
            return flaeche;
        }
5.657 Beiträge seit 2006
vor 12 Jahren
Hinweis von herbivore vor 12 Jahren

Die Formel in diesem Beitrag ist falsch. Korrektur siehe die folgenden Beiträge.

Hi v3nom,

so gehts noch einfacher:

			public static double Area(Point p0, Point p1, Point p2)
			{
				return (p0.x * (p1.y - p2.y) + p1.x * (p2.y - p0.y) + p2.x * (p0.y - p1.y)) * 0.5;
			}

Nun bekomme ich aber je nachdem welchen Punkt ich als erstes eingebe verschiedene Werte.
also Flaeche(A,B,C) = Flaeche(A,C,B) != Flaeche(B,A,C) != Flaeche(C, A, B)
Wie kann das sein, wo ist mein Denkfehler? 👶

Wenn du die Punkte im Uhrzeigersinn abarbeitest, kommt ein negativer Wert dabei heraus, wenn du sie gegen den Uhrzeigersinn abarbeitest, ein positiver. Beide Werte haben aber den gleichen Betrag.

Christian

// Edit: Klammer vergessen, Anfängerfehler passieren jedem mal 😃

Weeks of programming can save you hours of planning

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo MrSparkle,

die Formel kann irgendwie nicht hinhauen. Wenn man alle drei Punkte gleichmäßig in X-Richtung verschiebt, ändert sich dadurch die Fläche nicht. Das würde sie aber laut deiner Formel tun.

herbivore

5.657 Beiträge seit 2006
vor 12 Jahren
Hinweis von herbivore vor 12 Jahren

Die Formel in diesem Beitrag ist falsch. Korrektur siehe die folgenden Beiträge.

Hi herbivore,

stimmt, die Gleichung heißt ((p1 - p0) x (p2 - p0)) / 2, wobei "x" für das Kreuzprodukt steht. Also müßte die Formel so aussehen:


public static double Area(Point p0, Point p1, Point p2)
{
		return ((p1.X - p0.X) * (p2.Y - p0.Y)) - ((p2.X - p0.X) * (p1.Y - p0.Y)) * 0.5;
}

Christian

Weeks of programming can save you hours of planning

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo MrSparkle,

das kann irgendwie immer noch nicht hinkommen.

Area (new Point (0,0), new Point (1,1), new Point (2,2)) liefert 1 und nicht 0.

Und Area (new Point (0,0), new Point (1,1), new Point (2,0)) liefert etwas anderes als Area (new Point (1,1), new Point (0,0), new Point (2,0)), obwohl nur die Reihenfolge der Punkte vertauscht ist.

herbivore

1.346 Beiträge seit 2008
vor 12 Jahren

Jetzt aber:


        static double Area(double x1, double y1, double x2, double y2, double x3, double y3)
        {
            return 0.5 * ((y3 + y1) * (x3 - x1) + (y2 + y3) * (x2 - x3) - (y2 + y1) * (x2 - x1));
        }

1.361 Beiträge seit 2007
vor 12 Jahren

Hi,

die letzte Formel stimmt an sich. Ich wuerde aber dennoch ein Math.Abs(...) noch mit einbauen.

Da Dreiecke auch nur Polygone sind, greift hier eben die wunderschoen einfache Formel zur Polygon-Flaechenberechnung.

beste Gruesse
zommi