Javascript 计算圆上一点的坐标,沿着圆心和圆外另一点之间的直线?
下面是一张图片来演示这个问题: 假设我在Javascript 计算圆上一点的坐标,沿着圆心和圆外另一点之间的直线?,javascript,math,geometry,Javascript,Math,Geometry,下面是一张图片来演示这个问题: 假设我在[0,0]处有点A,在[50,30]处有点B。我想沿着半径为15的圆找到点X的坐标,原点位于点a,也在点a和点B之间的一条线上 关于最佳方法的指针?您可能希望将其视为两个重叠的三角形,一个边为Bx Ax和By Ay。你想要的是找到X的坐标,它是一个三角形,边Xx Ax和Xy Ay,但斜边R,这是你的圆半径。请注意,两个三角形相对于x坐标轴的角度相等 因此,要得到三角形的角度,取arctan(By Ay/Bx Ax)现在用这个角度,称它为T,你可以用你知道
[0,0]
处有点A
,在[50,30]
处有点B
。我想沿着半径为15
的圆找到点X
的坐标,原点位于点a
,也在点a
和点B
之间的一条线上
关于最佳方法的指针?您可能希望将其视为两个重叠的三角形,一个边为
Bx Ax
和By Ay
。你想要的是找到X
的坐标,它是一个三角形,边Xx Ax
和Xy Ay
,但斜边R
,这是你的圆半径。请注意,两个三角形相对于x坐标轴的角度相等
因此,要得到三角形的角度,取arctan(By Ay/Bx Ax)
现在用这个角度,称它为T
,你可以用你知道的半径R
求解较小的支腿
要获得x坐标,您需要Rcos(T)
要获得y坐标,您需要使用Rsin(T)
把它们放在一起,你就有了Xx=Rcos(T)
和Xy=Rsin(T)
如果您不愿意使用此方法将使用的数学库,您可以使用比率(如
Pointy
注释)您可以将其视为两个重叠的三角形,一个边为Bx Ax
和边为Ay
。你想要的是找到X
的坐标,它是一个三角形,边Xx Ax
和Xy Ay
,但斜边R
,这是你的圆半径。请注意,两个三角形相对于x坐标轴的角度相等
因此,要得到三角形的角度,取arctan(By Ay/Bx Ax)
现在用这个角度,称它为T
,你可以用你知道的半径R
求解较小的支腿
要获得x坐标,您需要Rcos(T)
要获得y坐标,您需要使用Rsin(T)
把它们放在一起,你就有了Xx=Rcos(T)
和Xy=Rsin(T)
如果您不愿意使用此方法将使用的数学库,您可以使用比率(如
Pointy
注释)因为它已标记为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
圆的中心-
半径
圆的半径-
目标
圆外的点
在findCircleIntersection
:-计算
中心
和目标
之间的向量
-获取结果向量的
长度
-计算向量的正常值(标准化)
-求向量与圆相交的点,方法是将圆心加上归一化向量分量,再乘以圆的半径
这段代码可以进行大量优化,而且未经测试,但我认为它说明了这一点。由于这段代码已标记为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
圆的中心
-半径
圆的半径
-目标
圆外的点
在findCircleIntersection
:
-计算中心
和目标
之间的向量
-获取结果向量的长度
-计算向量的正常值(标准化)
-求向量与圆相交的点,方法是将圆心加上归一化向量分量,再乘以圆的半径
这段代码可以进行大量优化,但未经测试,但我认为它说明了这一点。计算从A到B的距离。将其除以半径,然后将该比率乘以AB向量,得到AX向量。什么意义上最好?计算从A到B的距离。除以半径,然后将这个比率乘以AB向量,得到AX向量。在什么意义上最好?