Dreiecke

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Dreiecke

Beitrag von FritziFoppel » Mo Apr 01, 2013 2:46 pm

Nachdem ich mal wieder Zeit gefunden und mit C++ angefangen habe, bin ich auf ein "Problem" gestoßen.
Ich hab mir gedacht, das ich mich am Anfang mal ein bisschen an den Membern und Methoden versuche, um den Einstieg zu finden.
Meine Idee (die sich allerding ziemlich ans Tutorial orientiert):
- 2 Klassen: 1 für Punkte, 1 für ein Dreieck aus 3 Punkten

zu meinem eigentlichen Problem:
In meiner Klasse für das Dreieck, hab ich eine Methode, zur Bestimmung des Flächeninhaltes, eingefügt. Allerdings soll die Funktion natürlich für jede Art für Dreieck gelten. Ich benötige zur Berechnung die Breite und Höhe (width, height).
Für die Breite brauch ich den höchsten und den niedrigsten x-Wert. Der Absolute Wert aus der Differenz müsste dann die Breite sein.
Für die Höhe genau das gleiche nur mit den y-Werten.

Meine Überlegung:
- wobei xA, yA; usw. die Punkte A, B, C beschreiben

Code: Alles auswählen

if((xA > xB) && (xA > xC))
    {
        if(xB > xC)
        {
            int width = abs(xA - xC);
        }

        else
        {
            int width = abs(xA - xB);
        }
    }

    else if((xB > xA) && (xB > xC))
    {
        if(xA > xC)
        {
            int width = abs(xB - xC);
        }

        else
        {
            int width = abs(xB - xA);
        }
    }

    else
    {
        if(xA > xB)
        {
            int width = abs(xC - xB);
        }

        else
        {
            int width = abs(xC - xA);
        }
    }

    if((yA > yB ) && (yA > yC))
    {
        if(yB > yC)
        {
            int height = abs(yA - yC);
        }

        else
        {
            int height = abs(yA - yB);
        }
    }

    else if((yB > yA) && (yB > yC))
    {
        if(yA > yC)
        {
            int height = abs(yB - yC);
        }

        else
        {
            int height = abs(yB - yA);
        }
    }

    else
    {
        if(yA > yB)
        {
            int height = abs(yC - yB);
        }

        else
        {
            int height = abs(yC - yA);
        }
    }
Da mir der Code ein wenig "lang" erscheint und ich nur die 3 Punkte (entsprechend bei einem Viereck, oder Fünfeck würde sich der Code um einige Zeilen erweitern) hab nun meine Frage:
Gibt es eine Möglichkeit diesen Abschnitt ein wenig kürzer zu gestalten bzw. eine Funktion die mir die größte bzw. kleinste Zahl angibt.

sebix
Beiträge: 82
Registriert: Mo Nov 19, 2012 8:27 pm

Re: Dreiecke

Beitrag von sebix » Mo Apr 01, 2013 2:56 pm

Um das Maximum oder das Minimum 2er Zahlen zu erhalten, kannst du die min() und max() Funktionen der STL verwenden:

Code: Alles auswählen

#include <algorithm>
using namespace std;

int main () {
    cout << max (3, 4) << endl; // 4
    cout << min (3, 4) << endl; // 3
    cout << max (3, max(4, 5)) << endl; // 5
    cout << min (3, min(0, 5)) << endl; // 0
    return 0;
}
Wenn du mit dynamischen Strukturen der STL arbeitest, kannst du bspw. auch min_element verwenden.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Dreiecke

Beitrag von cloidnerux » Mo Apr 01, 2013 3:03 pm

Deine Methode wird nicht Funktionieren, da mit der Breite nicht irgendeine Distanz gemeint ist, sondern die Länge der Grundseite, auf die du dich beziehst. Die Höhe ist dementsprechend die Distanz zur Grundseite zum gegenüberliegenden Punkt.
Eine Möglichkeit ist mit Vektoren zu Arbeiten. Der Betrag des Kreuzprodukt zweier Vektoren entspricht dem Flächeninhalt des beschriebenen Vierecks. Die Hälfte davon entspricht also dem Flächeninhalt deines Dreiecks.
http://de.wikipedia.org/wiki/Kreuzprodukt
Das Kreuzprodukt ist aber erstmal nur in R^3 Definiert. Das kann man aber adaptieren, indem man sagt, dass a3 = b3 = 0 ist.
Du bildest also die Differenzvektoren von einem Ausgangspunkt zu den beiden Anderen und Berechnest das Kreuzprodukt mit a3 = b3 = 0.
Es ergibt sich

Code: Alles auswählen

vn = (0 0 a1*b2 - a2*b1)^T  
Und der Betrag ergibt sich zu

Code: Alles auswählen

|vn| = a1*b2 - a2*b1
Das Halbieren und der Flächeninhalt deines Dreiecks ergibt sich zu:

Code: Alles auswählen

A = 1/2 * a1*b2 - a2*b1
Wenn also deine Punkte A, B und C sind, ergibt sich:

Code: Alles auswählen

a1 = B.x-A.x
a2 = B.y - A.y
b1 = C.x - A.x
b2 = C.y - A.y
Damit ist also die Formel:

Code: Alles auswählen

A = 1/2 * (B.x-A.x)*(C.y - A.y)-(B.y - A.y)*(C.x - A.x)
Redundanz macht wiederholen unnötig.
quod erat expectandum

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Dreiecke

Beitrag von FritziFoppel » Mo Apr 01, 2013 3:39 pm

Danke für die Antworten.
Mir war klar das diese Länge der Grundseite nicht gleich der Breite ist. Durch die Verschiebung nach oben bzw. unten wird die "Grundseite" ja länger. Das Beispiel sollte nur eine Näherunslösung sein, trotzdem Danke!

Antworten