首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算三维空间等距的通用公式

问计算三维空间等距的通用公式
EN

Stack Overflow用户
提问于 2013-03-08 09:19:51
回答 2查看 680关注 0票数 7

这可能不是发布这篇文章的正确位置,但我不知道还能在哪里发布它。

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

​

​

我可以用以下公式计算d5:

代码语言:javascript
复制
d5 = d1 - ( b5 * Math.tan(a))

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-08 12:39:36

你要找的是一个投影尺度。

​

​

由于这是四个点,其中没有三个是共线的,因此我们可以找到此变换的唯一矩阵(最大比例)M。经过一些数学运算后,这个矩阵是:

代码语言:javascript
复制
[d1*b5,0,0] 
[0,b5*d5,0]
[d1-d5,0,b5*d5]

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
let bi := (bn*d1*(i-1))/(dn*n+(d1-dn)*i-d1)
let di := d1*dn*(n-1)/(dn*n+(d1-dn)*i-d1)
票数 2
EN

Stack Overflow用户

发布于 2013-03-08 12:34:22

​

​

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

代码语言:javascript
复制
tan(Θ) = opposite / adjacent
opposite * tan(Θ) = adjacent
adjacent = opposite * tan(Θ)
adjacent = d1 * tan(a)

下一步,我们需要知道v的每一条线离地面有多远,当它到达line d1时。假设变量s对于所有分段都是相同的,并且假设N划分分段(在本例中是3),我们的计数器是i,它从1开始,一直到N

代码语言:javascript
复制
opposite(i) = i * (d1 / N)

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

代码语言:javascript
复制
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)。我们将这个角度称为‘’

代码语言:javascript
复制
a' = 90° - a

正弦定律告诉我们:

代码语言:javascript
复制
A' / sin(a') = opposite(i) / sin(b')

所以现在我们求解A‘,因为我们需要一些帮助来获得橙色正方形的尺寸:

代码语言:javascript
复制
A' = (opposite(i) * sin (a')) / sin(b')

由于b' = (a + Θi),这变成:

代码语言:javascript
复制
A' = (opposite(i) * sin (90° - a)) / sin(a + Θi)

同样的事情也适用,但解决了橙色三角形中的h (见图):

代码语言:javascript
复制
h / sin(90°-Θi) = A' / sin(90°)
h = (A' * sin(90°-Θi)) / sin(90°)    
b2 = h

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

代码语言:javascript
复制
b2 = (((( i * (d1 / N)) * sin (90° - a)) / sin(a + Θi)) * sin(90° - arctan((i * (d1 / N)) / (d1 * tan(a))))) / sin(90°)    

现在,对i的每个值进行清洗/重复,并转换为代码(我本来会这样做,但我太累了) :)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15285108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档