多边形Polygon

本文介绍了多边形算法,包括判断是否为凸多边形、直线与多边形的交点计算、多边形填充算法及三角化处理。提供了MathTool、Polygon2D相关代码实现,供读者参考。
摘要由CSDN通过智能技术生成

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

        封装的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 <vector>


// 点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<Point2D>& 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;   // 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值