计算图像旋转 2点(point rotation calculator)

我有以下图片:

我有以下图片:

enter image description here

我想以这样的方式旋转图像,2 点在同一条线上。

眼睛的最低点应该在同一“水平”上。

我怎么能确定我必须旋转图像的程度?

我已经按照建议尝试了 atan2 功能,但这不会导致所需的角度。我用我的旋转功能以及 Photoshop 测试了它。

我得到了以下结果:

pt1 = {X = 421 Y = 350}
pt2 = {X = 241 Y = 325}
angle = -3.0035866299322738 (calculated with the atan2 function as proposed in one answer)

It results in this rotation: enter image description here

在角度-3 旋转后,绿线应该是完全直的,但事实并非如此,所以我不知道这里的罪魁祸首。

也许我的旋转代码是不正确的。

这是我的旋转代码:

Public Function RotateImage(ByVal uBmp As Bitmap, ByVal uAngle As Double) As Bitmap
    ' //create a New empty bitmap to hold rotated image
    Dim nBmp As Bitmap = New Bitmap(uBmp.Width, uBmp.Height)
    nBmp.SetResolution(uBmp.HorizontalResolution, uBmp.VerticalResolution)
    '//make a graphics object from the empty bitmap
    Using g As Graphics = Graphics.FromImage(nBmp)
        ' //Put the rotation point in the center of the image
        ' rotate aroung the center of the image
        g.TranslateTransform(uBmp.Width \ 2, uBmp.Height \ 2)
        'rotate
        g.RotateTransform(uAngle)
        g.TranslateTransform(-uBmp.Width \ 2, -uBmp.Height \ 2)
        ' //draw passed in image onto graphics object
        g.DrawImage(uBmp, New PointF(0, 0))
    End Using
    Return nBmp
End Function

这是一个简单的检查:

使用在线工具绘制角度,我得到了以下图像:

enter image description here

我已经确定了 2 个点:pt1 位于(0,0)pt2 位于(120,33)

在线工具绘制了 15 ° 的角度。

但是 atan2 函数返回角度 = 0.26836621090590684。

我怎么能拿回我的 15 °?

1

如果您有这两个点的坐标,并且这些坐标的纵横比是一对一的,并且如果定义了坐标系,则向右移动会增加第一个(x)坐标,而向上移动会增加第二个(y)坐标,并且如果第一个点(x1,y1)是这两个点中最左边的点,则大多数计算机语言都可以通过

angle = atan2(y2 - y1, x2 - x1)

将图片顺时针旋转该角度将使两个点彼此水平,如果返回的角度为负,则将其更改为正,然后逆时针旋转。

请注意,一些语言交换 x 和 y 坐标,大多数语言将以弧度返回角度。(如果您需要度,将得到的弧度角乘以 180,然后除以 pi。)如果我陈述的任何假设都是错误的,则需要相应地调整该公式。如果您有任何这些假设的更多详细信息,请告诉我,我可以为您调整公式。

(在提问者尝试后添加。)

正如我刚才在最初的答案中强调的那样,我的公式取决于多个假设是否正确。现在你已经展示了你尝试的细节,我看到其中两个假设是错误的。

最重要的是,一个假设是“向上移动会增加第二个 (y) 坐标”,这是欧几里得几何的标准。许多图形环境都有一个递增的第二 (y) 坐标移动向下,您的示例显示您就是这种情况。使用此假设,将我的公式更改为

angle = atan2(y1 - y2, x2 - x1)

请注意,我交换了y1y2,这实际上用它的负数替换了每个。

第二个假设是“第一点(x1,y1)是这两个点中最左边的点”。在您的示例中,第一点是最右边的点,而不是最左边的点。如果第一点具有较大的 x 坐标,则应编写例程以交换点。

有了这些变化,你的观点是

pt1 = {X = 241 Y = 325}
pt2 = {X = 421 Y = 350}

并使用公式angle = atan2(y1 - y2, x2 - x1)给出结果

-0.13800602365751946

该角度为负,因此请将图片逆时针旋转角度0.13800602365751946弧度,即7.907162702958458度。

试试这个,看看它是否有效。我不知道你的语言 (是 VB.NET 吗?),所以我不能评论你的代码或向你展示你的环境的代码。这些天我用 Python 编程。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(823)
如何在 Scala中按字符串拆分字符串
上一篇
如何在 Mandango中创建自动增量字段
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(77条)