OpenGL draw an equilateral Triangle

Hallo,
ich mache besser ein eigenes Thema auf, und hab nichts dazu im Internet gefunden. Ich möchte ein gleichseitiges Dreieck malen, und dessen Koordinaten bestimmen. Mein Versuch:

float[] vertices = new float[]{
    +0.0f, +(float) Math.sin(Math.toRadians(90)) * 10f, +0.0f, // Top coordinate
    -(float) Math.cos(Math.toRadians(45)) * 10f, -(float) Math.sin(Math.toRadians(45)) * 10f, +0.0f, // Bottom-left coordinate
    +(float) Math.cos(Math.toRadians(45)) * 10f, -(float) Math.sin(Math.toRadians(45)) * 10f, +0.0f // Bottom-right coordinate
};

funktioniert nicht, und ich weiß nicht, wieso. Das Dreieck ist gleichschenklig, aber nicht gleichseitig.

1 Like

Ganz einfach: Erstelle ein gleichseitiges n-Eck, und setze dann n=3 :nerd:

Nein, im Ernst: Es ist so. Die Eckpunkte des Dreiecks liegen auf einem Kreis. Und zwar bei 0°, 120° und 240°. Schnell aus dem Kopf (d.h. ungetestet) hingeschrieben könnte man sowas machen wie

private static float cornerX(double angleDeg, double distance) {
    return (float)Math.cos(Math.toRadians(angleDeg)) * distance;
}
private static float cornerY(double angleDeg, double distance) {
    return (float)Math.sin(Math.toRadians(angleDeg)) * distance;
}
double distance = 10.0;
float vertices[] = {
    cornerX(  0, distance), cornerY(  0, distance), 0.0f,
    cornerX(120, distance), cornerY(120, distance), 0.0f,
    cornerX(240, distance), cornerY(240, distance), 0.0f,
};

Das könnte man natürlich beliebig verbessern und verallgemeinern, um dann tasächlich so eine Funktion zu haben wie

private static float[] createNgonCorners(
    int n, double distance, double rotationAngle) { ... }

@Marco13 , ich hab zwischenzeitlich eine Problemsanimation erstellt (startet alle 10 Sek. neu):

http://buxtehude.esy.es/webgl1.html

Ich probiere jetzt deinen Vorschlag …


Kann ich die anderen zwei Beiträge aus dem anderen Thema zu der gleichen Frage entfernen, damit es übersichtlich bleibt?


Dankeschön, damit funktioniert es. Es ist wichtig, für die 1. Komponente auch cornerX( 0, distance) aufzurufen. Das Ergebnis kann man jetzt in der Demo sehen, wenn man die Seite aktualisiert.