这是一张展示问题的图片:
假设我Point A
[0,0]
,Point B
[50, 30]
。我希望找到Point X
的坐标,沿着半径为15
的圆,其原点位于Point A
,它也位于Point A
和{{1}之间的一条线上}}
指出最好的方法吗?
答案 0 :(得分:3)
由于这已被标记为JavaScript,因此这是一个简单的实现:
// disclaimer: code written in browser
function Point2D(x, y) {
this.x = x;
this.y = y;
}
function findCircleInteresction(center, radius, target) {
var vector = new Point2D(target.x - center.x, target.y - target.y);
var length = Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));
var normal = new Point2D(vector.x / length, vector.y / length);
var result = new Point2D(center.x + (normal.x * radius), center.y + (normal.y * radius));
return result;
}
findCircleInteresction(new Point2D(0, 0), 15, new Point2D(50, 30));
Point2D
只是一个用x
和y
属性制作对象的类。
findCircleInteresction
有三个参数:
- center
圆心的中心
- radius
圆的半径
- target
点在外面
findCircleInteresction
:
- 计算vector
和center
之间的target
- 获得结果length
的{{1}}
- 计算vector
的{{1}}(标准化)
- 通过添加圆的中心加上归一化的矢量分量乘以圆的半径,找到矢量与圆相交的点
此代码可能会进行大量优化并且未经测试但我认为它说明了这一想法。
答案 1 :(得分:1)
您可能希望将其视为两个重叠的三角形,一个是边Bx-Ax
和By-Ay
。你想要的是找到X
的坐标,它具体是一个边长为Xx-Ax
和Xy-Ay
的三角形,但是有一个已知的斜边R
,这是你的半径圈。请注意,两个三角形的角度相对于x坐标轴都相等。
因此,要获得三角形的角度,请使用arctan(By-Ay/Bx-Ax)
现在使用该角度,将其称为T
,您可以使用已知半径R
来解决较小的腿。< / p>
要获取x坐标,您需要Rcos(T)
要获得y坐标,您需要Rsin(T)
将所有内容整合在一起,即可Xx = Rcos(T)
和Xy = Rsin(T)
如果您不愿意使用此方法将使用的数学库,您可以使用比率(如Pointy
所述)