0

我需要围绕空间中的参考点创建一圈规则间隔的门。每次程序运行时,圆圈中都会有不同数量的项目,因此它会自动重新调整以适应增加的项目数量。我知道这更像是一个数学问题而不是编程问题,但我很难过!以下代码与我得到的一样接近:

block->setPosition(core::vector3df(sin(segdeg*itemnumber)*radius+referencepoint.X,
                                   0,
                                   cos(segdeg*itemnumber)*radius+referencepoint.Z));

block 是对象,并且为每个项目运行此代码。segdeg 是 360/项目数。也就是说,SEGment DEgrees。半径是项目需要离中心点多远。Itemnumber 是相关项目的索引 - 它是哪个编号项目。

出于某种原因,此代码使每扇门都非常接近,但仍然偏离约 10-15 度。(虽然第一扇门总是正确的)但是这些物品离中心点的距离都是正确的。我确信这是一个非常明显的已回答问题,但我已经好几个小时没能解决它,而且我已经用谷歌搜索了我的屁股。

谁能修复我的算法?

4

2 回答 2

2

sincos以弧度而不是度数表示他们的论点。你想要segrad = 2 * pi / the_number_of_items(SEGment RADians)而不是segdeg = 360.0 / the_number_of_items(SEGment DEGrees)。

您的实现可能会为 pi 提供一个值,但标准中没有,因此您可能必须使用boost::math::constants::pi<double>()或放入自己的值。

您的第一项是正确的,因为 0 在任何方面都是 0。

于 2012-05-28T10:14:45.587 回答
2
int doors = 5;
double rotation = 2 * M_PI / doors;
for(int door = 0; door < doors; ++door)
{
    double door_rotation = door * rotation;
    double door_x = reference_x + cos(door_rotation);
    double door_y = reference_y + sin(door_rotation);
}
于 2012-05-28T10:51:43.403 回答