java 线段和点_java – 圆和线段交叉

>我有一个线段(开始x1,y1,结束x2,y2(假设D = 5))和a

圆(半径R,中心x3,y3)

如果我的线段与我的圆相交,我该如何检查?

解决方法:

作为初步检查,您可以使用叉积来计算点和线之间的距离:

(x1,y1) = p1, (x2,y2) = p2

(cx, cy) = c = circle center

delta = p2 - p1 (the difference vector)

unit = delta/norm(delta) (the unit vector along the line segment)

(c-p1) x unit = (cx-x1) * unity - (cy-y1) * unitx = d (distance of the circle center to the line)

注意,d有一个方向(符号).

如果d在[-R,R]范围之外,则线段不能与圆相交.

如果您的线段不会移动太多,您可以保存单位矢量以供以后重复使用.

如果圆确实与线相交(而不是线段),则它可能仍然不与线段相交.检查以下三个条件:

> p1位于圆圈内;范数(p1-c)< [R

> p2位于圆圈内;范数(p2-c)< [R

>从圆到圆心的最近点位于p1和p2之间:

(单位.p1< unit.c< unit.p2)或(单位.p2< unit.c< unit.p1)其中.是矢量点积.

如果这些条件都不成立,则它们不相交.

您可能还需要知道它们相交的位置:

perp = (-unity, unitx) (The perpendicular vector)

pclosest = perp * d + c (The point on the line closest to the circle center)

dline = sqrt(R^2 - d^2) (The distance of the intersection points from pclosest)

i{1,2} = ±dline * unit + pclosest

你显然需要分别检查i {1,2}是否位于p1和p2之间,就像我们在上面的第三个条件中所做的那样.

标签:java,math,line,circle

来源: https://codeday.me/bug/20190530/1184657.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值