c# 判断点是否在区域内 点在区域内 在多边形内 判断

方法一 算法 : 

public int isLeft(Point P0, Point P1,Point P2)
{

 int abc= ((P1.X - P0.X) * (P2.Y - P0.Y) - (P2.X - P0.X) * (P1.Y - P0.Y));

return abc;                      

}

private bool PointInFences(Point pnt1, Point[] fencePnts)
{
int wn = 0,j=0; //wn 计数器 j第二个点指针
for (int i = 0; i < fencePnts.Length; i++)
{//开始循环
if (i == fencePnts.Length - 1)
j = 0;//如果 循环到最后一点 第二个指针指向第一点
else
j = j + 1; //如果不是 ,则找下一点


                if (fencePnts[i].Y <= pnt1.Y) // 如果多边形的点 小于等于 选定点的 Y 坐标
                {
if (fencePnts[j].Y > pnt1.Y) // 如果多边形的下一点 大于于 选定点的 Y 坐标
{
if (isLeft(fencePnts[i], fencePnts[j], pnt1) > 0)
{
wn++;
}
}
}
                else
                {
if (fencePnts[j].Y <= pnt1.Y)
{
if (isLeft(fencePnts[i], fencePnts[j], pnt1) < 0)
{
wn--;
}
}
}
}
  if (wn == 0)
return false;
else
return true;
}


方法二 c#内置函数:

GraphicsPath myGraphicsPath = new GraphicsPath();
Region myRegion=new Region();             
myGraphicsPath.Reset();
Point inputponint = new Point(inputx, inputy);


myGraphicsPath.AddPolygon(points);//points);

myRegion.MakeEmpty();

myRegion.Union(myGraphicsPath);  
//返回判断点是否在多边形里
bool myPoint= myRegion.IsVisible(inputponint);
this.lblx.Text = myPoint.ToString();

图形算法:

1,面积法。就是看所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则在内部。反之在外部。这种方法计算量较大,用到的主要计算是查乘。
2,夹角和法。参见三楼,判断所有边和目标点的夹角和是否为360度。计算量比上面这种方法稍微小点,用到主要是点乘和求模计算。
3,引射线法。就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。这是所有方法中计算量最小的方法,在光线追踪算法中有大量的应用。

在C#中的话,有一个Region类,可以直接调用IsVisible判断是否在这个区域内部,我估计内部的实现应该是上面说的第三种方法。主要看你的需求是哪种输入了,如果在C#中,你完全可以用Region类来隐藏内部实现。

另外一种解决方法:

1.         已知点point(x,y)和多边形Polygon(x1,y1;x2,y2;….xn,yn;);

2.         以point为起点,以无穷远为终点作平行于X轴的直线line(x,y; -∞,y);

3.         循环取得(for(i=0;i<n;i++))多边形的每一条边side(xi,yi;xi+1,yi+1),且判断是否平行于X轴,如果平行continue,否则,i++;

4.         同时判断point(x,y)是否在side上,如果是,则返回1(点在多边形
上),否则继续下面的判断;

5.         判断线sideline是否有交点,如果有则count++,否则,i++。

6.         判断交点的总数,如果为奇数则返回0(点在多边形内),偶数则返回2(点在多边形外)。

代码:

/*射线法判断点q与多边形polygon的位置关系,要求polygon为简单多边形,顶点逆时针排列

如果点在多边形内:返回0

如果点在多边形边上:返回1

如果点在多边形外:返回2

*/

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<Point> 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(const Polygon& polygon, Point point)

