形状对象的旋转和缩放不正确C++
Incorrect rotation and scaling of shape objects C++
(请帮忙,仍然无法解决(在对多边形对象进行一些旋转和缩放后,我设法渲染了一个图像,但它与正确的图像不同,如下所示(正确的图像(。我对为什么会这样感到困惑。我已经找到了顶点的中心,并从顶点的中心缩放和旋转了我的多边形对象,希望得到一条笔直的路径。但是,我仍然无法按预期获得直线路径。由于我对旋转,缩放和平移方法不熟悉,我真诚地希望您能够提供帮助,以便我能够使图像正确匹配。我不知道我需要改变什么。我还需要找到顶点的中心进行缩放吗?然后将点转换回中心或回原始枢轴点?我对轮换也有同样的问题。请帮忙。如果可以,请帮助我识别代码中的错误。希望问题清楚。谢谢。
注意:在我提供的测试用例中,首先调用平移,然后调用旋转,然后缩放。
所以, t->translate({ 0.0f, 50.0f }(;然后,r->旋转(0.25f(;。然后,s->scale(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 (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);
}
}
似乎你应该围绕质心旋转,所以我不明白为什么你在计算新坐标时使用 _pivotPt.x((。它应该是
_xn = (center.x() + std::cos(angle) * xn - std::sin(angle) * yn);
_yn = (center.y() + std::sin(angle) * xn + std::cos(angle) * yn);
编辑:似乎中心和_pivotPt应该始终相同。
编辑:您的中心对象是一个不断更新的全局变量。每次尝试计算质心时,旧值都会弄乱计算
ps :看来您的翻译方法翻译了质心(枢轴点(,并假设新值将被下一个 functions.by 本身正确使用,这不是一个坏主意,但容易出错。鉴于您的情况,保守编码并翻译所有要点更有意义_npts
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 计算缩放多边形的比例,得到给定的多边形面积
- QwtPlot具有相等的轴和自动缩放
- 形状对象的旋转和缩放不正确C++
- 如何在OpenGL中正确旋转和缩放对象?
- 为什么我不能使用 Sphere 来缩放字形?
- 我在QChartView中找不到缩放图形的鼠标滚轮滚动事件
- 缩放QGraphicsView而不缩放已添加到其中的QWidget
- 从侧面而不是从中心缩放 CCSprite
- 如何允许用户在opengl中缩放一个对象而不缩放另一个对象
- 纹理正在缩放,而不是在Qt中重复
- Eclipse控制语句大括号缩进不正确
- QTabBar 选项卡大小不随样式表字体缩放
- MFC图片控件不会根据Windows显示比例自动缩放
- 尝试用宽度(而不是高度)缩放OpenGL程序
- 在类中不定义静态数组大小是不是很糟糕--而是让它自动缩放
- opencvc++模板/模式匹配缩放和旋转不变量
- 在不改变精灵位置的情况下缩放资产
- 不支持缩放/固定输出分辨率