多边形Polygon

        多边形 大家都很熟悉,我们把他定义为 多条边首尾连接的封闭图形,关于多边形的算法有很多,比如 是否为凸多边形、直线与多边形求交、填充算法、三角化等,具体的算法原理作者就不再细讲,直接给出作者以前写的具体代码,大家作为参考:

        封装的Math工具类(MathTool.h),这里也用到了之前文章里的(Tuple2.h和Tuple3.h)

/* Math工具类 - 包含基本数学算法
    linolzhang, 2010.3.11
*/

#ifndef __MATH_TOOL_H_INCLUDED__
#define __MATH_TOOL_H_INCLUDED__

#include "Tuple2.h"
#include "Tuple3.h"
#include 


// 点p在线段(pa,pb)的Side  - 左侧(内侧)  1
//                         - 右侧(外侧)  -1
//                         - 线上          0
inline int LineSide(float x,float y,float xa,float ya,float xb,float yb)
{
	float f = (xb-xa)*(y-ya) - (x-xa)*(yb-ya); 
	if(f>0) 
		return 1;
	else if(f<0) 
		return -1;
	else 
		return 0;
};
inline int LineSide(const Point2D& p,const Point2D& pa,const Point2D& pb)
{
	float f = (pb.x-pa.x)*(p.y-pa.y) - (p.x-pa.x)*(pb.y-pa.y); 
	if(f>0) 
		return 1;
	else if(f<0) 
		return -1;
	else 
		return 0;
};

// 三维点p在线段(pa,pb)的Side  - 左侧(内侧)  1
//                             - 右侧(外侧)  -1
//                             - 线上          0
inline int LineSide(const Point3D& p,const Point3D& pa,const Point3D& pb,const CVector3& norm)
{
	CVector3 edge(pb-pa);  // edge
	CVector3 vFace = norm.getCrossProduct(edge);  // 线内方向

	CVector3 pointDir(p-pa);
	float f = vFace.getDotProduct(pointDir);

	if(f>0) 
		return 1;
	else if(f<0) 
		return -1;
	else 
		return 0;
};

// 查看点是否在多边形区域 - side叉乘判断
inline bool IsPointInConvexPolygon(const Point2D& point,const std::vector& polygon)
{
	// 遍历
	for(int i=0;i<(int)polygon.size();i++)
	{
		int nextIndex = i+1>(int)polygon.size()-1 ? 0 : i+1;

		//int lineSide = LineSide(point.X,point.Y,polygon[i].X,polygon[i].Y,polygon[nextIndex].X,polygon[nextIndex].Y); 
		int lineSide = LineSide(point,polygon[i],polygon[nextIndex]); 
		//int lineSide = LineSide(Point3D(point.x,point.y,0),Point3D(polygon[i].x,polygon[i].y,0),Point3D(polygon[nextIndex].x,polygon[nextIndex].y,0),CVector3(0,0,1)); 
		if( lineSide==-1)
			return false;   // 

你可能感兴趣的:(数学,多边形,凸包,三角化,Polygon,多边形求交)