Bonjour

Petit problème de trigonométrie pour le week-end.
Dans mon code, j'ai 2 sphères que je veux joindre par un cylindre. Le calcul de mon angle est correct, le calcul de la distance de mon cylindre semble aussi correct à la console mais à la visualisation, mon cylindre est trop court !
Voici mon code complet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
 
import java.awt.event.MouseWheelEvent;
import javax.media.opengl.GLAutoDrawable;
import javax.swing.*;
 
import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;
 
import com.sun.opengl.util.GLUT;
import java.awt.Point;
import java.awt.event.MouseWheelListener;
import javax.media.opengl.*;
 
public class Test extends JFrame{
 
    GLJPanel canvas;
 
    public Test(){
        super();
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        canvas = new GLJPanel();
        canvas.addGLEventListener(new Renderer(this));
        this.getContentPane().add(canvas);
        canvas.requestFocusInWindow();
        this.setPreferredSize(new java.awt.Dimension(800, 600));
        this.setMinimumSize(new java.awt.Dimension(800, 600));
    }
 
    public void refresh(){
        canvas.updateUI();
    }
 
    public static void main(String[]args){
        new Test().setVisible(true);
    }
 
}
 
class Renderer implements GLEventListener, MouseWheelListener{
 
    private float zoom = 1;
    private final float zoom_inc = 0.05f;
    private final float c = 0.025f;
    private Test mw;
 
    public Renderer(Test test){
        this.mw = test;
    }
 
    public void init(GLAutoDrawable arg0) {
        GL gl = arg0.getGL();
        GLUT glut = new GLUT();
 
        float ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
        float diffuse[] = { 0.0f, 0.0f, 1.0f, 1.0f };
        float diff_pos[] = {0, 0, zoom, 0f};
        float amb_pos[] = {zoom, zoom, zoom, 0f};
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, ambient, 0);
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, diff_pos, 0);
        gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, diffuse, 0);
        gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, amb_pos, 0);
 
        gl.glFrontFace(GL.GL_CW);
        gl.glEnable(GL.GL_LIGHTING);
        gl.glEnable(GL.GL_LIGHT0);
        gl.glEnable(GL.GL_LIGHT1);
        gl.glEnable(GL.GL_AUTO_NORMAL);
        gl.glEnable(GL.GL_NORMALIZE);
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glDepthFunc(GL.GL_LESS);
 
        gl.glShadeModel(GL.GL_SMOOTH); // Enable Smooth Shading
        gl.glClearColor(1f, 1f, 1f, 1f);
        gl.glClearDepth(1.0f);
 
        arg0.addMouseWheelListener(this);
    }
 
    public void display(GLAutoDrawable arg0) {
        float mat[] = new float[4];
        GL gl = arg0.getGL();
        GLUT glut = new GLUT();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
 
        gl.glTranslatef(0, 0, -5f * zoom);
 
        gl.glPushMatrix();
        mat[0] = (float) 0;
        mat[1] = (float) 0;
        mat[2] = (float) 0;
        mat[3] = 1.0f;
        gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, mat, 0);
        mat[0] = (float) 0;
        mat[1] = (float) 0;
        mat[2] = (float) 1;
        gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, mat, 0);
        Point p1 = new Point(-1, 1);
        Point p2 = new Point(1, -1);
        Point p1p = new Point(-1, -1);
        gl.glTranslatef(-1f, 1f, 0);
        glut.glutSolidSphere(c*2, 40, 32);
        gl.glTranslatef(1f, -1f, 0);
        gl.glTranslatef(1f, -1f, 0);
        glut.glutSolidSphere(c*2, 40, 32);
        gl.glTranslatef(-1f, 1f, 0);
        double d1 = p1.distance(p2.x, p2.y);
        double d2 = p1.distance(p1p.x, p1p.y);
        double angler = Math.acos(d2/d1);
        float angled = (float)Math.toDegrees(angler);
        gl.glTranslatef(-1f, 1f, 0);
        gl.glRotatef(angled, 1f, 1f, 0f);
        float distance = (float)Math.sqrt(((p2.x-p1.x)*(p2.x-p1.x)) + ((p2.y-p1.y)*(p2.y-p1.y)));
        glut.glutSolidCylinder(c, distance, 40, 32);
        gl.glPopMatrix();
 
        gl.glFlush();
    }
 
    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int w, int h) {
        GL gl = arg0.getGL();
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrtho(-2.5*w/h*zoom, 2.5*w/h*zoom, -2.5*zoom, 2.5*zoom, -5f * zoom, 5f * zoom);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }
 
    public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
    }
 
    public void mouseWheelMoved(MouseWheelEvent arg0) {
        if (arg0.getWheelRotation() == 1) {
            zoom += zoom_inc;
        } else {
            zoom -= zoom_inc;
        }
        this.mw.refresh();
    }
 
}
C'est un code Java 5 utilisant JOGL.
Merci d'avance à qui voudra bien m'expliquer et résoudre ce petit mystère.

@++