Gre*_*ill 17
通常,
在伪代码中,
theta = atan2(P1.y-P0.y, P1.x-P0.x)
P3.x = P0.x + r * cos(theta)
P3.y = P0.y + r * sin(theta)
Run Code Online (Sandbox Code Playgroud)
从圆的中心和半径,您可以编写描述圆的方程.从两点P0和P1,您可以编写描述该线的等式.
所以你有两个未知数的方程,你可以通过替换来解决.
设(x0,y0)=点P0的坐标
并且(x1,y1)=点P1的坐标
并且r =圆的半径.
圆的等式是:
(x-x0)^2 + (y-y0)^2 = r^2
Run Code Online (Sandbox Code Playgroud)
该线的等式是:
(y-y0) = M(x-x0) // where M = (y1-y0)/(x1-x0)
Run Code Online (Sandbox Code Playgroud)
将第二个等式插入第一个等式给出:
(x-x0)^2*(1 + M^2) = r^2
x - x0 = r/sqrt(1+M^2)
Run Code Online (Sandbox Code Playgroud)
同样你可以找到它
y - y0 = r/sqrt(1+1/M^2)
Run Code Online (Sandbox Code Playgroud)
点(x,y)是直线与圆之间的交点,(x,y)是你的答案.
P3 = (x0 + r/sqrt(1+M^2), y0 + r/sqrt(1+1/M^2))
Run Code Online (Sandbox Code Playgroud)
你有一个方程组.圆圈定义如下:x^2 + y^2 = r^2.该行定义为y = y0 + [(y1 - y0) / (x1 - x0)]·(x - x0).将第二个替换为第一个,你得到x^2 + (y0 + [(y1 - y0) / (x1 - x0)]·(x - x0))^2 = r^2.解决这个问题,你将获得x的0-2值.将它们插回到任一等式中以获得y的值.
去找这个代码......节省时间
private boolean circleLineIntersect(float x1, float y1, float x2, float y2, float cx, float cy, float cr ) {
float dx = x2 - x1;
float dy = y2 - y1;
float a = dx * dx + dy * dy;
float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
float c = cx * cx + cy * cy;
c += x1 * x1 + y1 * y1;
c -= 2 * (cx * x1 + cy * y1);
c -= cr * cr;
float bb4ac = b * b - 4 * a * c;
if(bb4ac<0){
return false; // No collision
}else{
return true; //Collision
}
}
Run Code Online (Sandbox Code Playgroud)