好的,我知道这听起来真的很愚蠢,但这与节目相关。
我正在开发一款游戏,而我正在考虑实施一个系统,该系统允许用户对其3D坐标进行三角测量以找到某些东西(例如,用于任务)。 我还希望能够让用户使用他们用于三角测量的点的坐标具有用户确定的坐标(因此位置的坐标是相对的,可能是通过设置信标或其他东西)。
我有一个计算点之间距离的方法,所以基本上我可以计算三角形/金字塔边长以及除了我之后的坐标以外的所有长度。 我做了任何三角函数已经很长时间了,我对sin,cos和tan函数生锈了,我觉得它们是必需的,但却不知道如何实现它们。
有人能举例说明我将如何以数学/编程的方式做这件事吗?
额外信息: 我的函数返回两点之间的确切距离,所以说你分别设置两个点为0,0,0和4,4,0,并将这些点设置为比例(游戏世界被分成一个非常大的三维网格,每个'块'区域由一个3d坐标表示)然后它将返回一个大约5.6的值。
关于它变化的关键点是用户可以设置点,所以说他们设置一个点读取0,0,0,实际位置可能是52,85,93。然而,提供他们然后计算块并正确设置其他点(例如,在实点56,89,93处设置点4,4,0)然后最终结果将返回相对位置(例如,他们试图定位的对象位于实点152,185,93,它将返回相对值100,100,0)。我需要能够知道每个点,但它想要找到的点,以及所有点之间的距离。
另外,请不要问为什么我不能通过使用真实坐标来计算它,我希望在计算结果时在屏幕上显示方程式.7
实施例: 这是一张图
想象一下,这是平坦平原上我的游戏中的要点。 我想知道重点f。 我知道点d和e的值,以及A,B和C的边。
仅使用我所知道的数据,我需要了解如何执行此操作。
回答编辑:
经过多天的努力,Sean Kenny为我提供了他的时间,耐心和智慧,因此我现在已经实现了三角测量方法。
我希望在测试代码时放置代码的不同语言,以便将来的编码人员可以使用此代码而不会遇到同样的问题。
答案 0 :(得分:4)
我花了一些时间研究解决方案,但我认为实施者,即你应该知道它在做什么,所以遇到的任何错误都可以在以后解决。因此,我将以强烈提示的形式给出答案。
首先,我们有一个从d到e的向量,我们可以解决这个问题:如果我们将坐标视为位置向量而不是绝对坐标,我们如何确定从d到e的向量是什么?如果您只知道自己的起点和最终位置,请考虑如何确定移动的位移?位移是一条直线,A点到B点,没有偏差,不是:我不得不在那个房子里走动,所以我走得更远。一条直线。如果您从点(0,0)
开始,那将很容易。
其次,余弦规则。你知道这是什么吗?如果没有,read up on it。我们如何重新排列链接中给出的表单,以便在向量d
和DE
之间找到角度DF
?记住你需要角度,而不是角度的函数(cos是一个记住的函数)。
接下来,我们可以使用名为scalar product的矢量'技巧'。注意那里有一个cos函数。现在,您可能在想,我们刚刚找到了角度,为什么我们再次这样做呢?
定义DQ = [1,0]
。 DQ
是长度为1的向量,单位向量,沿x轴。我们知道哪个其他载体?我们知道两个位置向量吗?
一旦我们有两个向量(我希望你能解决另一个向量),我们可以使用标量积找到角度;再一次,只是角度,而不是它的功能。
现在,希望我们有两个角度。我们可以从另一个中获取另一个角度到我们想要的坐标DF
吗?之前使用单位向量的选择并不是随意的。
标量产品在取消一段时间后就会给我们这样做:cos(theta) = x / r
x
的{{1}}纵坐标为x
,F
为{A}的长度。
最终结果是:
r
其中theta = arccos( xe / B ) - arccos( ( (A^2) + (B^2) - (C^2) ) / ( 2*A*B ) )
是沿着theta
行的单位向量之间形成的角度,其中原点位于y = 0
点。
通过此信息,我们可以找到相对于d
的点f
的x和y坐标。怎么样?
再次,使用标量积。其余的相当容易,所以我会把它给你。
d
从基本三角学。
我不建议尝试将其编码为一个值。
相反,试试这个:
x = r.cos(theta)
y = r.sin(theta)
将所有变量初始化为可以取小数的变量。例如,Java中的//pseudo code
dx = 0
dy = 0 //initialise coordinates somehow
ex = ex
ey = ey
A = A
B = B
C = C
cosd = ex / B
cosfi = ((A^2) + (B^2) - (C^2)) / ( 2*A*B)
d = acos(cosd) //acos is a method in java.math
fi = acos(cosfi) //you will have to find an equivalent in your chosen language
//look for a method of inverse cos
theta = fi - d
x = A cos(theta)
y = A sin(theta)
或float
。
沿x轴的绿色表示f的x纵坐标,紫色表示y坐标。
蓝色角度是我们试图找到的角度,因为希望你能看到,我们可以使用简单的触发来计算出x和y,因为我们知道了斜边的长度。
这条黄线直到1是标量乘积的单位矢量,它沿x轴运行。
我们需要找到黑色和红色角度,这样我们就可以通过简单的减法推导出蓝色角度。
希望这会有所帮助。可以对3D进行扩展,所有向量函数对于3D都基本相同。
答案 1 :(得分:0)
如果您有来自原点的位移,无论这是否是另一个用户定义的坐标,该3D点的坐标都只是(x, y, z)
。
如果要从一个点(也要考虑一个坐标)定义这些长度,您可以简单地写(x, y, z) + (x1, y1, z1) = (x2, y2, z2)
,其中x2,y2和z2是来自(0, 0, 0)
原点的位移。
如果你想找到这个向量的长度,即如果你将A到B的直线定义为x轴,那么x位移是什么,你可以使用毕达哥拉斯用于3D向量,它的工作原理是一样的和2D一样:
Length l = sqrt((x^2) + (y^2) + (z^2))
编辑: 假设您有一个用户定义的点A(x1,y1,z1),并且您希望将其定义为原点(0,0,0)。您有另一个用户选择的点B(x2,y2,z2),您知道x,y和z平面中从A到B的距离。如果你想弄清楚这一点是什么,关于新的起源,你可以简单地做
B relative to A = (x2, y2, z2) - (x1, y1, z1) = (x2-x1, y2-y1, z2-z1) = C
C是向量A> B,向量是具有幅度(线的长度)和方向(从A指向B的角度)的量。
如果你想计算B相对于原点O的位置,你可以做相反的事情:
B relative to O = (x2, y2, z2) + (x1, y1, z1) = (x1+x2, y1+y2, z1+z2) = D
D是载体O> B。
编辑2:
//pseudo code
userx = x;
usery = y;
userz = z;
//move origin
for (every block i){
xi = xi-x;
yi = yi - y;
zi = zi -z;
}