1

好的,我知道在这里问这听起来很愚蠢,但它与编程有关。

我正在开发一款游戏,我正在考虑实现一个系统,该系统允许用户对他们的 3D 坐标进行三角测量以定位某物(例如,用于某项任务)。我还希望能够让用户使他们用于三角测量的点的坐标具有用户确定的坐标(因此该位置的坐标是相对的,可能通过设置信标或其他方式)。

我有一种计算点之间距离的方法,所以基本上我可以计算三角形/金字塔边的长度以及除了我所追求的坐标之外的所有长度。我已经很久没有做过任何三角函数了,我对 sin、cos 和 tan 函数很生疏,我觉得它们是必需的,但不知道如何实现它们。

谁能给我演示一下我将如何以数学/编程方式进行此操作?

额外信息:我的函数返回两个点之间的确切距离,假设您将两个点分别设置为 0,0,0 和 4,4,0,并且这些点设置为缩放(游戏世界分为一个非常大的 3d 网格,每个“块”区域由 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)为我提供了他的时间、耐心和智慧,因此我现在有了一个三角测量方法的工作实施。

我希望在测试时放置代码的不同语言等效项,以便将来的编码人员可以使用此代码而不会遇到与我相同的问题。

4

2 回答 2

4

我花了一些时间研究解决方案,但我认为实施者,即您,应该知道它在做什么,所以以后遇到的任何错误都可以解决。因此,我将以强烈暗示的形式给出我的答案。

首先,我们可以计算出一个从 d 到 e 的向量:如果我们将坐标视为位置向量而不是绝对坐标,我们如何确定从 d 到 e 的向量是什么?想想如果你只知道你开始和结束的地方,你将如何确定你移动的位移?位移是一条直线,点 A 到 B,没有偏差,不是:我不得不绕着那房子走,所以我走得更远。一条直线。如果您从这一点开始,(0,0)那将很容易。

其次,余弦法则。你知道这是什么吗?如果没有,请继续阅读。我们如何重新排列链接中给出的形式以找到d向量DE和之间的角度DF?请记住,您需要角度,而不是角度的函数(记住 cos 是函数)。

接下来我们可以使用称为标量积的向量“技巧” 。注意那里有一个 cos 函数。现在,你可能会想,我们刚刚找到了角度,为什么还要这样做?

定义DQ = [1,0]. DQ是一个长度为 1 的向量,一个单位向量,沿 x 轴。我们还知道哪个向量?我们知道两个位置向量吗?

一旦我们有两个向量(我希望你计算出另一个),我们就可以使用标量积来找到角度;同样,只是角度,而不是它的函数。

现在,希望我们有两个角度。我们可以从另一个角度得到另一个角度到我们想要的坐标DF吗?早先使用单位向量的选择不是任意的。

标量乘积,经过一些抵消,给我们这个:纵坐标cos(theta) = x / r 在哪里,x是边 A 的长度。xFr

最终结果是:

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)

从基本的三角学。

我不建议尝试将其编码为一个值。

相反,试试这个:

//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)

将所有变量初始化为可以带小数的变量。例如floatdouble在 Java 中。

伊姆古尔

沿 x 轴的绿色表示 f 的 x 坐标,紫色表示 y 坐标。
蓝色角度是我们试图找到的那个,因为希望你能看到,然后我们可以使用简单的三角函数来计算 x 和 y,因为我们知道斜边的长度。直到 1 的这条黄线是取标量积的单位向量,它沿着 x 轴延伸。

我们需要找到黑色和红色的角度,这样我们就可以通过简单的减法来推断蓝色的角度。

希望这可以帮助。可以对 3D 进行扩展,所有矢量函数在 3D 中的工作原理基本相同。

于 2012-08-06T20:17:06.027 回答
0

如果您有从原点开始的位移,无论这是否是另一个用户定义的坐标,该 3D 点的坐标都是简单的(x, y, z)

如果您从一个点定义这些长度,还需要考虑一个坐标,您可以简单地写出(x, y, z) + (x1, y1, z1) = (x2, y2, z2)x2、y2 和 z2 是从(0, 0, 0)原点开始的位移。

如果您希望找到该向量的长度,即如果您将 A 到 B 的线定义为 x 轴,那么 x 位移是多少,您可以将 Pythagoras 用于 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;
}
于 2012-08-06T12:18:43.277 回答