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向量。在什么意义上最好?