围绕点创建圆形对象

时间:2012-05-28 10:12:00

标签: c++ trigonometry geometry irrlicht

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

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度。 (虽然第一扇门总是点亮)但是这些物品距离中心点都是正确的距离。我确信这是一个非常明显的回答问题,但我几个小时都无法解决这个问题,而且我已经用谷歌搜索了。

任何人都可以修复我的算法吗?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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);
}