【问题标题】:Incorrect rotation and scaling of shape objects C++形状对象C ++的不正确旋转和缩放
【发布时间】:2020-10-20 20:47:03
【问题描述】:

(请帮忙,仍然无法解决)在对多边形对象进行了一些旋转和缩放后,我设法渲染了一个图像,但它与正确的图像不同,如下所示(正确的图像)。我很困惑为什么会这样。我找到了顶点的中心,并从顶点的中心缩放和旋转了我的多边形对象,希望得到一条笔直的路径。但是,我仍然无法获得所需的直线路径。由于我是旋转,缩放和平移方法的新手,我真诚地希望您能够提供帮助,以便我能够正确匹配图像。我不知道我需要改变什么。我是否还需要找到顶点的中心进行缩放?然后将该点翻译回中心或返回原始枢轴点?我对轮换有同样的问题。请帮忙。如果可以,请帮助我找出我的代码中的错误。希望问题很清楚。谢谢。

注意:在我提供的测试用例中,首先调用平移,然后是旋转,然后是缩放。

所以,t->translate({ 0.0f, 50.0f });然后,r->rotate(0.25f);。然后,s->scale(0.85f);。测试用例不能修改。

Incorrect image

Correct image

翻译方法

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 (size_t i{}; i < _nsize; i++)
    {
        center += _npts[i];
    }
    center = T(center.x() / _nsize, center.y() / _nsize);
    for (auto& verts : _npts)
    {
      verts = T((static_cast<float>
                (center.x()) + (factor) *
                (static_cast<float>(verts.x() - center.x()))),
                (static_cast<float 
                (center.y()) + (factor) *
                (static_cast<float>(verts.y() - center.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 = (center.x() + std::cos(angle) * xn - std::sin(angle) * yn); //translate back to origin.
        _yn = (center.y() + std::sin(angle) * xn + std::cos(angle) * yn);
        verts = T(_xn, _yn);

    }
}

【问题讨论】:

  • 1) 我不认为这是问题所在,但我建议将size_t i{} 更改为size_t i{0},至少只是为了清楚起见。 2)我知道你不能改变测试,但你试过在最后做翻译吗? 3)另一个建议,只是为了限制查看位置:分别尝试每个转换;然后检查其中一个是否在做奇怪的事情。
  • 2) 不,没关系,询问从来都不是问题 :) 我只是图形方面的专家。话虽如此,我一直认为你应该先旋转,然后翻译。没关系。 3) 好了,轮换好像出了点问题。
  • 什么是旋转参数的单位。是弧度吗?
  • @user10995546 查看我编辑后的回复。

标签: c++ graphics rotation translation scaling


【解决方案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);

edit :似乎 center 和 _pivotPt 应该始终相同。

编辑:您的中心对象是一个不断更新的全局变量。每次您尝试计算质心时,旧值都会扰乱计算

ps:您的翻译方法似乎翻译了质心(枢轴点),并假设下一个函数将正确使用新值。就其本身而言,这不是一个坏主意,但容易出错。鉴于您的情况,保守编码并翻译 _npts 中的所有点会更有意义

【讨论】:

  • 不幸的是,我已经这样做了。它对我的情况不起作用。我现在重新上传更新的。
  • 我的缩放好像有问题。
  • 我还需要围绕质心缩放吗?
  • 天哪,这是个坏主意,现在形状在 x 方向上是弯曲的。虽然不应该。男人。
  • 现在我的方向相反,我该如何解决?与 y 轴相反,向后,从中心切换所有内容后。
猜你喜欢
  • 2019-03-07
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多