Umlaufsinn eines Dreiecks

Vulpecula

Commander
Registriert
Nov. 2007
Beiträge
2.249
Moin moin!

Ich hab mich mal im Netz auf die Suche gemacht, um Code zu finden, der mir den Umlaufsinn eines Dreiecks bestimmen kann.

Dabei bin ich über folgendes gestolpert:


Code:
#define COUNTER_CLOCKWISE 0
#define CLOCKWISE 1

/*
 * Return either clockwise or counter_clockwise for the orientation of the polygon.
 */
 
int orientation(n,v)
    int n;            /* Number of vertices */
    vertex v[];       /* The vertex list */
{
    float area;
    int i;

    /* Do the wrap-around first */
    area = v[n-1].x * v[0].y - v[0].x * v[n-1].y;

    /* Compute the area (times 2) of the polygon */
    for (i = 0; i < n-1; i++)
        area += v[i].x * v[i+1].y - v[i+1].x * v[i].y;

    if (area >= 0.0)
        return COUNTER_CLOCKWISE;
    else
        return CLOCKWISE;
}
/* End of orientation */

Allerdings bin ich ein wenig skeptisch... Was hier gerechnet wird bzw. werden soll ist zwar verständlich (auch wenn der Code etwas aussagekräftiger sein könnte...), aber mich wundert die FOR-Schleife.

Mal angenommen ich möchte mit der Funktion ein einzelnes Dreieck überprüfen. Dann übergebe ich die Parameter "3" (ein Dreieck hat ja nur drei Vertices) und eine Liste (bzw. ein Array, whatever...) mit den drei Vertices. Die Liste sollte doch von 0 bis 2 laufen, aber beim letzten Durchlauf der Schleife wird aus "i+1" doch eine 3 und das Programm würde mit einem Fehler aussteigen, oder habe ich was verpasst? :rolleyes:

MfG - Vulpecula
 
Naja die Schleife durchläuft alle Indizes von 0 bis kleiner als n - 1, d.h. von i = 0 bis i = n - 2.
Daher ist i + 1 = n - 1 = 2. Es passt also.
 
Du hast recht... ich hab aus irgend einem Grund (:freak:) als Abbruchbedingung die ganze Zeit "<=" im Kopf gehabt. Aber da steht ja nunmal was anderes. :D
 
Sieht aber schwer nach Computergrafik aus....
Soweit ich es noch kenne hat man falsch rum gezeichnete Polygone gar nicht gesehen, außer man macht Berechnungen für Beidseitigkeit an. Wozu dann solche Funktionen, bremst die Sache doch total aus.
 
Zuletzt bearbeitet von einem Moderator:
Falls du nur mit zweidimensionalen Dreiecken (also nur x/y-Komponente) hantierst, kannst du auch einfach die z-Komponente des Kreuzprodukts zweier Richtungsvektoren des Dreiecks berechnen. Bei entsprechender Wahl der Vektoren sollte für CCW ein negativer Wert herauskommen, für CW ein positiver.

Bisschen weniger Rechenaufwand, falls das in irgendeiner Weise eine Rolle spielt ;)
 
Man kann es auch mit Logik Bruteforce berechnen :>
Ob CW oder CCW wird doch allein dadurch entschieden wo der zweite Vektor liegt, also die Startrichtung in die man geht. X1 > X2 ... dann...usw. Eine Subtraktion sollte auch Klarheit verschaffen.
 
Zuletzt bearbeitet von einem Moderator:
@rob-
Zum Zweck: was aber macht man, wenn man die Normale benötigt, diese einem aber beispielsweise vom CAD-Program nicht mitgegeben wird. Oder man die Primitiven exportieren möchte und die Normalen erstmal berechnen muss?

Zur Subtraktion: das geht nicht so einfach. Egal wie x1 und x2 zueinander stehen wird keine Aussage über x3 gemacht. Durch den 3t Vektor entscheidet sich aber erst der Umlaufsinn.

Beispiel:
(0,0), (1,0), (0, 1) -> Gegen den Uhrzeigersinn
(0,0), (1,0), (0, -1) -> Mit dem Uhrzeigersinn
 
Jo, es geht um Computergrafik. Ich möchte mittels JavaFX einen Polyeder anzeigen, der aus Polygonen (Dreiecke) zusammengesetzt wird. Dazu bekomme ich die einzelnen Vertices und i.d.R. auch die Flächennormale. Allerdings: Ich kann mich nicht darauf verlassen, dass die Normale immer korrekt berechnet wurde und es kann passieren, dass die Vertices eines Polygons eben nicht CCW (math. Umlaufsinn) angeordnet sind sondern mal so und mal so. CullFace.FRONT und BACK könnte man machen, was allerdings ebenfalls den Rechnenaufwand ansteigen lässt (JavaFX ist, zumindest was 3D anbelangt, leider mal eeecht scheiße. Leider MUSS es damit umgesetzt werden.) . Von daher ist es fast egal, ob ich beide Seiten render, oder eine Methode drüberlaufen lasse, die mir im Zweifelsfall das Polygon auf links zieht.
 
Zuletzt bearbeitet:
Ist das wieder irgendein überflüssiger Schabernack von einem Dozenten ? ^^
Man kann sich auch nicht permanent einen Schutzhelm anziehen, nur weil man stürzen könnte :>
 
Zurück
Oben