当前位置: 首页 > news >正文

Unity中判断平面上两条线段是否有交点代码参考

        一般的写法参考如下:

bool IsSegmentsIntersect(Vector2 a, Vector2 b, Vector2 c, Vector2 d)
{Vector2 ab = b - a;Vector2 ac = c - a;Vector2 ad = d - a;Vector2 cd = d - c;Vector2 ca = a - c;Vector2 cb = b - c;float crossAB_AC = CrossProduct(ab, ac);float crossAB_AD = CrossProduct(ab, ad);float crossCD_CA = CrossProduct(cd, ca);float crossCD_CB = CrossProduct(cd, cb);// Check general caseif (crossAB_AC * crossAB_AD < 0 && crossCD_CA * crossCD_CB < 0) return true;// Check special cases where points are collinearif (Mathf.Approximately(crossAB_AC, 0) && IsPointOnSegment(c, a, b)) return true;if (Mathf.Approximately(crossAB_AD, 0) && IsPointOnSegment(d, a, b)) return true;if (Mathf.Approximately(crossCD_CA, 0) && IsPointOnSegment(a, c, d)) return true;if (Mathf.Approximately(crossCD_CB, 0) && IsPointOnSegment(b, c, d)) return true;return false;float CrossProduct(Vector2 a, Vector2 b) { return a.x * b.y - a.y * b.x; }bool IsPointOnSegment(Vector2 p, Vector2 a, Vector2 b) { return Mathf.Min(a.x, b.x) <= p.x && p.x <= Mathf.Max(a.x, b.x) && Mathf.Min(a.y, b.y) <= p.y && p.y <= Mathf.Max(a.y, b.y); }
}

        但是有些时候可能我们需要判断大量的线段互相之间是否相交,而且大部分情况是不相交的,我门希望能够快速判断出不相交的结果,这时候需要使用包围盒来提升速度,代码参考如下:

bool IsSegmentsIntersect(Vector2 a, Vector2 b, Vector2 c, Vector2 d)
{if (!BoundingBoxCheck(a, b, c, d)) return false;Vector2 ab = b - a;Vector2 ac = c - a;Vector2 ad = d - a;Vector2 cd = d - c;Vector2 ca = a - c;Vector2 cb = b - c;float crossAB_AC = CrossProduct(ab, ac);float crossAB_AD = CrossProduct(ab, ad);float crossCD_CA = CrossProduct(cd, ca);float crossCD_CB = CrossProduct(cd, cb);if (crossAB_AC * crossAB_AD < 0 && crossCD_CA * crossCD_CB < 0)return true;if (Mathf.Approximately(crossAB_AC, 0) && IsPointOnSegment(c, a, b)) return true;if (Mathf.Approximately(crossAB_AD, 0) && IsPointOnSegment(d, a, b)) return true;if (Mathf.Approximately(crossCD_CA, 0) && IsPointOnSegment(a, c, d)) return true;if (Mathf.Approximately(crossCD_CB, 0) && IsPointOnSegment(b, c, d)) return true;return false;bool BoundingBoxCheck(Vector2 a, Vector2 b, Vector2 c, Vector2 d) { return Mathf.Max(a.x, b.x) >= Mathf.Min(c.x, d.x) && Mathf.Max(c.x, d.x) >= Mathf.Min(a.x, b.x) && Mathf.Max(a.y, b.y) >= Mathf.Min(c.y, d.y) && Mathf.Max(c.y, d.y) >= Mathf.Min(a.y, b.y); }float CrossProduct(Vector2 a, Vector2 b) { return a.x * b.y - a.y * b.x; }bool IsPointOnSegment(Vector2 p, Vector2 a, Vector2 b) { return Mathf.Min(a.x, b.x) <= p.x && p.x <= Mathf.Max(a.x, b.x) && Mathf.Min(a.y, b.y) <= p.y && p.y <= Mathf.Max(a.y, b.y); }
}


http://www.mrgr.cn/news/38813.html

相关文章:

  • leetcode641. 设计循环双端队列
  • Vue 之组件插槽Slot用法(组件间通信一种方式)
  • 磁盘管理器
  • python 02 List
  • C#知识|基于反射和接口实现抽象工厂设计模式
  • 四个方法,隐藏word文件中的内容!
  • 零基础学习AI大模型,手把手带你从入门到实践!看过的已经月入6w了!
  • 【Python大语言模型系列】开源机器人对话系统框架RASA介绍与使用(案例分析)
  • 电子相册|智能化电子相册|基于java的电子相册管理系统设计与实现(源码+数据库+文档)
  • 【吊打面试官系列-MySQL面试题】优化MySQL数据库的方法?
  • win10安装Java闪退
  • 我把「国产Sora」接入了「小爱」,邀你免费体验
  • GAMES101(21~22节,动画和仿真)
  • 远程服务器安装anaconda并创建虚拟环境
  • 基于python+spark的外卖餐饮数据分析系统设计与实现(含论文)-Spark毕业设计选题推荐
  • LLM基础概念:RAG
  • 【系统方案】智慧城市大数据平台建设方案(Word)
  • GCC使用入门
  • HAL库I2C通用驱动程序(HAL I2C Generic Driver)
  • H.264编解码工具 - NVIDIA CUDA