任务是当我们在3个dementional空间(我们有两端的坐标)中有一个线段时,我们有angle
,ratio
和amount
的信息。我们的工作是给我们接下来的几个线段(少数= amount
),它们的起点在我们的第一个线段的末尾(我们知道这是该线的结束和开始)并且在这里旋转< / p>
我们第一行的顶视图(行位于中心(此黑点)):
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
答案 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 /金额。
现在你拥有了所需的所有载体。你剩下要做的就是:
就个人而言,我会去公共图书馆找一本入门的线性代数书。吉尔伯特斯特朗是我的最爱。维基百科的内容非常好而且完整,但随着时间的推移,对于那些还没有一些专业知识的人来说,它已经变得有点压倒性。所有这些材料都可以在第一章或第二章中的许多例子中很好地解释。
至于它的编程部分:如果您需要实现的是密集的3x3矩阵产品,我只是直接执行而不是合并库。另一方面,您可能很快就会发现自己正在反转矩阵,这在实践中会变得有点棘手。你需要多少几何应该是决定是否合并第三方库的主要因素。