好的,我需要在JavaScript中弄清楚如何在三角形上绘制第三个点。见下图。
A和B将是随机点(可能是正数或负数,取决于它们相对于0,0原点的下降位置。)
因此A和B是已知点(x和y)。
我已经弄清楚如何根据A和B绘制C。
C和D之间的距离我想要控制。例如我想说" C和D之间的距离现在是20px ...... D在哪里?"
所以我想我可以说C& D之间的距离是20px。这意味着我有CD和CB,但不是DB。我也知道C(x,y)和B(x,y)。
我现在需要找到D ......我不是一个数学头脑,所以请像我一样向我解释。我已多次用Google搜索,试图使用多个例子,我仍然输了...例如:我看到了一些提到phi的方程式..什么是phi?如何在JavaScript术语中使用phi等...
摘要:
A(x,y) is known (randomized)
B(x,y) is known (randomized)
C(x,y) is known (midpoint of AB)
CB is known (using distance formula)
CD = 20 pixels (or whatever I set it to).
DB = ???
D(x,y) = ???
这是我迄今为止所拥有的,但它可能是错误的......
var Aeh = {x:50, y:75};
var Bee = {x:300, y:175};
var Cee = {x:0, y:0};
var Dee = {x:0, y:0};
window.onload = function(){
refreshPoints();
solveForC();
}
function refreshPoints(){
TweenLite.set("#pointA", {x:Aeh.x, y:Aeh.y});
TweenLite.set("#pointB", {x:Bee.x, y:Bee.y});
TweenLite.set("#pointC", {x:Cee.x, y:Cee.y});
TweenLite.set("#pointD", {x:Dee.x, y:Dee.y});
}
function solveForC() {
Cee.x = (Bee.x + Aeh.x)/2;
Cee.y = (Bee.y + Aeh.y)/2;
refreshPoints();
solveForD();
}
function solveForD() {
// Dee.x = AB * Cos(Φ) + x_1
// Dee.y = AB * Sin(Φ) + y_1
Dee.x = (Cee.x+Bee.x/2) * Math.cos((1 + Math.sqrt(5)) / 2) + Cee.x;
Dee.y = (Cee.y+Bee.y/2) * Math.sin((1 + Math.sqrt(5)) / 2) + Cee.y;
refreshPoints();
}
答案 0 :(得分:2)
你有A,B和C(中点),你知道从C到D的距离是设定的(比如20),而C到D的线是从A到B的直线。您可以使用此找到D的两种解决方案。最简单的理解方法是找到从A到B的直线角度,然后用它帮助计算D.
var angleAB = Math.atan2(B.y - A.y, B.x - A.x);
// to get the angle of the line from C to D, add 90 degrees
// in radians, that is Math.PI / 2
var angleCD = angleAB + Math.PI / 2;
// now you can calculate one of D's solutions
// the 20 represents your distance from C to D, and can be changed if desired.
DeeOne.x = C.x + 20 * Math.cos(angleCD);
DeeOne.y = C.y + 20 * Math.sin(angleCD);
// a second solution can be found by going in the other direction from C
DeeTwo.x = C.x - 20 * Math.cos(angleCD);
DeeTwo.y = C.x - 20 * Math.sin(angleCD);
如果你需要的只是图表中的某个距离(等),可能有办法削减一些计算。希望这会有所帮助。
答案 1 :(得分:0)
函数从行dist
,A
的中点找到点B
。
D
(默认)其他AB
在行left = 1
之前, D
会在行left = -1
左侧
function findD(A, B, dist, left = 1){ // if left = 1 the D is left of the line AB
const nx = B.x - A.x;
const ny = B.y - A.y;
dist /= Math.sqrt(nx * nx + ny * ny) * left;
return {
x : A.x + nx / 2 - ny * dist,
y : A.y + ny / 2 + nx * dist
}
}
您可能想要将Math.sqrt(nx * nx + ny * ny)
替换为Math.hypot(nx,ny)
,并保存2次乘法和加法。但hypot
令人痛苦地缓慢。当我使用sqrt
时,hypot
使用atan2
执行的功能每秒下降到2万亿。同时定时另一个答案(优化为公平),并且每秒达到3.4万亿个解决方案。
对于使用sin
和cos
和%%file memory.py
import numpy as np
@profile
def allocate():
vector_list = [float(i) for i in range(10000)]
np.arange(0,10000,dtype='d')
allocate()
的javascript并不是一个问题,因为64位双精度浮点数会使这些函数引入的误差无关紧要,在±1e范围内-14 *最长边的长度,但如果你避免这些功能,错误可以减少(一点点)