在做了一些旋转和缩放我的多边形形状的对象后,我设法渲染了一个非常相似的图像,但仍然不同于正确的图像,如下所示(正确的图像)。 我不明白为什么会这样。 我找到了顶点的中心,并从顶点的中心缩放和旋转我的多边形形状的对象,希望得到一条直线。 然而,我仍然无法如愿得到正路。 由于我是新的旋转,缩放和翻译方法,我真诚地希望你能够帮助,使我将能够得到正确的图像匹配。 我已经不知道我需要改变什么了。 我是否也需要找到顶点的中心进行缩放? 然后将该点平移回中心,还是平移回原始的枢轴点? 我对轮换也有同样的问题。 请帮帮我。 如果可以,请帮我识别代码中的错误。 希望问题清楚。谢谢。
注意:在我提供的测试用例中,首先调用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);
}
}
似乎应该围绕质心旋转,所以我不明白为什么要在计算新坐标时使用_pivotpt.x()。 应该是
_xn = (center.x() + std::cos(angle) * xn - std::sin(angle) * yn);
_yn = (center.y() + std::sin(angle) * xn + std::cos(angle) * yn);