# 点在多边形内算法——判断一个点是否在一个复杂多边形的内部

（注意：这个算法适用于顺时针和逆时针绘制的多边形。）

C代码例子

// Globals which should be set before calling this function:
//
// int    polySides  =  how many cornersthe polygon has
// float  polyX[]    =  horizontalcoordinates of corners
// float  polyY[]    =  verticalcoordinates of corners
// float  x,y       =  point to be tested
//
// (Globals are used in this example for purposes of speed.  Change as
// desired.)
//
//  Thefunction will return YES if the point x,y is inside the polygon, or
//  NOif it is not.  If the point is exactly on the edge of the polygon,
// then the function may return YES or NO.
//
// Note that division by zero is avoided because the division is protected
//  bythe "if" clause which surrounds it.

bool pointInPolygon() {

  int   i,j=polySides-1 ;
  bool  oddNodes=NO     ;

  for (i=0;i<polySides; i++) {
    if(polyY[i]<y && polyY[j]>=y
    ||  polyY[j]<y&& polyY[i]>=y) {
      if(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x) {
        oddNodes=!oddNodes;}}
    j=i;}

  returnoddNodes; }

// Globals which should be set before calling this function:
//
// int    polySides  =  how many cornersthe polygon has
// float  polyX[]    =  horizontalcoordinates of corners
// float  polyY[]    =  verticalcoordinates of corners
// float  x,y       =  point to be tested
//
// (Globals are used in this example for purposes of speed.  Change as
// desired.)
//
//  Thefunction will return YES if the point x,y is inside the polygon, or
//  NOif it is not.  If the point is exactly on the edge of the polygon,
// then the function may return YES or NO.
//
// Note that division by zero is avoided because the division is protected
//  bythe "if" clause which surrounds it.

bool pointInPolygon() {

  int   i,j=polySides-1 ;
  bool  oddNodes=NO     ;

  for (i=0;i<polySides; i++) {
    if((polyY[i]< y && polyY[j]>=y
    ||   polyY[j]<y && polyY[i]>=y)
    &&  (polyX[i]<=x || polyX[j]<=x)){
      if(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x) {
        oddNodes=!oddNodes;}}
    j=i;}

  returnoddNodes; }

// Globals which should be set before calling this function:
//
// int    polySides  =  how many cornersthe polygon has
// float  polyX[]    =  horizontalcoordinates of corners
// float  polyY[]    =  verticalcoordinates of corners
// float  x,y       =  point to be tested
//
// (Globals are used in this example for purposes of speed.  Change as
// desired.)
//
//  Thefunction will return YES if the point x,y is inside the polygon, or
//  NOif it is not.  If the point is exactly on the edge of the polygon,
// then the function may return YES or NO.
//
// Note that division by zero is avoided because the division is protected
//  bythe "if" clause which surrounds it.

bool pointInPolygon() {

  int   i,j=polySides-1 ;
  bool  oddNodes=NO     ;

  for (i=0;i<polySides; i++) {
    if((polyY[i]< y && polyY[j]>=y
    ||   polyY[j]<y && polyY[i]>=y)
    && (polyX[i]<=x || polyX[j]<=x)) {
      oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x);}
    j=i;}

  returnoddNodes; }

• 本文已收录于以下专栏：

## 判断点在多边形内的多种写法

• okvee
• 2010年06月02日 22:38
• 9374

## 点在多边形内 经典算法(转)

• y391770118
• 2014年10月15日 21:28
• 1008

## 点在多边形内的算法（C++和JavaScript版 ）

C++，其中 npol是多边形顶点的数量，xp,yp是多边形顶点数组，x,y是某个点 int pnpoly(int npol, float *xp, float *yp, float x, floa...
• winnyrain
• 2015年12月15日 15:34
• 1320

## 点在多边形内算法——判断一个点是否在一个复杂多边形的内部

• ycl295644
• 2015年06月10日 10:17
• 3022

## 判断点在任意多边形内部最简单的算法

• jjj19891128
• 2014年03月31日 18:11
• 4182

## 判定一个点是否在多边形内部

• luyuncsd123
• 2014年05月29日 14:35
• 11058

## 点在多边形内算法——判断一个点是否在一个复杂多边形的内部

• hjh2005
• 2013年07月04日 21:55
• 67141

## 判断点是否在多边形内的算法

• yanjunmu
• 2015年07月02日 11:09
• 2072

## 判断一个坐标点是否在不规则多边形内部的算法

• taotaoah
• 2016年08月29日 09:25
• 2749

## 判断点在多边形内的算法

• windydreams
• 2014年11月07日 19:11
• 990

举报原因： 您举报文章：点在多边形内算法——判断一个点是否在一个复杂多边形的内部 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)