資源簡介
點是否在多邊形內(nèi)判斷的C語言代碼,有2維及3維兩種情況的判斷, 請注意:如果你決定使用其中某個函數(shù),請將它拷出來,每個函數(shù)都能用,對應(yīng)于不同的算法,請看說明,最后一個函數(shù)為三維情況。
代碼片段和文件信息
#define?MIN(xy)?(x?#define?MAX(xy)?(x?>?y???x?:?y)
//The?following?C?function?returns?INSIDE?or?OUTSIDE?indicating?the?status?of?a?point?P?with?respect?to?a?polygon?with?N?points.
#define?INSIDE?0
#define?OUTSIDE?1
typedef?struct?{
???double?xy;
}?Point;
int?InsidePolygon(Point?*polygonint?NPoint?p)
{
??int?counter?=?0;
??int?i;
??double?xinters;
??Point?p1p2;
??p1?=?polygon[0];
??for?(i=1;i<=N;i++)?{
????p2?=?polygon[i?%?N];
????if?(p.y?>?MIN(p1.yp2.y))?{
??????if?(p.y?<=?MAX(p1.yp2.y))?{
????????if?(p.x?<=?MAX(p1.xp2.x))?{
??????????if?(p1.y?!=?p2.y)?{
????????????xinters?=?(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;
????????????if?(p1.x?==?p2.x?||?p.x?<=?xinters)
??????????????counter++;
??????????}
????????}
??????}
????}
????p1?=?p2;
??}
??if?(counter?%?2?==?0)
????return(OUTSIDE);
??else
????return(INSIDE);
}
//The?following?code?is?by?Randolph?Franklin?it?returns?1?for?interior?points?and?0?for?exterior?points.
int?pnpoly(int?npol?float?*xp?float?*yp?float?x?float?y)
????{
??????int?i?j?c?=?0;
??????for?(i?=?0?j?=?npol-1;?i?????????if?((((yp[i]?<=?y)?&&?(y??????????????((yp[j]?<=?y)?&&?(y?????????????(x?(xp[j]?-?xp[i])?*?(y?-?yp[i])?/?(yp[j]?-?yp[i])?+?xp[i]))
??????????c?=?!c;
??????}
??????return?c;
????}
//The?inside/outside?test?might?then?be?defined?in?C?as?
typedef?struct?{
???int?hv;
}?Point;
int?InsidePolygon(Point?*polygonint?nPoint?p)
{
???int?i;
???double?angle=0;
???Point?p1p2;
???for?(i=0;i ??????p1.h?=?polygon[i].h?-?p.h;
??????p1.v?=?polygon[i].v?-?p.v;
??????p2.h?=?polygon[(i+1)%n].h?-?p.h;
??????p2.v?=?polygon[(i+1)%n].v?-?p.v;
??????angle?+=?Angle2D(p1.hp1.vp2.hp2.v);
???}
???if?(AB
評論
共有 條評論