判断一个点是否在某个封闭曲线内的算法

 

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;  
}
  
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值