在recast中遇到的一个操作,判断点是在线段的左边还是右边
判断在左边和右边在很多场景都有用到,是计算机几何中比较基础的概念。比如判断是凹多边形还是凸多边形;判断点是凹点还是凸点;判断线段是否相交;判断两点是否在线段两侧等等。

如https://blog.csdn.net/qiushangren/article/details/90446381
这篇博客所说,顺时针方向 三点组成的向量的叉积z值为负,逆时针方向三点组成的向量的叉积z值为正。这个可以反过来用于求点在线段的左右。
首先左右不能用客观的视角来定,应该从向量的角度去判断。所以先将线段转换成向量,需要注意的是向量是有方向的有起止的。

如上,在xy平面上有线段AB(注意A为起点,B为终点)组成向量AB,存在点C1和C2,组成三角形ABC2和三角形ABC1。很明显ABC2组成一个顺时针方向的三个点,ABC1 组成了逆时针方向的三个点(注意这里的三角形必须包含了 向量AB)。
根据上面链接的博客可以很轻松的看出,

ABxAC2>0 而 ABxAC1<0 (叉乘,不是点乘),(注意都是以A为起点,也就是以已知向量的起点为起点)。

如果线段AB组成向量为BA,则
BAxBC2<0 而 BAxBC1 >0(注意这里都是以B为起点,以已知向量的起点为起点)。

总结:如果以AB的方向来判定,那么C1就是在AB的右边,C2就是在AB的左边,假设三角形顶点顺序为ABC ,可以看到如果用ABC1组装三角形,那么就是顺时针的,如果ABC2组装三角形,那就是逆时针的;如果以BA来判定,那C2在BA右边,C1在BA的左边,假设三角形顶点顺序为BAC,BAC1为逆时针,BAC2位顺时针。可以推断如果在左边,那么顺序就是逆时针;如果在右边,那么顺序就是顺时针。反过来也一样,顺时针表示在右边,逆时针表示在左边。ABxAC(注意A为起始点),使用右手定则,顺时针为求出的结果(z)为负数,逆时针为求出的结果(z)正数。

