十二面体(或任何柏拉图固体)均匀旋转,使顶点不与先前的任何旋转重叠

时间:2015-05-06 16:14:13

标签: rotation

如何旋转对象,使其顶点不会与任何其他旋转重叠?具有预定义的旋转次数。

思想: 它可以通过放松来实现。 (想法来自Greg Turk的论文:使用反应扩散在任意曲面上生成纹理)

步骤:

  1. 生成x十二面体或与其中心对称的任何对象 点。
  2. 这些物体的位置,方向应相同 和大小。 (所以我们可以在顶点之间创建一个简单的关系=> 在开头重叠的那些是相关的)
  3. 创建一个计算相关点之间距离的函数。
  4. 最大化相关点之间的平均距离。 (每个点都有x-1 相关要点)
  5. 问题: 这不是点的简单放松问题。在这里,由于十二面体约束,我不能只是翻译。需要旋转矩阵/四元数。

1 个答案:

答案 0 :(得分:0)

蛮力的可能解决方案
摘要
随机旋转,直到达到所需的平均距离 说明
旋转每个十二面体,直到它的顶点不与其他十二面体的任何顶点重叠。 然后计算平均距离并检查最佳(最小)到目前为止。保存所有顶点位置和旋转四元数,将基本十二面体转换为旋转的十二面体。

float minThreshold <- user defined
int iterationThreshold <- user defined
float minAveDistance = Infinity;


while (minAveDistance > minThreshold || maxIteration > iterationThreshold) {
    Foreach (dodecahedron) { // except the first one, that can stay as is
// rotate randomly until there are no overlapping positions with the other dodecahedrons
        while (checkOverlappingWithOtherDodecahedrons(dodecahedron)) {
            rotateRandomly(dodecahedron);
        }
    }
    float aveDistance = CalculateAverageDistanceBetweenAllPointsOfDodecahedrons();
    if (aveDistance < minAveDistance) {
        minAveDistance = aveDistance;
        SaveAllPositions(); // e.g.: to a file
        SaveAllRotationQuaternionsFromStartOrientation(); // e.g.: to a file
    }
}