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?
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.
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;
}
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
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
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
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
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));
}
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