4

任务是当我们在 3 维空间中有一条线段(我们有两端的坐标)并且我们有信息为angle,ratioamount。我们的工作是给我们接下来的几条线段(few= amount),它们的起点在我们的第一条线段的末尾(我们知道哪条线的终点和起点)并像这里一样旋转

像这里一样旋转

我们第一行的俯视图(行在中心(这个黑点)):

我们第一行的俯视图 Amount高达 100.Angle至 180*。

这就是我所做的:

Sx,Sy,Sz - 开始坐标 x,y,z - 结束坐标

float siny=sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz))/S->korona[lvl-1]->l;
            float cosy=(y-Sy)/S->korona[lvl-1]->l;
            float cosx=(Sx-x)/sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz));
            float sinx=(z-Sz)/sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz));
            float co=cos(angle);
            float si=sin(angle);
            float newa=a*ratio;
            for(int j=0;j<S->amount;j++){
                float a=newa*(co*cos(360.0f/S->amount*j*rad)*cosy-si*siny);
                float b=newa*(co*cos(360.0f/S->amount*j*rad)*siny+si*cosy);
                float c=newa*co*sin(360.0f/S->amount*j*rad);
}

我们新的:

x=c*sinx+a*cosx+S->korona[lvl-1]->sticks[i]->x
y=b+S->korona[lvl-1]->sticks[i]->y
z=c*cosx-a*sinx+S->korona[lvl-1]->sticks[i]->z)

如何更快地得到这个?顺便说一句,这个解决方案很糟糕。有没有更好的办法?

类似于HERE但在3D中

4

1 回答 1

2

还有一种更优雅的方式。您真正需要知道的只有一件事:余弦的内积定义,它适用于任何维度。给定向量 u 和 v,它们之间夹角的余弦为:

(u^tv)/(|u||v|)。

首先使用单位向量 u=(1,0,0)。这消除了公式的分母。现在您可以得到一个单位向量 v,它与 u 的角度与您的参数匹配:v=(cos \theta, sin \theta, 0)。

接下来使用这些旋转矩阵(数量 -1)次将 v 围绕 u(x 轴)旋转 360/数量。

现在你有了你需要的所有向量。你剩下要做的就是:

  1. 旋转它们,使原始单位向量与原始点之间的差异向量“对齐”(同一个维基百科页面也有相应的矩阵),并且
  2. 通过将该点添加到每个向量,将它们转换为您想要作为原点的原始点。

就个人而言,我会去公共图书馆找一本介绍性的线性代数书。吉尔伯特斯特朗是我的最爱。维基百科的内容非常好和完整,但随着时间的推移,对于那些还没有一些专业知识的人来说,它变得有点不知所措。所有这些材料在任何一本书中都有很好的解释,其中有很多例子,就在第一章或第二章。

至于它的编程部分:如果您需要实现的只是密集的 3x3 矩阵产品,我会直接执行它而不是合并一个库。另一方面,您可能很快就会发现自己在反转矩阵,这在实践中可能会有些棘手。您需要多少几何图形应该是决定合并 3rd 方库是否值得麻烦的主要因素。

于 2013-05-17T02:50:02.033 回答