http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=198803
//
判断某点是否落在多边形中。 2003.2.28.
long fall1( double a3, double a1, long na, long nb, CPoint3DArray & f)
... {
//a3 被测点X坐标
//a1 被测点Y坐标
//na 多边形首点序号
//nb 多边形末点序号
//f 多边形坐标数组
double f1,f2,tk,lvalue,f3,f4;
double tt;
long ncr,n3;
if(f[na].x>1000000.) lvalue=1.0;
else if(f[na].x>100000.) lvalue=0.1;
else if(f[na].x>10000.) lvalue=0.01;
else if(f[na].x>1000.) lvalue=0.001;
else lvalue = 0.00000001;
lvalue = 0.00000001;
/**////// fp5=fopen("tmp1","wt");
/**//* WRITE(*,*) NA,NB */
ncr=0;
// xx0=x0;
// yy0=y00;
/**//* printf(str,"%4ld %4ld %12.1f %12.1f ",
a,nb,a3,a1);
extOut(hDC,10,150,str,70);
essageBox(hWnd, str, "fall1", MB_OK ¦ MB_ICONEXCLAMATION); */
for(n3=na;n3<=nb;n3++)
...{
/**//* printf(str,"%4ld %12.1f %12.1f ",
3,(*(f+n3)).x,(*(f+n3)).y);
extOut(hDC,10,70,str,strlen(str)); */
if(fabs(a3-f[n3].x)<lvalue&&fabs(a1-f[n3].y)<lvalue)
...{
ncr=1;
goto a99;
}
}
n3=na-1;
a5: n3++;
f1=f[n3].x;
f2=f[n3+1].x;
f3 = (n3==na) ? f[nb-1].x : f[n3-1].x;
f4 = (n3+1==nb) ? f[na+1].x : f[n3+2].x;
/**//* ia1=(f1-x0)*xp+10;
ia2=410-((*(f+n3)).y-y00)*yp;
MoveTo(hDC,ia1,ia2);
ia1=(f2-x0)*xp+10;
ia2=410-((*(f+n3+1)).y-y00)*yp;
LineTo(hDC,ia1,ia2); */
// printf(fp5,"%4ld %12.1f %12.1f %12.1f %12.1f ",
// 3,f1,(*(f+n3)).y,f2,(*(f+n3+1)).y);
/**//* if(fabs(a3-292840.)<lvalue&&fabs(a1-134320.)<lvalue)
{
printf(str,"%4ld %12.1f %12.1f %12.1f %12.1f",
3,f1,(*(f+n3)).y,f2,(*(f+n3+1)).y);
extOut(hDC,10,70,str,strlen(str));
} */
a199: ;
if(fabs(f1-f2)<lvalue)
...{ /**//* Xi=xi+1 */
if(fabs(a3-f1)<lvalue)
...{
if(f[n3].y>f[n3+1].y)
...{ /**//* 2 */
if(a1>f[n3+1].y&&a1<f[n3].y)
...{ /**//* 1 */
ncr=1;
goto a99;
} /**//* 1' */
else
goto a64;
} /**//* 2' */
else
...{ /**//* 2.1 */
if(a1>f[n3].y&&a1<f[n3+1].y)
...{ /**//* 1 */
ncr=1;
goto a99;
}
else
goto a64;
} /**//* 2.1' */
}
else
goto a64;
}
if(fabs(a3-f1)<lvalue)
...{
if(f2<f1&&f3<f1 ¦ ¦f2>f1&&f3>f1)goto a64;
f1=f1+lvalue*2.;
}
if(fabs(a3-f2)<lvalue)
...{
if(f1<f2&&f4<f2 ¦ ¦f1>f2&&f4>f2)
...{
n3++;
goto a64;
}
f2=f2+lvalue*2.;
}
if(fabs(f1-f2)<lvalue) goto a199;
if(f1>f2&&(a3>f1 ¦ ¦a3<f2) ¦ ¦f1<f2&&(a3>f2 ¦ ¦a3<f1)) goto a64;
/**//* if(fabs(a3-292840.)<lvalue&&fabs(a1-134320.)<lvalue)
{
printf(str,"%4ld %6ld %12.1f %12.1f %12.1f %12.1f",
3,nb,f1,(*(f+n3)).y,f2,(*(f+n3+1)).y);
extOut(hDC,10,90,str,strlen(str));
} */
tt=(double)(f[n3+1].y-f[n3].y)/(double)(f2-f1);
/**//* if(f1>f2)
tk=tt*(a3-f1)+(*(f+n3)).y;
else
tk=tt*(a3-f2)+(*(f+n3+1)).y; */
tk=tt*(double)(a3-f1)+f[n3].y;
if(fabs(a1-tk)>lvalue) goto a63;
ncr=1;
goto a99;
a63: ;
if(a1>tk) goto a64;
ncr=ncr+1;
/**//* sprintf(str,
"%4ld %4ld %12.1f %12.1f %12.1f %12.1f %12.1 %12.1f %12.1f %12.1f %12.1f ",
ncr,n3,a3,a1,(*(f+n3)).x,(*(f+n3)).y,(*(f+n3+1)).x,(*(f+n3+1)).y,f1,f2,tk); */
/**//* TextOut(hDC,10,150,str,strlen(str)); */
/**//* ia1=(f1-x0)*xp+10;
ia2=410-((*(f+n3)).y-y00)*yp;
MoveTo(hDC,ia1,ia2);
ia1=(f2-x0)*xp+10;
ia2=410-((*(f+n3+1)).y-y00)*yp;
LineTo(hDC,ia1,ia2);
MessageBox(hWnd, str, "ncr", MB_OK ¦ MB_ICONEXCLAMATION); */
a64: ;
if(n3<nb-1) goto a5;
/**//* 99 IER=SET_COLOR(0)
CC ier = filled_rectangle(2,470,640,480)
CC WRITE(VB,'(A,I4)') 'Ncr:',NCR
CC IER=GRAPHIC_TEXT(VB,2,470,12)
CC IER=PAUSE() */
a99: ;
/**//* sprintf(str,"%4ld %4ld %4ld %12.1f %12.1f ",
ncr,na,nb,a3,a1);
TextOut(hDC,10,150,str,70);
MessageBox(hWnd, str, "ncr", MB_OK ¦ MB_ICONEXCLAMATION); */
// fclose(fp5);
return ncr;
}
long fall1( double a3, double a1, long na, long nb, CPoint3DArray & f)
... {
//a3 被测点X坐标
//a1 被测点Y坐标
//na 多边形首点序号
//nb 多边形末点序号
//f 多边形坐标数组
double f1,f2,tk,lvalue,f3,f4;
double tt;
long ncr,n3;
if(f[na].x>1000000.) lvalue=1.0;
else if(f[na].x>100000.) lvalue=0.1;
else if(f[na].x>10000.) lvalue=0.01;
else if(f[na].x>1000.) lvalue=0.001;
else lvalue = 0.00000001;
lvalue = 0.00000001;
/**////// fp5=fopen("tmp1","wt");
/**//* WRITE(*,*) NA,NB */
ncr=0;
// xx0=x0;
// yy0=y00;
/**//* printf(str,"%4ld %4ld %12.1f %12.1f ",
a,nb,a3,a1);
extOut(hDC,10,150,str,70);
essageBox(hWnd, str, "fall1", MB_OK ¦ MB_ICONEXCLAMATION); */
for(n3=na;n3<=nb;n3++)
...{
/**//* printf(str,"%4ld %12.1f %12.1f ",
3,(*(f+n3)).x,(*(f+n3)).y);
extOut(hDC,10,70,str,strlen(str)); */
if(fabs(a3-f[n3].x)<lvalue&&fabs(a1-f[n3].y)<lvalue)
...{
ncr=1;
goto a99;
}
}
n3=na-1;
a5: n3++;
f1=f[n3].x;
f2=f[n3+1].x;
f3 = (n3==na) ? f[nb-1].x : f[n3-1].x;
f4 = (n3+1==nb) ? f[na+1].x : f[n3+2].x;
/**//* ia1=(f1-x0)*xp+10;
ia2=410-((*(f+n3)).y-y00)*yp;
MoveTo(hDC,ia1,ia2);
ia1=(f2-x0)*xp+10;
ia2=410-((*(f+n3+1)).y-y00)*yp;
LineTo(hDC,ia1,ia2); */
// printf(fp5,"%4ld %12.1f %12.1f %12.1f %12.1f ",
// 3,f1,(*(f+n3)).y,f2,(*(f+n3+1)).y);
/**//* if(fabs(a3-292840.)<lvalue&&fabs(a1-134320.)<lvalue)
{
printf(str,"%4ld %12.1f %12.1f %12.1f %12.1f",
3,f1,(*(f+n3)).y,f2,(*(f+n3+1)).y);
extOut(hDC,10,70,str,strlen(str));
} */
a199: ;
if(fabs(f1-f2)<lvalue)
...{ /**//* Xi=xi+1 */
if(fabs(a3-f1)<lvalue)
...{
if(f[n3].y>f[n3+1].y)
...{ /**//* 2 */
if(a1>f[n3+1].y&&a1<f[n3].y)
...{ /**//* 1 */
ncr=1;
goto a99;
} /**//* 1' */
else
goto a64;
} /**//* 2' */
else
...{ /**//* 2.1 */
if(a1>f[n3].y&&a1<f[n3+1].y)
...{ /**//* 1 */
ncr=1;
goto a99;
}
else
goto a64;
} /**//* 2.1' */
}
else
goto a64;
}
if(fabs(a3-f1)<lvalue)
...{
if(f2<f1&&f3<f1 ¦ ¦f2>f1&&f3>f1)goto a64;
f1=f1+lvalue*2.;
}
if(fabs(a3-f2)<lvalue)
...{
if(f1<f2&&f4<f2 ¦ ¦f1>f2&&f4>f2)
...{
n3++;
goto a64;
}
f2=f2+lvalue*2.;
}
if(fabs(f1-f2)<lvalue) goto a199;
if(f1>f2&&(a3>f1 ¦ ¦a3<f2) ¦ ¦f1<f2&&(a3>f2 ¦ ¦a3<f1)) goto a64;
/**//* if(fabs(a3-292840.)<lvalue&&fabs(a1-134320.)<lvalue)
{
printf(str,"%4ld %6ld %12.1f %12.1f %12.1f %12.1f",
3,nb,f1,(*(f+n3)).y,f2,(*(f+n3+1)).y);
extOut(hDC,10,90,str,strlen(str));
} */
tt=(double)(f[n3+1].y-f[n3].y)/(double)(f2-f1);
/**//* if(f1>f2)
tk=tt*(a3-f1)+(*(f+n3)).y;
else
tk=tt*(a3-f2)+(*(f+n3+1)).y; */
tk=tt*(double)(a3-f1)+f[n3].y;
if(fabs(a1-tk)>lvalue) goto a63;
ncr=1;
goto a99;
a63: ;
if(a1>tk) goto a64;
ncr=ncr+1;
/**//* sprintf(str,
"%4ld %4ld %12.1f %12.1f %12.1f %12.1f %12.1 %12.1f %12.1f %12.1f %12.1f ",
ncr,n3,a3,a1,(*(f+n3)).x,(*(f+n3)).y,(*(f+n3+1)).x,(*(f+n3+1)).y,f1,f2,tk); */
/**//* TextOut(hDC,10,150,str,strlen(str)); */
/**//* ia1=(f1-x0)*xp+10;
ia2=410-((*(f+n3)).y-y00)*yp;
MoveTo(hDC,ia1,ia2);
ia1=(f2-x0)*xp+10;
ia2=410-((*(f+n3+1)).y-y00)*yp;
LineTo(hDC,ia1,ia2);
MessageBox(hWnd, str, "ncr", MB_OK ¦ MB_ICONEXCLAMATION); */
a64: ;
if(n3<nb-1) goto a5;
/**//* 99 IER=SET_COLOR(0)
CC ier = filled_rectangle(2,470,640,480)
CC WRITE(VB,'(A,I4)') 'Ncr:',NCR
CC IER=GRAPHIC_TEXT(VB,2,470,12)
CC IER=PAUSE() */
a99: ;
/**//* sprintf(str,"%4ld %4ld %4ld %12.1f %12.1f ",
ncr,na,nb,a3,a1);
TextOut(hDC,10,150,str,70);
MessageBox(hWnd, str, "ncr", MB_OK ¦ MB_ICONEXCLAMATION); */
// fclose(fp5);
return ncr;
}