Java 直线段和圆之间交点的LibGDX坐标

Java 直线段和圆之间交点的LibGDX坐标,java,libgdx,Java,Libgdx,我正在使用LibGDX,我有一条线段(x1,y1,x2,y2)与圆心(cx,cy)和半径R相交 如何使用LibGDX(或纯Java)确定交点的坐标 我检查了Intersector.intersectSegmentCircle方法,但该方法只返回true或false,不返回交点坐标 非常感谢您的帮助。这不是一个真正的答案,但对于评论来说太长,并且使用的格式仅适用于答案 要从数学上找到交点,需要解两个联立方程组。一个代表圆,一个代表直线 通过搜索互联网,你可以很容易地找到这些方程的形式 圆:(x

我正在使用LibGDX,我有一条线段(x1,y1,x2,y2)与圆心(cx,cy)和半径R相交

如何使用LibGDX(或纯Java)确定交点的坐标

我检查了Intersector.intersectSegmentCircle方法,但该方法只返回
true
false
,不返回交点坐标


非常感谢您的帮助。

这不是一个真正的答案,但对于评论来说太长,并且使用的格式仅适用于答案

要从数学上找到交点,需要解两个联立方程组。一个代表圆,一个代表直线

通过搜索互联网,你可以很容易地找到这些方程的形式

  • 圆:(x-h)2+(y-k)2=r2
  • 行:y=mx+c
你可以找到一条直线的方程,在这条直线上有两个点,你可以声称有两个这样的点

您还声称拥有圆的所有数据,即圆心坐标加上半径长度

然后,您需要在Internet上搜索如何用java求解联立方程组。我发现这样的问题:
这是我的解决方案

基本上,我们找到一条直线的参数方程,然后将每个坐标替换为圆的方程,并使用二次公式求解
t
。获得的值用于获取点坐标。有关数学的更深入解释,请参见答案。此外,由于在这种情况下直线不是无限的,因此会进行检查,以查看获得的交点是否与直线所在的矩形相匹配

我使用了和你在图中使用的相同的符号

公共类交叉口{
/**
*返回圆边和直线之间的交点列表。
*@param cx圆心X坐标。
*@param cy圆心Y坐标。
*@param r圆半径。
*@param x1第一行X坐标。
*@param y1第一行Y坐标。
*@param x2第二行X坐标。
*@param y2第二行Y坐标。
*@返回交叉点列表。
*/
公共静态列表getCircleLineIntersectionPoints(
浮点数cx、浮点数cy、浮点数r、浮点数x1、浮点数y1、浮点数x2、浮点数y2){
//查找要在二次公式中使用的值
浮点数dx=x2-x1;
浮动dy=y2-y1;
浮点数a=dx*dx+dy*dy;
浮点数b=2*dx*(x1-cx)+2*dy*(y1-cy);
float c=(float)Math.pow((x1-cx),2)+(float)Math.pow((y1-cy),2)-r*r;
浮点d=b*b-4*a*c;//判别式
ArrayList points=新的ArrayList();
如果(d>=0){
//执行二次公式得到2分
float root=(float)Math.sqrt(d);
浮点数t1=2*c/(-b+根);
浮点数t2=2*c/(-b-根);
//需要检查直线适合的矩形边界
//如果交点在直线边界内
浮点xmin=数学最小值(x1,x2);
浮点ymin=数学最小值(y1,y2);
浮点xmax=数学最大值(x1,x2);
浮点ymax=数学最大值(y1,y2);
//添加第一点
浮点p1x=x1+dx*t1;
浮点数p1y=y1+dy*t1;
if(isPointInRectangle(xmin,ymin,xmax,ymax,p1x,p1y)){
添加(新矢量2(p1x,p1y));
}
//如果有第二点,请添加第二点
if(!MathUtils.isEqual(t1,t2)){
浮点数p2x=x1+dx*t2;
浮点数p2y=y1+dy*t2;
if(isPointInRectangle(xmin,ymin,xmax,ymax,p2x,p2y)){
添加(新向量2(p2x,p2y));
}
}
}
返回点;
}
私有静态布尔isPointInRectangle(
浮点xmin,浮点ymin,浮点xmax,浮点ymax,浮点px,浮点py){
返回px>=xmin&&py>=ymin&&px