{

int n = polygon.size();

int count = 0;

LineSegment line;

line.pt1 = point;

line.pt2.y = point.y;

line.pt2.x = - INFINITY;

for( int i = 0; i < n; i++ ) 

{

//得到多边形的一条边

LineSegment side;

side.pt1 = polygon[i];

side.pt2 = polygon[(i + 1) % n];

if( IsOnline(point, side) )

{

return1 ;

}

//如果side平行x轴则不作考虑

if( fabs(side.pt1.y - side.pt2.y) < ESP ) 

{

continue;

}

if( IsOnline(side.pt1, line) ) 

{

if( side.pt1.y > side.pt2.y ) count++;

else if( IsOnline(side.pt2, line) ) 

{

if( side.pt2.y > side.pt1.y ) count++;

else if( Intersect(line, side) ) 

{

count++;

}

}

if ( count % 2 == 1 )

{

return 0;

}

else 

return 2;

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Window服务的创建与删除

Windows服务应用程序是一种需要长期运行的应用程序&#xff0c;它对于服务器环境特别适合。它没有用户界面&#xff0c;并且也不会产生任何可视输出。任何用户消息都会被写进Windows事件日志。计算机启动时&#xff0c;服务会自动开始运行。它们不要用户一定登录才运行&#xf…

python颜色识别_颜色检测python

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https:blog.csdn.netu0121626…

涵盖各种编程语言的深度学习库整理大全!

Python 1. Theano是一个python类库&#xff0c;用数组向量来定义和计算数学表达式。它使得在Python环境下编写深度学习算法变得简单。在它基础之上还搭建了许多类库。 1.Keras是一个简洁、高度模块化的神经网络库&#xff0c;它的设计参考了Torch&#xff0c;用Python语言编写&…

epoll机制

在linux的网络编程中&#xff0c;很长的时间都在使用select来做事件触发。在linux新的内核中&#xff0c;有了一种替换它的机制&#xff0c;就是epoll。相比于select&#xff0c;epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中&#xf…

LSGO软件技术团队与信息1402班开展真人CS活动

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

a标签去掉下划线_解决 v-html 元素中标签样式失效 - Vue

最近在做一个项目&#xff0c;是对富文本编辑器生成的 HTML 渲染到页面中&#xff0c;大家都会想到当然是用 Vue 的 v-html 属性&#xff0c;于是我写下了这样的代码<template><div class"content-html" v-html"article.contentHtml" /> </…

判断 Java 中的空字符串

原文地址&#xff1a;http://www.neoease.com/string-is-empty/ 以下是 Java 判断字符串是否为空的三种方法.方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低.方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法.方法三: Java SE 6.0 才开始提供的方法, 效率和方法…

Socket的send函数在执行时报EAGAIN的错误

Socket的send函数在执行时报EAGAIN的错误] 内容提要: 当客户通过Socket提供的send函数发送大的数据包时&#xff0c;就可能返回一个EGGAIN的错误。该错误产生的原因是由于send 函数中的size变量大小超过了tcp_sendspace的值。tcp_sendspace定义了应用在调用send之前能够在k…

写让别人能读懂的代码

随着软件行业的不断发展&#xff0c;历史遗留的程序越来越多&#xff0c;代码的维护成本越来越大&#xff0c;甚至大于开发成本。而新功能的开发又常常依赖于旧代码&#xff0c;阅读旧代码所花费的时间几乎要大于写新功能的代码。 我前几天看了一本书&#xff0c;书中有这么一句…

python中什么是按位取反_Python学习中的“按位取反”笔记总结

|疑惑 最近在学习Python的过程中了解到位运算符&#xff0c;但对于按位取反有点迷糊&#xff0c;就比如说~9&#xff08;按位取反&#xff09;之后的结果是-10&#xff0c;为什么不是6呢&#xff1f;所以下面就来看看为什么不是6&#xff0c;正确结果是如何计算出来的呢&#x…

非阻IO与EWOULDBLOCK EAGAIN

非阻塞读写 默认 socket 是阻塞的&#xff0c;读写函数 read, readv, recv, recvfrom, recvmsg 以及 write, writev, send, sendto, sendmsg 都有可能会阻塞。可以将 socket 描述字设为非阻塞&#xff0c;这样&#xff0c;当 socket 描述字未就绪时&#xff0c;调用以上读写函…

一起学windows phone7开发(二十一.二 Map控件的简单使用)

1. 注册地图&#xff1a; 在使用地图之前必须先申请register key https://www.bingmapsportal.com/ 将申请到的key填到这个属性&#xff0c;地图才可以正常使用。 CredentialsProvider 属性&#xff1a;填写申请到的Register key。 2.设置中心点&#xff1a; <my:Map Height…

UML类图五种关系与代码的对应关系

UML类图中的五种关系的耦合强弱比较&#xff1a;依赖<关联<聚合<组合<继承 一、依赖关系&#xff1a; &#xff08;一&#xff09;说明 虚线箭头 可描述为&#xff1a;Uses a 依赖是类的五种关系中耦合最小的一种关系。 因为在生成代码的时候&#xff0c;这两个关系…

使用 rapidxml 做配置文件

对于配置文件&#xff0c;一般会选用ini,xml 等等的配置格式。如何快速高效的从文件内读取自己想要的信息是每个做配置文件想要达到的效果。对以小型开发我们并不用时用到msxml这种重量级的解析器。那样会给自己添麻烦的。这里我推荐大家使用rapidxml。 之前使用tinyxml 感觉还…

水晶报表实现(一)

WINFORM下创建水晶报表&#xff1a; 1、新建一个“windows应用程序” 2、添加一个数据集&#xff08;.xsd&#xff09;文件&#xff0c;它是ADO.NET数据集&#xff0c;数据集用于在断开缓存中存储数据&#xff0c;它的结构类似于关系数据库的接口&#xff0c;它公开表、行和列的…

Java swing 实现下拉框和文本框同步显示

想要MyEclipse中的swing中实现下拉框和文本框实现&#xff0c;对下拉框创建MouseEvent、ItemEvent、ActionEvent private void xingbieMouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: setSelectedItem(evt, this.xingbie1); } private v…

python image 转成字节_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍

选自TowardsDataScience作者&#xff1a;George Seif本文转自机器之心(nearhuman2014)本文可以教你仅使用 3 行代码&#xff0c;大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言&#xff0c;它易于使用&#xff0c;也有很多出色的库来帮助你更快处理数据。但…

LSGO软件技术团队内部技术交流【2015-2016(1)第七周】

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

汉字区位码对照表

汉字区位码对照表 a-beibei--cancan-chichi-dada-dongdong-feifei-gege-guoha-huanhuan-jiajia-jingjing-kaokao-langlang-linlin-maimai-momo-nunu-pingping-qieqie-rongrou-shenshen-sisong-titi-weiwei-xiaxia-xuxu-yeye-youyou-zaozao-zhizhi-zizong-zuo 附&#xff1a; 0…

有点憋,说两句

还是QQ和360的那点事。 曾经一度&#xff0c;几年前吧&#xff0c;我也很不喜欢腾讯&#xff0c;觉得它仗着自己在国内即时通讯方面的垄断&#xff0c;不好好做产品&#xff0c;尽想着赚钱。总觉得它在想方设法的勾引你用自己的人民币去换成Q币。总觉得用真正的高素质的网民是用…