几何变换

时间:2013-04-27 23:11:16

标签: c++ performance math geometry

任务是当我们在3个dementional空间(我们有两端的坐标)中有一个线段时,我们有angleratioamount的信息。我们的工作是给我们接下来的几个线段(少数= amount),它们的起点在我们的第一个线段的末尾(我们知道这是该线的结束和开始)并且在这里旋转< / p>

rotated as here

我们第一行的顶视图(行位于中心(此黑点)):

And top view at our first line 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

1 个答案:

答案 0 :(得分:2)

有一种更优雅的方式。你真正需要知道的只有一件事:内在产品的余弦定义,它在任何方面都有。给定向量u和v,它们之间角度的余弦是:

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

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

接下来使用these rotation matrices(数量-1)次将v绕u(x轴)旋转360 /金额。

现在你拥有了所需的所有载体。你剩下要做的就是:

  1. 旋转它们,使原始单位矢量与原始点之间的差异向量“对齐”(同一个维基百科页面也有相应的矩阵),
  2. 通过将该点添加到每个向量,将它们转换为您想要成为原点的原始点。
  3. 就个人而言,我会去公共图书馆找一本入门的线性代数书。吉尔伯特斯特朗是我的最爱。维基百科的内容非常好而且完整,但随着时间的推移,对于那些还没有一些专业知识的人来说,它已经变得有点压倒性。所有这些材料都可以在第一章或第二章中的许多例子中很好地解释。

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