je suis encore nouveau alors soyez clement avec moi ok !
voilà mon probleme : j'essai de créer une fonction qui m'indique si un point est dans le cadre d'un polygone ou pas. j'ai cru comprendre que parmis tout les algorithme il existe un très simple qui consiste à dire que (source : http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html):
en faite le principe est celui de ''l'algorithme de décompte de croisement"
qui se définit de la sorte :
Pour savoir si un point est à l'intérieur d'un polygone, la méthode la plus
utilisée est de tracer une droite de ce point vers l'infini et de compter
les intersections entre cette droite et les segments du polygone qui la
croisent. Il faut bien sûr faire attention aux coins qui tombent juste sur
la demi-droite.
-
tracer une droite du point vers l'infini.
-
calculer le nombre d'intersections entre cette droite et les segments
formant le polygone.
-
un nombre impair indique qu'on est à l'intérieur.
dans mon cas à moi la fonction doit me renvoyé O si le point est à
l'intérieur et 1 si il est à l'exterieur du polygone.
Mon souci est que je retrouve tt le temps la valeurs zero alors qu'il doit me donner zero lorsque le point est en dehors du cadre du polygone et 1 lorsqu'il est dedans ....si quelqu'un pouvait m'aider ...merci
le code que j'ai essayé de faire est le suivant (sous DEVC++) :
/***************************************************************************
* *
* INPOLY.C *
* *
* Copyright (c) 1995-1996 Galacticomm, Inc. Freeware source code. *
* *
* Please feel free to use this source code for any purpose, commercial *
* or otherwise, as long as you don't restrict anyone else's use of *
* this source code. Please give credit where credit is due. *
* *
* Point-in-polygon algorithm, created especially for World-Wide Web *
* servers to process image maps with mouse-clickable regions. *
* *
* http://www.visibone.com/inpoly/inpoly.c *
* *
* 6/19/95 - Bob Stein & Craig Yap *
* stein@visibone.com *
* craig@cse.fau.edu *
* *
***************************************************************************/
//appeler aussi algorithme de décompte de croisement
#include <windows.h>
#include <stdio.h>
#include <math.h>
#define PI 3.1415927f
typedef struct
{ float x;
float y;
float z;
} T_Point3D;
#define NB_MAX_SOMMETS 8
typedef struct
{
T_Point3D LstPts[NB_MAX_SOMMETS]; // max octogone
short nSensDesc;
short nTypeSurf ; // horizontale, verticale, inclinée, paroi, vitrage, GOE, PV, …
char szUnused[16] ;
} T_Poly;
T_Poly PolyVit;
typedef struct
{
double X; // dimension au sol de la zone selon X, i.e. dans l eplan du vitrage
double Z; // dimension au sol de la zone selon Z, i.e. dans le plan orthogonal au vitrage
double Y; // pour pouvoir faire une zone sur le Mur et/ou le plafond
//On ne prendra que les surfaces (càd 2 axes parmis les 3) pour définir les zones de calculs (la grille de calcul)
} T_Zone;
typedef struct
{ float X; // dimenssion du block (face superieure) suivant l'axe x
float Y; // dimenssion du block (face supérieure) suivant l'axe y
// float S; // Surface du block (i.e X.Y)
float Z; // dimenssion du block (face superieure) suivant l'axe z
} T_Block;
int /* 1=inside, 0=outside */
inpoly( /* is target point inside a 2D polygon? */
T_Poly Vit, /* polygon points, [0]=x, [1]=y */
int npoints, /* number of points in polygon */
T_Point3D M) /* x (horizontal) of target point
/* y (vertical) of target point */
{
unsigned int xnew,ynew;
unsigned int xold,yold,zold;
unsigned int x1,y1;
unsigned int x2,y2;
int i;
int inside=0;
if (npoints < 3) {
return(0);
}
xold=Vit.LstPts[npoints-1].x;
yold=Vit.LstPts[npoints-1].y;
for (i=0 ; i < npoints ; i++) {
xnew=Vit.LstPts[i].x;
ynew=Vit.LstPts[i].y;
if (xnew > xold) {
x1=xold;
x2=xnew;
y1=yold;
y2=ynew;
}
else {
x1=xnew;
x2=xold;
y1=ynew;
y2=yold;
}
if (((xnew < M.x) == (M.x <= xold)) /* edge "open" at left end */
&& ((long)M.y-(long)y1)*(long)(x2-x1)
< ((long)y2-(long)y1)*(long)(M.x-x1)) {
// inside!=(inside);
inside=inside+1;
}
xold=xnew;
yold=ynew;
// return (inside);
}
// printf("valeur donner dans la fonction principale 2 etape : %i\n\n",inside);
return(inside);
}
int main (void)
{
// int bTa;// CoordonneeXduBlock, CoordonneeYduBlock, CoorodonneZduBlock;
//je declare mes deux variables
T_Point3D point;
T_Block Block; // ici je déclare et donc je reserve laplace
T_Poly PolyVit;
//je rempli mes structures. un exemple de point de coordonnées (4,3,2) et de dimenssion de block donnée (10,12,4).
///point.x=5;
//point.y=3;
//point.z=2;
Block.X=4.0;
Block.Y=4.0;
Block.Z=4.0;
PolyVit.LstPts[0].x = 0.0f;
PolyVit.LstPts[0].y = 0.0f;
PolyVit.LstPts[0].z = 0.0f;
PolyVit.LstPts[1].x = 0.0f;
PolyVit.LstPts[1].y = 0.0f;
PolyVit.LstPts[1].z = 4.0f;
PolyVit.LstPts[2].x = 4.0f;
PolyVit.LstPts[2].y = 0.0f;
PolyVit.LstPts[2].z = 4.0f;
PolyVit.LstPts[3].x = 4.0f;
PolyVit.LstPts[3].y = 0.0f;
PolyVit.LstPts[3].z = 4.0f;
PolyVit.nSensDesc =0;
PolyVit.nTypeSurf =0; // horizontale, verticale, inclinée, paroi, vitrage, GOE, PV, …
strcpy(PolyVit.szUnused,"");
// bTa = inside(point,PolyVit, int 4)
//bTa = bIsTestPointDansCadre(point,&Block); // & est l'opérateur d'adressage
// cad que &Block est l'adresse de Block et donc
// un pointeur sur Block
// printf("\nPoint 1 dans le plan ? : %d\n", bTa);
point.x=20.0;
point.y=20.0;
point.z=156.0;
//bTa=inpoly(point,PolyVit, 4);
// if (bTa !=4)
// printf ("le point est dedans\n");
// else
// printf("le point est dehors\n");
//inpoly(PolyVit,4, point);
printf(" le test que j'ai fait me donne %u\n",inpoly(PolyVit,4,point) );
//bTa = bIsTestPointDansCadre(point,&Block);
//printf("\nPoint 2 dans le plan ? : %d\n", bIsTestPointDansCadre(point,&Block));
system ("PAUSE");
return 0;
}
Ouaip, ya beaucoup de code, et ca serais assez long a analyser, donc je te conseil de débugger ton programme, comme ca tu va voir ce qui se passe dedans, et tu trouvera la reponse a ta question.