判断一个点是否在多边形内C#
2016-03-18 12:25
471 查看
//判断点在线的一边
public int isLeft(Vector2 P0, Vector2 P1, Vector2 P2)
{
int abc = (int)((P1.X - P0.X) * (P2.Y - P0.Y) - (P2.X - P0.X) * (P1.Y - P0.Y));
return abc;
}
[csharp] view
plain copy
//判断点pnt是否在region内主程序
private bool isInRegion(Vector2 pnt , List<Vector2> region)
{
int wn = 0, j = 0; //wn 计数器 j第二个点指针
for (int i = 0; i < region.Count; i++)
{
//开始循环
if (i == region.Count - 1)
{
j = 0;//如果 循环到最后一点 第二个指针指向第一点
}
else
{
j = j + 1; //如果不是 ,则找下一点
}
if (region[i].Y <= pnt.Y) // 如果多边形的点 小于等于 选定点的 Y 坐标
{
if (region[j].Y > pnt.Y) // 如果多边形的下一点 大于于 选定点的 Y 坐标
{
if (isLeft(region[i], region[j], pnt) > 0)
{
wn++;
}
}
}
else
{
if (region[j].Y <= pnt.Y)
{
if (isLeft(region[i], region[j], pnt) < 0)
{
wn--;
}
}
}
}
if (wn == 0)
{
return false;
}
else
{
return true;
}
}
public int isLeft(Vector2 P0, Vector2 P1, Vector2 P2)
{
int abc = (int)((P1.X - P0.X) * (P2.Y - P0.Y) - (P2.X - P0.X) * (P1.Y - P0.Y));
return abc;
}
[csharp] view
plain copy
//判断点pnt是否在region内主程序
private bool isInRegion(Vector2 pnt , List<Vector2> region)
{
int wn = 0, j = 0; //wn 计数器 j第二个点指针
for (int i = 0; i < region.Count; i++)
{
//开始循环
if (i == region.Count - 1)
{
j = 0;//如果 循环到最后一点 第二个指针指向第一点
}
else
{
j = j + 1; //如果不是 ,则找下一点
}
if (region[i].Y <= pnt.Y) // 如果多边形的点 小于等于 选定点的 Y 坐标
{
if (region[j].Y > pnt.Y) // 如果多边形的下一点 大于于 选定点的 Y 坐标
{
if (isLeft(region[i], region[j], pnt) > 0)
{
wn++;
}
}
}
else
{
if (region[j].Y <= pnt.Y)
{
if (isLeft(region[i], region[j], pnt) < 0)
{
wn--;
}
}
}
}
if (wn == 0)
{
return false;
}
else
{
return true;
}
}
相关文章推荐
- C#中timer类
- C#可扩展编程之MEF学习
- 5天玩转C#并行和多线程编程
- C# - 重定义一个接口的实现
- C# - 自定义 DataSet 的使用
- C# - ADO.Net 调用存储过程
- C# - 序列化与反序列化
- C#:让控件TextBox的滚动条保持在最下方
- C#:判断一个String是否为数字
- C#:读取配置文件
- C#:获取时间年月日时分秒格式
- C#:占位符的例子
- C# 委托的三种调用示例(同步调用 异步调用 异步回调)
- C# 委托及各种写法
- C#那20道题
- 关于Threading.Timer不工作
- C# 基于SharpPcap的局域网数据包捕获 之一 说在前面
- C# 禁止datagridview 自动产生列
- C# 根据类名称创建类示例
- 【C#进阶系列】12 泛型