点集上的 2d 旋转导致倾斜失真
Posted
技术标签:
【中文标题】点集上的 2d 旋转导致倾斜失真【英文标题】:2d rotation on set of points causes skewing distortion 【发布时间】:2013-01-15 18:00:23 【问题描述】:我正在用 OpenGL 编写一个应用程序(尽管我认为这个问题与此无关)。我有一些需要旋转的二维点集数据。它后来被投影到 3d 中。
我使用这个公式应用我的轮换:
x' = x cos f - y sin f
y' = y cos f + x sin f
其中“f”是角度。当我旋转点集时,结果是倾斜的。影响的严重程度因角度而异。
很难描述,所以我有图片; 红色的东西是一些简单的几何图形。 2d 点集是您在它们周围看到的白色折线的顶点。第一张图显示了未失真的点集,第二张图显示了旋转后的点集。旋转发生的不仅仅是倾斜;有时似乎也会发生位移。
代码本身很简单:
double cosTheta = cos(2.4);
double sinTheta = sin(2.4);
CalcSimplePolyCentroid(listHullVx,xlate);
for(size_t j=0; j < listHullVx.size(); j++)
// translate
listHullVx[j] = listHullVx[j] - xlate;
// rotate
double xPrev = listHullVx[j].x;
double yPrev = listHullVx[j].y;
listHullVx[j].x = ((xPrev*cosTheta) - (yPrev*sinTheta));
listHullVx[j].y = ((yPrev*cosTheta) + (xPrev*sinTheta));
// translate
listHullVx[j] = listHullVx[j] + xlate;
如果我注释掉上面'//rotate'下的代码,应用程序的输出是第一张图片。并将其添加回第二张图像。实际上没有其他事情发生(afaik)。
使用的数据类型都是双精度的,所以我认为这不是精度问题。有谁知道为什么旋转会导致如上图所示的倾斜?
编辑 filipe 下面的评论是正确的。这可能与轮换无关,我没有提供足够的信息来解决这个问题;
我在图片中展示的几何图形代表建筑物。它们是从 lon/lat 地图坐标生成的。在我用来进行转换的点数据中,我忘记了使用实际投影到笛卡尔坐标空间,只是映射了 x->lon、y->lat,我认为这就是我看到失真的原因。我将要求删除此问题,因为我认为它对其他人没有用处。
【问题讨论】:
您的公式实际上是一个二维旋转矩阵。我建议您学习如何使用转换矩阵,因为它们使组合转换变得非常容易。 只是一个想法,倾斜也可能在渲染时发生,而不是在转换数据本身时发生。您是否尝试过将数据设置为某个硬编码值,以查看它是否按预期呈现? 【参考方案1】:更新: 由于您的 cmets,它发现该错误不太可能出现在所提供的代码中。
最后一个提示:std 变换公式仅在坐标系是笛卡尔坐标系时才有效, 在 ios 上,你有时会倒置 y Achsis。
【讨论】:
'listHullVx' 仅代表“船体顶点列表”。 “xlate”只代表“翻译”。抱歉,如果我的代码混淆了,但是当我翻译时,我从另一个“Vec2”中减去一个“Vec2”对象......这会同时进行 x 和 y 翻译。 你的旋转角度是弧度吗? 是的。即使它们是偶然以度数指定的,sin() 和 cos() 也不会在意;我仍然会得到适当的旋转(以错误的角度)。我想我发布这个问题可能为时过早,问题出在其他地方......我会相应地更新或关闭这个问题。 是的,旋转是正确的,它必须在其他地方,否则翻译将不起作用。以上是关于点集上的 2d 旋转导致倾斜失真的主要内容,如果未能解决你的问题,请参考以下文章