2D空间中求线段与圆的交点

出处: https://answers.unity.com/questions/366802/get-intersection-of-a-line-and-a-circle.html
测试脚本(返回值为交点数量):
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class LineCircleIntersect : MonoBehaviour
{
public Transform a;
public Transform b; public Transform circleCenter;
public float radius; void OnDrawGizmos()
{
if (a == null || b == null || circleCenter == null) return; var intersect1 = default(Vector2);
var intersect2 = default(Vector2);
var intersectCount = BetweenLineAndCircle(circleCenter.position, radius, a.position, b.position, out intersect1, out intersect2); if (intersectCount > )
Gizmos.DrawWireSphere(intersect1, 0.1f); if (intersectCount > )
Gizmos.DrawWireSphere(intersect2, 0.1f); Gizmos.DrawLine(a.position, b.position);
Gizmos.DrawWireSphere(circleCenter.position, radius);
} int BetweenLineAndCircle(
Vector2 circleCenter, float circleRadius,
Vector2 point1, Vector2 point2,
out Vector2 intersection1, out Vector2 intersection2)
{
float t; var dx = point2.x - point1.x;
var dy = point2.y - point1.y; var a = dx * dx + dy * dy;
var b = * (dx * (point1.x - circleCenter.x) + dy * (point1.y - circleCenter.y));
var c = (point1.x - circleCenter.x) * (point1.x - circleCenter.x) + (point1.y - circleCenter.y) * (point1.y - circleCenter.y) - circleRadius * circleRadius; var determinate = b * b - * a * c;
if ((a <= 0.0000001) || (determinate < -0.0000001))
{
// No real solutions.
intersection1 = Vector2.zero;
intersection2 = Vector2.zero;
return ;
}
if (determinate < 0.0000001 && determinate > -0.0000001)
{
// One solution.
t = -b / ( * a);
intersection1 = new Vector2(point1.x + t * dx, point1.y + t * dy);
intersection2 = Vector2.zero;
return ;
} // Two solutions.
t = (float)((-b + Mathf.Sqrt(determinate)) / ( * a));
intersection1 = new Vector2(point1.x + t * dx, point1.y + t * dy);
t = (float)((-b - Mathf.Sqrt(determinate)) / ( * a));
intersection2 = new Vector2(point1.x + t * dx, point1.y + t * dy); return ;
}
}
2D空间中求线段与圆的交点的更多相关文章
- 2D空间中求一点是否在多边形内
参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html 一开始没仔细看做法,浪费了不少时间.下面是最终实现的效果: 大致流程: 1.随便选取多边形 ...
- 2D空间中求两圆的交点
出处:https://stackoverflow.com/questions/19916880/sphere-sphere-intersection-c-3d-coordinates-of-colli ...
- [译]2D空间中使用四叉树Quadtree进行碰撞检测优化
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.2.0f3 原文出处 : Quick Tip: Use Quadtrees to Detect Lik ...
- 2D空间中判断一点是否在三角形内
要注意如果是XY坐标轴的2D空间,要取差乘分量z而不是y. 实现原理是,将三角形ABC三个边(AB,BC,CA)分别与比较点判断差乘,如果这3个差乘结果表示的方向一致,说明就在三角形内. 效果: 代码 ...
- 2d游戏中求出一个向量的两个垂直向量
function cc.exports.VerticalVector(vec)--求出两个垂直向量 local result = {} result[1] = cc.p(vec.y/vec.x,-1) ...
- HDU 3467 (求五个圆相交面积) Song of the Siren
还没开始写题解我就已经内牛满面了,从晚饭搞到现在,WA得我都快哭了呢 题意: 在DotA中,你现在1V5,但是你的英雄有一个半径为r的眩晕技能,已知敌方五个英雄的坐标,问能否将该技能投放到一个合适的位 ...
- java求两个圆相交坐标
最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...
- HDU 5572--An Easy Physics Problem(射线和圆的交点)
An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- Gym - 101617F :Move Away (圆的交点)
pro:给定N个圆,求离原点最远的点,满足它在N个圆里.输出这个距离.N<50; sol:关键点一定是圆与圆的交点. 圆与 圆心到原点的直线 的交点. 然后去验证这些关键点是否在N个圆内. 实际 ...
随机推荐
- 关于Maven打包Java Web项目以及热部署插件Jrebel的使用
Java Web/Eclipse/Maven/Tomcat 最近有个新项目是java web项目,记录一下,可能比较乱.虽然没接触过Java,但是eclipse还是用过的 初识项目 同事说,项目是ma ...
- 005.HAProxy+Keepalived高可用负载均衡
一 基础准备 1.1 部署环境及说明 系统OS:CentOS 6.8 64位 HAProxy软件:HA-Proxy version 1.5.18 Keepalived软件:keepalived-1.3 ...
- 目标检测——IoU 计算
Iou 的计算 我们先考虑一维的情况:令 \(A = [x_1,x_2], B = [y_1, y_2]\),若想要 \(A\) 与 \(B\) 有交集,需要满足如下情况: 简言之,要保证 \(A\) ...
- 合并流 SequenceInputStream
SequenceInputStream主要用来将2个流合并在一起,比如将两个txt中的内容合并为另外一个txt.下面给出一个实例: import java.io.File; import java.i ...
- abstract class和interface有什么区别?
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必 ...
- [USACO08DEC]Secret Message
OJ题号: 洛谷2922 思路: 字典树,每个结点记录经过该节点的字符串数cnt和以该结点结尾的字符串数量val. 每次询问时累加经过节点的val值和结尾结点的cnt值. #include<cs ...
- 设置Sublime Text 3的光标样式
升级了Sublime Text 3,结果光标变成了这个样子,非常不习惯: 查了文档http://www.sublimetext.com/3 ,Build 3059中得描述: Added setting ...
- 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别(转)
Activity.finish()Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Act ...
- pom.xml将jar包导入
2.5是Maven的版本
- 2d场景背景无限滚动
之前都是直接借用的DoTween插件,两个背景无限交替位置进行,还有就是三个背景在利用Trigger进行判断显示与否循环: 示例脚本: private List<RectTransform> ...