围绕点旋转2d

时间:2012-02-18 15:15:49

标签: c++ rotation

我正在尝试在我的编辑器中添加一些功能,允许用户将所选项目拖动到给定方向 虽然我遇到了一个该死的问题。

这是我的代码:

//Origin
double objectx = selection->getX();
double objecty = selection->getY();

//Point
double pointerx = input->getMouseX();
double pointery = input->getMouseY();

//Displacement
double displacementx = fabs(pointerx - objectx);
double displacementy = fabs(pointery - objecty);

//Angle
double angle = atan2(displacementy,displacementx);

//Point
double pointx = displacementx * cosf(angle) + displacementy * sinf(angle);
double pointy = displacementy * cosf(angle) - displacementx * sinf(angle);

//Final position
double fx = objectx + pointx;
double fy = objecty + pointy;

//Save alpha
const bool alpha = graphics->getAlpha();

//Draw selection
graphics->setAlpha(false);
graphics->color(selection->getColor());
graphics->renderQd(selection->getBitmap(),
                   CRect(objectx,
                         objecty,
                         selection->getWidth(),
                         selection->getHeight()));

//Draw pointer around selection
graphics->setAlpha(true);
graphics->color(editor::ssImg[0]->getColor());
graphics->renderQd(editor::ssImg[0]->getBitmap(),
                   CRect(objectx + pointx,
                         objecty + pointy,
                         editor::ssImg[0]->getWidth(),
                         editor::ssImg[0]->getHeight()));

//Restore alpha
graphics->setAlpha(alpha);

确切的问题是选择指针不仅仅跟随鼠标的旋转,而是实际上在鼠标的位置(!)。 想要的行为是指针锁定在选择的偏移量但指向鼠标的角度。

任何擅长数学的人都认为这里有什么问题吗?

1 个答案:

答案 0 :(得分:1)

据我所知,你想要的行为假定存在三个点:你正在旋转的原点,一个提供相对于原点的方向的“鼠标”,以及一个提供距离的“选择”起源。 (有点令人困惑的是,代码的结果是“选择指针”。我认为“选择”表示所选对象的原始位置,“选择指针”表示它被拖动的位置到目前为止?)

但是,您的代码实际上仅涉及其中两个点:(objectxobjecty),我认为是原点,(pointerx,{{1} }),我假设是“鼠标”。你的代码从不引用“选择”;因此,“选择”自然会对代码的结果产生影响。

还有一些其他问题 - Oli Charlesworth在上面的评论中指出,你错误地将角度除以π/ 180,这意味着你应用了一个非常小的旋转(这就是为什么它看起来像你最后选择指针=鼠标;事实上,它们相对于旋转原点可以相隔几度,但这并不是立即引人注意的) - 但是我建议你改变你的方法,而不是解决这些问题。通过旋转“选择”以匹配“鼠标”的角度而不是生成“选择指针”,我建议您通过缩放“鼠标”来生成它以匹配“选择”的大小。对此的数学更直接,恕我直言。

如果你想通过旋转“选择”以匹配“鼠标”的角度来坚持生成“选择指针”的方法,那么你有两个要解决的主要问题。您当前的代码将“鼠标”旋转到当前角度“鼠标”。部分修复是转而选择“选择”;修复的另一部分是通过“鼠标”和“选择”的当前角度之间的差异旋转。