资源简介
判断点是否在多边形内
#include
#include
#include
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a<b)?a:b)
using namespace std;
const double INFINITY = 1e10;
const double ESP = 1e-5;
const int MAX_N = 1000;
//定义点
struct Point
{
double x, y;
};
//定义边
struct LineSegment
{
Point pt1, pt2;
};
typedef vector Polygon;
代码片段和文件信息
#include
#include
#include
#define max(ab) ((a>b)?a:b)
#define min(ab) ((ausing namespace std;
const double INFINITY = 1e10;
const double ESP = 1e-5;
const int MAX_N = 1000;
//定义点
struct Point
{
double x y;
};
//定义边
struct LineSegment
{
Point pt1 pt2;
};
typedef vector Polygon;
// 计算叉乘 |P0P1| × |P0P2|
double Multiply(Point p1 Point p2 Point p0)
{
return ( (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y) );
}
// 判断线段是否包含点point
bool IsOnline(Point point LineSegment line)
{
return( ( fabs(Multiply(line.pt1 line.pt2 point)) < ESP ) &&
( ( point.x - line.pt1.x ) * ( point.x - line.pt2.x ) <= 0 ) &&
( ( point.y - line.pt1.y ) * ( point.y - line.pt2.y ) <= 0 ) );
}
// 判断线段相交
bool Intersect(LineSegment L1 LineSegment L2)
{
return( (max(L1.pt1.x L1.pt2.x) >= min(L2.pt1.x L2.pt2.x)) &&
(max(L2.pt1.x L2.pt2.x) >= min(L1.pt1.x L1.pt2.x)) &&
(max(L1.pt1.y L1.pt2.y) >= min(L2.pt1.y L2.pt2.y)) &&
(max(L2.pt1.y L2.pt2.y) >= min(L1.pt1.y L1.pt2.y)) &&
(Multiply(L2.pt1 L1.pt2 L1.pt1) * Multiply(L1.pt2 L2.pt2 L1.pt1) >= 0) &&
(Multiply(L1.pt1 L2.pt2 L2.pt1) * Multiply(L2.pt2 L1.pt2 L2.pt1) >= 0)
);
}
// 判断点在多边形内
bool InPolygon(Polygon & polygon Point point)
{
int n = polygon.size();
int count = 0;
LineSegment line;
line.pt1 = point;
line.pt2.x = point.x;
line.pt2.y = - INFINITY;
for( int i = 0; i < n; i++ ) {
// 得到多边形的一条边
LineSegment side;
side.pt1 = polygon[i];
side.pt2 = polygon[(i + 1) % n];
//判断已知点是否在边上
if( IsOnline(point side) ) {
return 1 ;
}
// 如果side平行y轴则不作考虑
if( fabs(side.pt1.x - side.pt2.x) < ESP ) {
continue;
}
if( IsOnline(side.pt1 line) )
{
if( side.pt1.x > side.pt2.x ) count++;
}
else if( IsOnline(side.pt2 line) )
{
if( side.pt2.x> side.pt1.x ) count++;
}
else if( Intersect(line side) )
{
count++;
}
}
if ( count % 2 == 1 ) {return 0;}
else { return 1;}
}
//****************************************************************
void main()
{
int n;
double xy;
Point pt1;
cout<<“请输入一点:“< cin>>x>>y;
pt1.x=x;
pt1.y=y;
cout<<“点坐标为:(“<
Polygon poly;
cout<<“请输入多边形的边数:“< cin>>n;
for(int i=0;i {
double mj;
cout<<“请输入第“< cin>>m>>j;
Point pt;
pt.x=m;
pt.y=j;
poly.push_back(pt);
}
//cout<<“多边形的边数“< bool retur;
retur=InPolygon(poly pt1);
if(retur==1)
cout<<“点在多边形外!“< else
cout<<“点在多边形内!“<
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 31521 2011-03-24 21:53 点在多边形内Y轴C++\Debug\PInP.obj
文件 241724 2011-03-24 21:53 点在多边形内Y轴C++\Debug\PInPVC.exe
文件 296968 2011-03-24 21:53 点在多边形内Y轴C++\Debug\PInPVC.ilk
文件 1281284 2011-03-11 18:52 点在多边形内Y轴C++\Debug\PInPVC.pch
文件 582656 2011-03-24 21:52 点在多边形内Y轴C++\Debug\PInPVC.pdb
文件 74752 2011-03-24 21:57 点在多边形内Y轴C++\Debug\vc60.idb
文件 94208 2011-03-24 21:52 点在多边形内Y轴C++\Debug\vc60.pdb
文件 2820 2011-03-24 21:52 点在多边形内Y轴C++\PInP.cpp
文件 4282 2011-03-11 19:13 点在多边形内Y轴C++\PInPVC.dsp
文件 520 2011-03-11 18:50 点在多边形内Y轴C++\PInPVC.dsw
文件 41984 2011-03-24 21:57 点在多边形内Y轴C++\PInPVC.ncb
文件 53760 2011-03-24 21:57 点在多边形内Y轴C++\PInPVC.opt
文件 246 2011-03-24 21:54 点在多边形内Y轴C++\PInPVC.plg
目录 0 2011-03-24 21:52 点在多边形内Y轴C++\Debug
目录 0 2011-03-24 21:57 点在多边形内Y轴C++
----------- --------- ---------- ----- ----
2706725 15
- 上一篇:一个简单的移位密码的解密算法
- 下一篇:并行蚁群算法解决旅行商问题
相关资源
- MFC 用SOCKET实现图片分包传送和接收并
- GPIB_VC++ 开发库及
- 挂机锁原理与实现vc++源代码
- 场景渲染 蓝天 白云模拟程序二
- VC++ 实现FTP客户端与服务器
- Ftp服务器与客户端VC++完整版源码
- 解决System.Data.SQLite兼容32位和64位问题
- 用VC++显示图像的灰度直方图
- VC++开发基于Microsoft Speech SDK的TTS软件
- VC++ MFC入门精讲.PPT
- stdafx.h头文件
- VC++串口操作的代码及文档
- VC++病毒编程入门
- 美国Delta Tau公司PMAC多轴运动控制卡的
- 个人资源管理
- VC++获取系统信息/获取OS/获取MAC/获取
- VC++五子棋程序源码VC6.0控制台下运行
- VC++编写USB接口通信程序
- vc++ tcp 客户端和服务器端
- JPEG图片EXIF信息提取及缩略图显示VC
- MFC中的多线程同步
- VC++的.cpp文件调用CUDA的.cu文件中的函
- 感染EXE文件的VC++源码请谨慎使用.
- 自学VC++2010;用ADO方法在ACCESS2010数据
- vc++判断显示器是否支持多点触摸
- DLL转VC++格式的lib、转C++builder格式的
- VC++ 漂亮的启动界面 渐隐渐现启动特
- VC++编写的交通灯控制程序
- 分治法求格雷码的C语言代码
- vc++ 数据采集卡编程
评论
共有 条评论