RECHERCHER :
COMMUNAUTE MP
Identifiez vous ...
Devenir Membre
J'ai oublié mon MDP
DOMAINE MP
Bavardages
Langages Généraux
Langages Web
Langages DotNet
Autres langages
Dev. Jeux Video
Sécurité
Sys. Exploitation
Graphismes
Logiciels
Réseaux
Bases de données
Méthodologies
Emplois High-tech
Aide juridique
Articles juridiques
FORUM
Index des forums
Ajouter un sujet
Rechercher sujet
Contact Responsable
Devenir modérateur
CHAT MP IRC
Votre pseudo ...
Srv: irc.moteurprog.com
Chan: #MoteurProg
PARTICIPER
Plus de 3500 emplois.
Rechercher un job
Déposez votre CV
Emplois High-tech

Visiteur MP

 pb de reperage d'un point pr à un cadre

Forum : C - CONSOLE
Sous Catégorie : Console
Type du sujet : Sujet Normale
FAQ : FAQ C - CONSOLE

SUIVI DES SUJETS PAR MAIL

SUIVI PAR MAIL INACTIF

RESOLUTION DU SUJET SUJET NON RESOLU
BLOQUAGE DU SUJET SUJET ACTIF
APPARTENANCE A LA FAQ N'APPARTIENT PAS A LA FAQ


POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

FORUM C - CONSOLE

PREMIERE PAGE

PAGE PRECEDENTE

Page précedente

Page suivante

PAGE SUIVANTE

DERNIERE PAGE
fakra
Nouveau membre
Inscrit : 25/06/2007
Messages : 1
Message
#136933
Posté le 25/06/07 à 12:09
salut tt le monde,

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; }

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Publicité
Inscrit : X
Messages : X
Message
#Aucun

HAUT DE PAGE

  

vortex666
Modérateur :
- C & C++
- OpenGL
- Delphi
Chef de projet(s) :
- Vortez3DEngine

Avatar de vortex666
Inscrit : 20/09/2004
Messages : 490
Message
#138259
Posté le 12/07/07 à 17:50
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.

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 


    PAGE : [1]



.: Site Web développé par Julien Pichot et l'équipe MPWG avec www.evolvia-web.com :.