提问者:小点点

形状对象的旋转和缩放不正确C++


在做了一些旋转和缩放我的多边形形状的对象后,我设法渲染了一个非常相似的图像,但仍然不同于正确的图像,如下所示(正确的图像)。 我不明白为什么会这样。 我找到了顶点的中心,并从顶点的中心缩放和旋转我的多边形形状的对象,希望得到一条直线。 然而,我仍然无法如愿得到正路。 由于我是新的旋转,缩放和翻译方法,我真诚地希望你能够帮助,使我将能够得到正确的图像匹配。 我已经不知道我需要改变什么了。 我是否也需要找到顶点的中心进行缩放? 然后将该点平移回中心,还是平移回原始的枢轴点? 我对轮换也有同样的问题。 请帮帮我。 如果可以,请帮我识别代码中的错误。 希望问题清楚。谢谢。

注意:在我提供的测试用例中,首先调用translation,然后调用rotate,然后调用Scale。

因此,T->翻译({0.0f,50.0f}); 然后,r->旋转(0.25F);。 然后,S->标度(0.85F); 无法修改测试用例。

不正确的图像

正确图像

翻译方法

template<typename T>
void translate(const T& displacement)
{
    _pivotPt = T((_pivotPt.x() + displacement.x()),
        (_pivotPt.y() + displacement.y()));
}   

标度法

template<typename T>
void Polygon<T>::scale(const float factor) //temporarily treat other point as origin
{

    for (auto& verts : _npts)
    {
        verts = T((static_cast<float>(_pivotPt.x()) + (factor) *
                (static_cast<float>(verts.x() - _pivotPt.x()))),
                (static_cast<float>(_pivotPt.y()) + (factor) *
                (static_cast<float>(verts.y() - _pivotPt.y()))));
    }

}

旋转法

template<typename T>
void Polygon<T>::rotate(const float angle)
{
    typename Point<T>::type _xn, _yn;

    for (size_t i{}; i < _nsize; i++)
    {
        center += _npts[i];
    }
    center = T(center.x() / _nsize, center.y() / _nsize); //Find center from all given coordinates

    for (auto& verts : _npts)
    {
        float xn = verts.x() - center.x(); //Subtract pivot point
        float yn = verts.y() - center.y();

        _xn =  (_pivotPt.x() + std::cos(angle) * xn - std::sin(angle) * yn); //rotate and translate back to origin
        _yn = (_pivotPt.y() + std::sin(angle) * xn + std::cos(angle) * yn);
        verts = T(_xn, _yn);

    }
}

共1个答案

匿名用户

似乎应该围绕质心旋转,所以我不明白为什么要在计算新坐标时使用_pivotpt.x()。 应该是

 _xn =  (center.x() + std::cos(angle) * xn - std::sin(angle) * yn);
 _yn = (center.y() + std::sin(angle) * xn + std::cos(angle) * yn);

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(形状|对象|旋转|缩放|不正确|c++)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?