转载一篇文章试试 C#判断点在线段的左右侧
2012-08-23 18:46
369 查看
要判断一个点在一条线段的左侧还是右侧,从网上查到了这样一个算法。其实本质上就是一个sin角度的计算问题。
设线段端点为从A(x1,y1)到B(x2,y2),线外一点P(x0,y0),判断该点位于有向线A—B的那一侧。
a=(x2-x1,y2-y1)
b=(x0-x1,y0-y1)
axb=|a||b|sinα (α为两向量的夹角)
|a||b| !=0时,axb决定点P的位置
所以axb的Z方向大小决定P位置
(x2-x1)(y0-y1)-(y2-y1)(x0-x1)>0 左侧
(x2-x1)(y0-y1)-(y2-y1)(x0-x1)<0 右侧
(x2-x1)(y0-y1)-(y2-y1)(x0-x1)=0 在线段上
然后具体实现了一下,实现代码如下:poiM为线外的点
设线段端点为从A(x1,y1)到B(x2,y2),线外一点P(x0,y0),判断该点位于有向线A—B的那一侧。
a=(x2-x1,y2-y1)
b=(x0-x1,y0-y1)
axb=|a||b|sinα (α为两向量的夹角)
|a||b| !=0时,axb决定点P的位置
所以axb的Z方向大小决定P位置
(x2-x1)(y0-y1)-(y2-y1)(x0-x1)>0 左侧
(x2-x1)(y0-y1)-(y2-y1)(x0-x1)<0 右侧
(x2-x1)(y0-y1)-(y2-y1)(x0-x1)=0 在线段上
然后具体实现了一下,实现代码如下:poiM为线外的点
1 | private string funReturnRightOrLeft(IPoint poiA,IPoint poiB,IPoint poiM) |
2 | { |
3 | string strResult = "" ; |
4 | double ax = poiB.X - poiA.X; |
5 | double ay = poiB.Y - poiA.Y; |
6 | double bx = poiM.X - poiA.X; |
7 | double by = poiM.Y - poiA.Y; |
8 | double judge = ax * by - ay * bx; |
9 | if (judge>0) |
10 | { |
11 | strResult= "LEFT" ; |
12 | } |
13 | else if (judge<0) |
14 | { |
15 | strResult = "RIGHT" ; |
16 | } |
17 | else |
18 | { |
19 | strResult = "ONTHELINE" ; |
20 | } |
21 | return strResult; |
22 | } |
相关文章推荐
- 转载:一篇java与C#的对比文章(英文)
- 转载一篇c#命令行编译的文章
- 转载一篇C++如何调用C#的文章
- 转载一篇c#命令行编译的文章
- 转载一篇关于“clock skew”的文章
- 转载一篇ClickOnce的文章!
- 转载知乎一篇关于大数据生态技术的文章
- 来一篇英文转载文章---magento----widgets
- 华为boss力荐公司高层看的一篇文章,真的很经典!!![转载]
- (转载)一篇很有意思的文章,关于C语言学习的。
- 转载一篇 sql 数据库锁的文章
- 转载一篇介绍D3DPOOL和Lock的文章
- 转载一篇理解堆和栈区别的好文章
- 分享一篇文章C语言字节对齐问题(适用于C++)转载至http://blog.csdn.net/21aspnet/article/details/6729724
- 一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发
- [优秀英文技术文章转载]Table Value Parameters in SQL Server 2008 and .NET (C#)
- 转载一篇写得不错的UCOS-II移植文章
- 转载一篇理解堆和栈区别的好文章
- 华为boss力荐公司高层看的一篇文章,真的很经典!!![转载]
- 转载一篇介绍sql语句left join,right join,inner join的文章