Tous les cas d'orientation des segments sont traités sur les affichage 1 et 3, tracés sur les affichages 2 et 4.
Le source: SegmentEquation.cpp
/* Auteur: Nicolas JANEY */
/* nicolas.janey@univ-fcomte.fr */
/* Avril 2001 */
/* Illustration du trace de segment */
/* par utilisation de l'equation */
/* cartesienne */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "ModuleCouleurs.h"
#include "ModuleMenus.h"
#include "ModuleReshape.h"
static int aff = 0 ;
static int yy = 0 ;
void line(int *p1,int *p2) {
glColor4fv(couleurBleu()) ;
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) {
glColor4fv(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 display() {
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(couleurRouge(),p1,p2) ;
ligne(couleurVert(),p3,p4) ;
ligne(couleurJaune(),p5,p6) ;
ligne(couleurCyan(),p7,p8) ;
line(p1,p2) ;
line(p3,p4) ;
line(p5,p6) ;
line(p7,p8) ;
break ;
case 1 : ligneIncomplete(couleurRouge(),p1,p2,yy) ;
ligneIncomplete(couleurVert(),p3,p4,yy) ;
ligneIncomplete(couleurJaune(),p5,p6,yy) ;
ligneIncomplete(couleurCyan(),p7,p8,yy) ;
line(p1,p2) ;
line(p3,p4) ;
line(p5,p6) ;
line(p7,p8) ;
break ;
case 2 : ligne(couleurRouge(),p2,p1) ;
ligne(couleurVert(),p4,p3) ;
ligne(couleurJaune(),p6,p5) ;
ligne(couleurCyan(),p8,p7) ;
line(p2,p1) ;
line(p4,p3) ;
line(p6,p5) ;
line(p8,p7) ;
break ;
case 3 : ligneIncomplete(couleurRouge(),p2,p1,yy) ;
ligneIncomplete(couleurVert(),p4,p3,yy) ;
ligneIncomplete(couleurJaune(),p6,p5,yy) ;
ligneIncomplete(couleurCyan(),p8,p7,yy) ;
line(p2,p1) ;
line(p4,p3) ;
line(p6,p5) ;
line(p8,p7) ;
break ; }
glPopMatrix();
glFlush();
glutSwapBuffers() ;
}
void myinit() {
glShadeModel(GL_SMOOTH);
glClearColor(0.8F,0.8F,0.8F,1.0F);
}
void key(unsigned char key,int x,int y) {
switch ( key ) {
case 0x0D : yy = 0;
aff = (aff+1)%4;
glutPostRedisplay();
break;
case ' ' : yy = (yy+1)%60;
glutPostRedisplay();
break;
case 0x1B : exit(0);
break; }
}
int main(int argc,char **argv) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
glutInitWindowSize(300,300);
glutInitWindowPosition(50,50);
glutCreateWindow("Segment par l'équation cartésienne");
creationMenuBasique();
myinit();
setParametresOrthoBasique(-30.0,30.0,-30.0,30.0,-1000.0,1000.0);
glutReshapeFunc(reshapeOrthoBasique);
glutKeyboardFunc(key);
glutDisplayFunc(display);
glutMainLoop();
return(0);
}