//判断线段是否相交
static int overlapSegSeg2d(const float* a, const float* b, const float* c, const float* d)
{const float a1 = vcross2(a, b, d); const float a2 = vcross2(a, b, c);if (a1*a2 < 0.0f) { //相乘结果为负,说明一左一右。 说明c和d分别分布在ab的两侧。c和d没有分布在两侧,肯定是不相交。float a3 = vcross2(c, d, a);float a4 = a3 + a2 - a1; //a4 = vcross2(c,d,b)。可以用四个点坐标计算一下,确实相等。if (a3 * a4 < 0.0f)return 1;//如果a和b也分布在cd两侧就说明相交}return 0;
}//假设a(x1,y1) b(x2,y2) c(x3,y3) d(x4,y4)
//b-a = (x2-x1),(y2-y1) ,d-a=(x4-x1),(y4-y1) =>
//a1 = (b-a)x(d-a) = (x2-x1)*(y4-y1)-(x4-x1)*(y2-y1)
//a2 = (b-a)x(c-a) = (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)
//a3 = (d-c)x(a-c) = (x4-x3)*(y1-y3)-(x1-x3)*(y4-y3)
//a4 = a3+a2-a1 =a3 +  (x2-x1)*(y3-y4)-(x3-x4)*(y2-y1)
// =a3 + (x4-x3)*(y2-y1)-(x2-x1)*(y4-y3) = (x4-x3)*(y2-y3)-(x2-x3)*(y4-y3) 

判断点是凹点还是凸点:取目标点和目标点相邻的两个点,按逆时针方向,将目标点与前面的点相连成线段,判断目标点后面的点是否在线段的左边还是右边,如果在左边,则说明是凸点,否则是凹点。

判断是凹多边形还是凸多边形:按逆时针方向判断所有 边的下一个点(逆时针方向与边相邻的点) 是否都在边的左边,如果都在左边说面是凸多边形。也可以按顺时针方向来,判断是否在右边。

判断两点是否在线段两侧:直接判断一个点在左边一个点在右边。

判断线段是否相交:假设两条线段a,b。先计算两线段的bound是否相交做个快速排除,再判断线段a的两个顶点是否都在线段b的两侧,再判断线段b的两个顶点是否在线段a的两侧,如果两个条件都满足,则a b相交,否则不相交。(求交点)

判断点在线段的左边还是右边 判断线段是否相交相关推荐

  1. 判断点在有向线段的左边还是右边

    判断平面上的点与有向线段的位置关系是计算几何里面的最基本的问题,求解该问题的算法主要运用在凸壳的构造方面,如三角形,凸多变形的构造.网上最流行的两种判别方法是面积法和向量法,但这两种方法本质上是一样的 ...

  2. 判断点在直线的左边还是右边

    我之前使用的方法是3 参考: https://www.cnblogs.com/carekee/articles/2299546.html 判断点在线的左边.右边 判断点在线的左边还是右边在构建三角网时 ...

  3. 判断点在线的左边、右边

    判断点在线的左边还是右边在构建三角网时是非常重要的 以及两点p1(x1,y1),p2(x2,y2),判断点p(x,y)在线的左边还是右边. 1. bool LeftOfLine(const ZCoor ...

  4. Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?

    如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...

  5. 检测某向量在另一向量的左边还是右边

    /// <summary> /// 检测某向量在另一向量的左边还是右边.为判断报亭在车行路线的左边还是右边. /// </summary> /// <param name ...

  6. textview 垂直居中_在Textview左边或右边添加图标 ,换行不错位

    平日开发过程中,我们难免会遇到一些图文混排的格式,文字,自然是利用TextView控件去实现,若是单行文字,相信无论是左边还是右边添加图片对小伙伴们来说都不是难事,而且可以利用drawableleft ...

  7. html 右边是iframe 左右结构_HTML布局之左右结构,左边固定右边跟据父元素自适应...

    HTML布局之左右结构,左边固定右边跟据父元素自适应,兼容IE6+.Firefox.Chrome.Opera.Safari,这里是用表单写的一个demo,其实就在主体布局中也是可以的,比如像后台一些管 ...

  8. java中 菜单的触发事件_javaweb ajax+div实现左边菜单右边内容时点击菜单应该触发事件但是右边没反应...

    这样写点击左边菜单时无论怎么点击,叫content那个div都没有内容都不会更新,我猜是不是css的问题 这是代码,请问在此基础上要怎么写才能实现左边菜单右边内容呢 JSP Page 22222333 ...

  9. savefiledialog对话框的取消和确定按钮分别返回一个什么值?_确定按钮该放在左边还是右边?...

    更新优化一下. 英国的人机交互课题都喜欢研究一些和文化.游戏.智能硬件.弱势群体之类的"大课题",而我却偏喜欢琢磨一些接地气的东西,比如说:确定按钮应该放在左边还是右边? 做PC端 ...

最新文章

  1. Dataset:数据集集合(NLP方向数据集)——常见的自然语言处理数据集大集合(建议收藏,持续更新)
  2. 湊湊很好,但依旧“难撑”呷哺呷哺的野心
  3. mysql存储过程中文乱码_mysql存储过程碰到中文乱码问题
  4. 如何提高SSD的使用寿命
  5. Grok解析 centos 的 nginx 原生格式日志
  6. vim替换字符串带斜杠_Linux vi/vim最全使用指南
  7. mpvue 微信小程序设置背景音乐
  8. hadoop-1.2.1运行过程中遇到的问题
  9. springboot菜鸟入门
  10. 中职计算机组装与维修知识点,中职计算机组装与维修的教学分析与对策
  11. 教你分割视频,几分钟快速分割多个视频
  12. 3.8 main.js-常用配置【uni-app教程uniapp教程(黄菊华-跨平台开发系列教程)】
  13. 2020五四青年节 | 青年人在美团是怎样成长的?
  14. 2021第十三届中国最佳酒店大奖榜单揭晓:年度最佳酒店、最佳顶级奢华酒店、最佳城市地标酒店...
  15. 3分钟理解zookeeper的watcher机制
  16. JS自定义元素节点/属性的使用 createElement、setAttribute、getAttribute、appendChild
  17. 计算机系统设计原理下,计算机系统设计的定量原理
  18. 学生管理系统登录界面/接口---简单前后端连接
  19. 英利确认银监会力推公司债务重组 正在接洽实力战投
  20. FTP:FTP状态码对照

热门文章

  1. php空间自动发邮件,PHP 发送QQ邮件【实例】
  2. c#使用Aspose实现Word域套打
  3. 无法安装64位office,因为已有32位版本……解决办法
  4. java 邮件 客户端_JAVA编写ESMTP客户端发送邮件代码
  5. Cross-modality Person re-identification with Shared-Specific Feature Transfer笔记
  6. 突破微软远程桌面帧率限制
  7. java 内存溢出 扩大jvm内存
  8. 虚拟机 CentOS7 SecureCRT连接 CentOS连接不了网问题
  9. 2019暑假集训感触与收获
  10. Docker下搭建XSS挑战之旅靶场