Seite 1 von 1

Dreiecke

Verfasst: Mo Apr 01, 2013 2:46 pm
von FritziFoppel
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.

Re: Dreiecke

Verfasst: Mo Apr 01, 2013 2:56 pm
von sebix
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.

Re: Dreiecke

Verfasst: Mo Apr 01, 2013 3:03 pm
von cloidnerux
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)

Re: Dreiecke

Verfasst: Mo Apr 01, 2013 3:39 pm
von FritziFoppel
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!