算法代码参考如下:

using System;
using UnityEngine;[Serializable]
public struct Circle
{public Vector2 center;public float radius;
}[Serializable]
public struct Segment
{public Vector2 pointA;public Vector2 pointB;
}public class CircleIntersect
{static public bool TryCircleIntersect(Circle circleA, Circle circleB, out Vector2 p0, out Vector2 p1){float dist, a, h;p0 = Vector2.zero;p1 = Vector2.zero;dist = Vector3.Distance(circleA.center, circleB.center);if (dist > circleA.radius + circleB.radius) return false;if (Vector2.Distance(circleB.center, circleA.center) + circleA.radius < circleB.radius) return false;if (Vector2.Distance(circleB.center, circleA.center) + circleB.radius < circleA.radius) return false;//a = (circleA.radius * circleA.radius - circleB.radius * circleB.radius + dist * dist) / (2 * dist);h = Mathf.Sqrt(circleA.radius * circleA.radius - a * a);Vector2 P2 = (circleB.center - circleA.center);P2 = (P2 * (a / dist));P2 = (P2 + circleA.center);float x0, y0, x1, y1 = 0;x0 = P2.x + h * (circleB.center.y - circleA.center.y) / dist;y0 = P2.y - h * (circleB.center.x - circleA.center.x) / dist;x1 = P2.x - h * (circleB.center.y - circleA.center.y) / dist;y1 = P2.y + h * (circleB.center.x - circleA.center.x) / dist; ;p0 = new Vector2(x0, y0);p1 = new Vector2(x1, y1);return true;}static public int TrySegmentIntersect(Circle circle, Segment segment, out Vector2 p0, out Vector2 p1){float t;var dx = segment.pointB.x - segment.pointA.x;var dy = segment.pointB.y - segment.pointA.y;var a = dx * dx + dy * dy;var b = 2 * (dx * (segment.pointA.x - circle.center.x) + dy * (segment.pointA.y - circle.center.y));var c = (segment.pointA.x - circle.center.x) * (segment.pointA.x - circle.center.x) + (segment.pointA.y - circle.center.y) * (segment.pointA.y - circle.center.y) - circle.radius * circle.radius;var determinate = b * b - 4 * a * c;if ((a <= 0.0000001) || (determinate < -0.0000001)){p0 = Vector2.zero;p1 = Vector2.zero;return 0;}if (determinate < 0.0000001 && determinate > -0.0000001){t = -b / (2 * a);p0 = new Vector2(segment.pointA.x + t * dx, segment.pointA.y + t * dy);p1 = Vector2.zero;return 1;}t = (float)((-b + Mathf.Sqrt(determinate)) / (2 * a));p0 = new Vector2(segment.pointA.x + t * dx, segment.pointA.y + t * dy);t = (float)((-b - Mathf.Sqrt(determinate)) / (2 * a));p1 = new Vector2(segment.pointA.x + t * dx, segment.pointA.y + t * dy);return 2;}
}

求两个圆交点的算法和圆与直线交点算法相关推荐

  1. 求两点连线与其中一点为球心球的交点——赋MATLAB代码

    在轨迹规划过程中,常将其它智能体视为具有一定半径的球形障碍物(或圆形障碍物).若求智能体与障碍物最近的边缘点,其本质即求两点连线与其中一点为球心球的交点. 求的方法有多种,这里采用雅克比矩阵的方法. ...

  2. DDA画线算法+代码详解-直线扫描算法之一

    #DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...

  3. c语言求两个数的最小公倍数辗转相除法,C语言辗转相除法求2个数的最小公约数...

    辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...

  4. 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky

    接上文 计算机图形学 学习笔记(三):多边形的区域填充算法,反走样算法 光栅图形学算法 本文主要讲解直线裁剪算法. 裁剪 使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的知识图形 ...

  5. md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?

    算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发.软件开发工作不是按部就班,而是选择一种最合理的算法去实现项目功能.算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程 ...

  6. 直线检测算法博文中缺失的几个源码(Hough_line、LSD、FLD、EDlines、LSWMS、CannyLines、MCMLSD、LSM)

    直线检测在我们的图像处理算法中是非常重要的. 博文https://blog.csdn.net/WZZ18191171661/article/details/101116949 对常用的直线检测算法进行 ...

  7. js求两圆交点_谈谈求线段交点的几种算法(js实现,完整版)

    "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法总结一下, 希望对大家有所帮助. ...

  8. js求两圆交点_详解js实现线段交点的三种算法

    本文讲的内容都很初级, 主要是面向和我一样的初学者, 所以请各位算法帝们轻拍啊 引用 已知线段1(a,b) 和线段2(c,d) ,其中a b c d为端点, 求线段交点p .(平行或共线视作不相交) ...

  9. java 圆的交点_java求两个圆相交坐标

    最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...

  10. 求两圆相交的交点的方法

    最近研究三角定位算法,研究了下怎样求两圆的交点,现给出求解方法:

最新文章

  1. Python 之 matplotlib (十二) subplot
  2. 腾讯AI战略详解:技术社会与创新图景 | 2017互联网科技创新白皮书重磅首发
  3. 洛谷P3006 [USACO11JAN]瓶颈Bottleneck(堆模拟)
  4. HA2795Billboard 可用线段树
  5. SQL Server 2005/2008 导入导出数据常见报错
  6. SharePoint项目中新建类库的错误处理及项目建设中遇到的问题总结
  7. android 版本更新工具类_报表分析工具FastReport .Net 2021年超大版本更新,实现了对.NET 5的支持...
  8. phabricator mysql_Phabricator服务的搭建
  9. 【玖哥乱弹】程序员如何成为别人的男朋友
  10. 火山安卓定义全局变量【博客教学】
  11. 《我是一只IT小小鸟》读书笔记
  12. java weblogic 下载_JAVA_weblogic企业级技术 PDF 下载
  13. 一个从培训机构出来的程序员
  14. 杜邦线改成焊线_排线和杜邦线有什么区别
  15. android Holo UI框架,Holo风格的开源中国Android客户端——持续更新(2)
  16. js如何区分单击与双击(如何避免双击的时候触发单击事件)
  17. 知识图谱从入门到应用——知识图谱的知识表示:基础知识
  18. 制作自己的openwrt刷机包_openwrt刷机教程
  19. 数据库实验一:数据库与数据表定义(2)—— 数据表相关操作
  20. 哪位知道基带怎么修复?

热门文章

  1. 怎么把PDF文件拆分开来?教你两种拆分方法
  2. 如何查看电脑的上一次开机时间
  3. Linux tmpfs是什么
  4. 单元格中添加自适应斜线
  5. java微信扫码支付_java 微信扫码支付 示例代码
  6. 【泛函分析】巴拿赫空间
  7. 传说中的Linux三剑客命令之grep(三剑客老幺)别人只知道了而我却做到了
  8. 解决方案:集团型施工企业安全生产数字化管理系统
  9. 关于IE、Firefox、Opera页面呈现异同 (转于纯蓝)
  10. 颜色搭配之BUTTONS 1.0