meta Name="author" Content="Nicolas JANEY, nico@univ-fcomte.fr">


Le source: SegmentEquation.cpp
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
static int aff = 0 ;
static int yy = 0 ;
static float bleu[] = { 0.0F,0.0F,1.0F,1.0F } ;
void line(int *p1,int *p2) {
glColor3fv(bleu) ;
glBegin(GL_LINES) ;
glVertex2f((float) p1[0],(float) p1[1]) ;
glVertex2f((float) p2[0],(float) p2[1]) ;
glEnd() ;
}
void pixel(int x,int y,float *c) {
glColor3fv(c) ;
glBegin(GL_QUADS) ;
glVertex2f(x-0.5F,y-0.5F) ;
glVertex2f(x-0.5F,y+0.5F) ;
glVertex2f(x+0.5F,y+0.5F) ;
glVertex2f(x+0.5F,y-0.5F) ;
glEnd() ;
}
int round(float v) {
return((int) ( (v<0.0F) ? (v-0.499999F) : (v+0.499999F))) ;
}
void ligne(float *c,int *p1,int *p2) {
float a = ( p1[0] != p2[0] ) ? (float) (p2[1]-p1[1])/(p2[0]-p1[0]) : 10000000.0F ;
float b = p1[1] - a * p1[0] ;
if ( fabs(a) <= 1 ) {
float y =(float) p1[1] ;
pixel(p1[0],p1[1],c) ;
int xinc = ( p2[0]>p1[0] ) ? 1 : -1 ;
if ( xinc < 0 )
a = -a ;
for ( int x = p1[0]+xinc ; x != p2[0]+xinc ; x += xinc) {
y += a ;
pixel(x,round(y),c) ; } }
else {
a = 1.0F/a ;
float x =(float) p1[0] ;
pixel(p1[0],p1[1],c) ;
int yinc = ( p2[1]>p1[1] ) ? 1 : -1 ;
if ( yinc < 0 )
a = -a ;
for ( int y = p1[1]+yinc ; y != p2[1]+yinc ; y += yinc) {
x += a ;
pixel(round(x),y,c) ; } }
}
void ligneIncomplete(float *c,int *p1,int *p2,int max) {
float a = ( p1[0] != p2[0] ) ? (float) (p2[1]-p1[1])/(p2[0]-p1[0]) : 10000000.0F ;
float b = p1[1] - a * p1[0] ;
if ( fabs(a) <= 1 ) {
float y =(float) p1[1] ;
pixel(p1[0],p1[1],c) ;
int xinc = ( p2[0]>p1[0] ) ? 1 : -1 ;
if ( xinc < 0 )
a = -a ;
for ( int x = p1[0]+xinc,cp = 0 ; ( x != p2[0]+xinc ) && ( cp < max ) ; x += xinc,cp++ ) {
y += a ;
pixel(x,round(y),c) ; } }
else {
a = 1.0F/a ;
float x =(float) p1[0] ;
pixel(p1[0],p1[1],c) ;
int yinc = ( p2[1]>p1[1] ) ? 1 : -1 ;
if ( yinc < 0 )
a = -a ;
for ( int y = p1[1]+yinc,cp = 0 ; ( y != p2[1]+yinc ) && ( cp < max ) ; y += yinc,cp++ ) {
x += a ;
pixel(round(x),y,c) ; } }
}
void CALLBACK display() {
float rouge[] = { 1.0F,0.0F,0.0F,1.0F };
float vert[] = { 1.0F,0.0F,0.0F,1.0F };
int p1[] = { -25,-5 } ;
int p2[] = { 20,27 } ;
int p3[] = { 25,-28 } ;
int p4[] = { 7,11 } ;
int p5[] = { -15,-28 } ;
int p6[] = { -7,3 } ;
int p7[] = { -22,27 } ;
int p8[] = { 7,21 } ;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
switch (aff) {
case 0 : ligne(rouge,p1,p2) ;
ligne(vert,p3,p4) ;
ligne(vert,p5,p6) ;
ligne(vert,p7,p8) ;
line(p1,p2) ;
line(p3,p4) ;
line(p5,p6) ;
line(p7,p8) ;
break ;
case 1 : ligneIncomplete(rouge,p1,p2,yy) ;
ligneIncomplete(vert,p3,p4,yy) ;
ligneIncomplete(vert,p5,p6,yy) ;
ligneIncomplete(vert,p7,p8,yy) ;
line(p1,p2) ;
line(p3,p4) ;
line(p5,p6) ;
line(p7,p8) ;
break ;
case 2 : ligne(rouge,p2,p1) ;
ligne(vert,p4,p3) ;
ligne(vert,p6,p5) ;
ligne(vert,p8,p7) ;
line(p2,p1) ;
line(p4,p3) ;
line(p6,p5) ;
line(p8,p7) ;
break ;
case 3 : ligneIncomplete(rouge,p2,p1,yy) ;
ligneIncomplete(vert,p4,p3,yy) ;
ligneIncomplete(vert,p6,p5,yy) ;
ligneIncomplete(vert,p8,p7,yy) ;
line(p2,p1) ;
line(p4,p3) ;
line(p6,p5) ;
line(p8,p7) ;
break ; }
glPopMatrix();
glFlush();
auxSwapBuffers() ;
}
void CALLBACK reshape(int w,int h) {
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if( w <= h)
glOrtho(-30.0,30.0,-30.0*(double) h/w,30.0*(double) h/w,-40.0,40.0);
else
glOrtho(-30.0*(double) h/w,30.0*(double) h/w,-30.0,30.0,-40.0,40.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CALLBACK init() {
glShadeModel(GL_SMOOTH);
glClearColor(0.8F,0.8F,0.8F,1.0F);
}
void CALLBACK auxKeyReturn() {
yy = 0 ;
aff++ ;
if ( aff == 4 )
aff = 0 ;
}
void CALLBACK auxKeySpace() {
yy++ ;
if ( yy == 60 )
yy = 0 ;
}
void main(void) {
auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA|AUX_DEPTH);
auxInitPosition (0,0,300,300);
auxInitWindow("Segment par l'équation cartésienne") ;
init();
auxKeyFunc(AUX_RETURN,auxKeyReturn) ;
auxKeyFunc(AUX_SPACE,auxKeySpace) ;
auxReshapeFunc(reshape);
auxMainLoop(display);
}
RETOUR