通用公式计算3d空间等距离

时间:2013-03-08 01:19:51

标签: javascript jquery math

它可能不是发布此内容的正确位置,但我不知道在哪里发布它。

我有5条线(d1 - > d5)在3d透视图中彼此均匀分布,我有(a)角度,(d1)和(b5)的值。我需要用jquery计算(b2,b3,b4,d2,d3,d4,d5)。

enter image description here

我可以用:

计算d5
d5 = d1 - ( b5 * Math.tan(a))

但我不知道如何计算b2,b3和b4。 (d1分为4个相同的部分) 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您正在寻找的是投射比例。计算上最简单的方法是使用同质坐标,取一个矩形(如下图第一张图片中的那个),其中V是“向右无限远”,并找到一个投影变换,将该矩形映射到梯形。第二张照片。矩形的顶点是(0 | 0),(0 | d1),(b5 | d1),(b5 | 0),梯形的对应顶点是(0 | 0),(0 | d1),( b5 | d5),(b5 | 0)。

Illustration of a projective transformation for obtaining a projective scale

由于这些是四个点,其中没有三个是共线的,我们可以找到这个变换的唯一矩阵(直到缩放)M.经过一些数学计算,结果证明这个矩阵是:

[d1*b5,0,0] 
[0,b5*d5,0]
[d1-d5,0,b5*d5]

例如,如果要查找坐标b3和d3,可以将此矩阵与线中间点的同质坐标相乘,即向量(0.5 * b5,d1,1)^ T和你得到点(b3 | d3)的同质坐标,它可以通过去均匀化转换成欧几里德坐标,即将前两个分量除以第三个。

一般情况下,如果你有两个点(b1 | d1)和(bn | dn)并且想要在这样的投影尺度上知道中间的n-2个等距点的坐标,你可以计算坐标bi和di就像这样(在你的情况下,n当然是5):

let M := matrix [[d1*bn, 0, 0], [0, bn*dn, 0], [d1-dn, 0, bn*dn]]
let v := ((i-1)/(n-1)*bn, d1, 1)
let (x,y,z) := M*v
let bi := x/z and di := y/z

如你所见,这是一个计算这些射影等距点的坐标的简单算法,它可以很好地推广到任意数量的点。

如果你想要一个封闭的公式,你可以直接计算bi和di:

let bi := (bn*d1*(i-1))/(dn*n+(d1-dn)*i-d1)
let di := d1*dn*(n-1)/(dn*n+(d1-dn)*i-d1)

答案 1 :(得分:0)

enter image description here

首先我们需要计算整个三角形的相邻边长 d1 - > v - > c 是(左侧垂直侧):

tan(Θ) = opposite / adjacent
opposite * tan(Θ) = adjacent
adjacent = opposite * tan(Θ)
adjacent = d1 * tan(a)

接下来我们需要知道 v 的每一行离开地面 d1 的距离。鉴于变量 s 对于所有分部是相同的并假设 N 分割段(在这种情况下为3),我们的计数器 i 从1并转到 N

opposite(i) = i * (d1 / N)

现在我们需要从 v 到每个标记 s 之间的角度:

tan(Θi) = opposite / adjacent
Θi = arctan(opposite / adjacent)
Θi = arctan(opposite(i) / adjacent)
Θi = arctan((i * (d1 / N)) / (d1 * tan(a)))

使用某些几何/三角形,我们可以说从 d1 c d5 顶部的角度是(90° - a )。我们将此角度称为 a'

a' = 90° - a

正弦法告诉我们:

A' / sin(a') = opposite(i) / sin(b')

所以现在我们解决A',因为我们需要一些帮助来获得橙色方块的尺寸:

A' = (opposite(i) * sin (a')) / sin(b')

因为 b' =( a + Θi)这会变成:

A' = (opposite(i) * sin (90° - a)) / sin(a + Θi)

同样适用但在橙色三角形中解决 h (见图片):

h / sin(90°-Θi) = A' / sin(90°)
h = (A' * sin(90°-Θi)) / sin(90°)    
b2 = h

将所有内容放在一起(希望我没有复制/粘贴错误)并且没有简化:

b2 = (((( i * (d1 / N)) * sin (90° - a)) / sin(a + Θi)) * sin(90° - arctan((i * (d1 / N)) / (d1 * tan(a))))) / sin(90°)    

现在为 i 的每个值冲洗/重复并转换成代码(我会这样做,但我太累了):)

相关问题