home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
MagilloP
/
GEOMOD99
/
visptloc.c
< prev
Wrap
C/C++ Source or Header
|
1999-05-04
|
5KB
|
208 lines
/***********************************************************************/
/* FILE: visptloc.c */
/***********************************************************************/
/*
Visualizza una triangolazione con evidenziato un triangolo, e un punto
*/
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "point.h"
/***********************************************************************/
/*
Variabili globali al programma:
PER LA TRIANGOLAZIONE:
ptNum = numero di punti
ptArr = array di punti
trNum = numero di triangoli
trArr = array di terne di indici (triangoli)
miX, maX, miY, maY = coordinate estreme dei punti
PER IL PUNTO E IL TRIANGOLO:
pt = il punto
tr = l'indice intero del triangolo all'interno della triangolazione
miX, maX, miY, maY = coordinate estreme dei punti
*/
#define MAX_POINT 100
int ptNum = 0;
Point ptArr[MAX_POINT];
float miX, maX, miY, maY;
int trNum = 0;
int trArr[MAX_POINT][3];
Point pt;
int tr;
float miX, maX, miY, maY;
/***********************************************************************/
/*
Legge punti da input e li mette in array ptArr,
mette il numero di punti letti in ptNum, legge i triangoli
e li mette in trArr, mette il numero di triangoli in trNum.
Alla fine legge punto e indice di triangolo.
*/
void ReadTriangles()
{
int i;
char aux[40];
int dummy;
/* legge i vertici */
scanf("%d",&ptNum);
for (i=0; i<ptNum; i++)
{
scanf("%f %f", &ptArr[i][X], &ptArr[i][Y]);
}
/* legge le terne che definiscono i triangoli */
scanf("%d",&trNum);
for (i=0; i<trNum; i++)
{
scanf("%d %d %d", &trArr[i][0], &trArr[i][1], &trArr[i][2]);
}
/* legge la relazione VT parziale e la scarta */
for (i=0; i<ptNum; i++)
{
scanf("%d", &dummy);
}
/* legge la relazione TT e la scarta */
for (i=0; i<trNum; i++)
{
scanf("%d %d %d", &dummy, &dummy, &dummy);
}
/* legge punto e triangolo */
scanf("%s",aux); /* legge la parola chiave del punto */
if (strcmp(aux,"INPUT_POINT")!=0)
fprintf(stderr,"Manca il punto\n");
else scanf("%f %f", &pt[X], &pt[Y]);
scanf("%s",aux); /* legge la parola chiave del triangolo */
if (strcmp(aux,"OUTPUT_TRIANGLE")!=0)
fprintf(stderr,"Manca il triangolo\n");
else scanf("%d", &tr);
}
/***********************************************************************/
/*
Calcola le ccordinate estreme dei punti in ptArr.
*/
void BoundingBox(float *minX, float *maxX, float *minY, float *maxY)
{
int i;
(*minX) = (*maxX) = ptArr[0][X];
(*minY) = (*maxY) = ptArr[0][Y];
for (i=1; i<ptNum; i++)
{
if (ptArr[i][X]<(*minX)) (*minX) = ptArr[i][X];
else if (ptArr[i][X]>(*maxX)) (*maxX) = ptArr[i][X];
if (ptArr[i][Y]<(*minY)) (*minY) = ptArr[i][Y];
else if (ptArr[i][Y]>(*maxY)) (*maxY) = ptArr[i][Y];
}
}
/***********************************************************************/
void DrawingFunction(void)
{
int i;
/* pulisce il video riempiendolo con colore di sfondo bianco */
glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
/* stabilisce la parte di scena che deve essere inquadrata */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(miX-EPSILON,maX+EPSILON,miY-EPSILON,maY+EPSILON);
/* traccia il contorno dei triangoli in magenta riempiendo in
giallo il triangolo dato */
if ( (tr>=0) && (tr<trNum) )
{
glColor3f(1.0,1.0,0.0);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glBegin(GL_TRIANGLES);
glVertex2f(ptArr[trArr[tr][0]][X],ptArr[trArr[tr][0]][Y]);
glVertex2f(ptArr[trArr[tr][1]][X],ptArr[trArr[tr][1]][Y]);
glVertex2f(ptArr[trArr[tr][2]][X],ptArr[trArr[tr][2]][Y]);
glEnd();
}
glColor3f(1.0,0.0,1.0);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_TRIANGLES);
for (i=0; i<trNum; i++)
{
glVertex2f(ptArr[trArr[i][0]][X],ptArr[trArr[i][0]][Y]);
glVertex2f(ptArr[trArr[i][1]][X],ptArr[trArr[i][1]][Y]);
glVertex2f(ptArr[trArr[i][2]][X],ptArr[trArr[i][2]][Y]);
}
glEnd();
/* traccia il punto in rosso */
glColor3f(1.0,0.0,0.0);
glPointSize(5.0);
glBegin(GL_POINTS);
glVertex2f(pt[X],pt[Y]);
glEnd();
/* invia tutto allo schermo per visualizzazione effettiva */
glFlush();
glutSwapBuffers();
}
void ReshapeFunction(int w, int h)
{
glViewport(0, 0, w, h);
}
void KeyboardFunction(unsigned char c, int x, int y)
{
switch (c)
{
case 'Q':
case 'q': exit(0);
}
}
/***********************************************************************/
/* apre una finestra larga w pixel ed alta h pixel */
void OpenWindow(int w, int h, char *titolo)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(w,h);
glutCreateWindow(titolo);
glutDisplayFunc(DrawingFunction);
glutReshapeFunc(ReshapeFunction);
glutKeyboardFunc(KeyboardFunction);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
/***********************************************************************/
void main(int argc, char **argv)
{
/* inizializza il sistema grafico */
glutInit(&argc, argv);
/* legge la triangolazione, il punto e l'indice del triangolo */
ReadTriangles();
BoundingBox(&miX, &maX, &miY, &maY);
/* apre la finestra grafica e fa partire il tutto */
OpenWindow(300,300,"VisPointLocation");
glutMainLoop();
}
/***********************************************************************/