.net 通过2个点计算图像旋转

.net 通过2个点计算图像旋转,.net,math,geometry,.net,Math,Geometry,我有以下图像: 我想以这样的方式旋转图像,使两个点在同一条线上 眼睛的最低点应该在同一水平面上 如何确定旋转图像的程度 我已经按照建议尝试了atan2函数,但这不会产生所需的角度。我用我的旋转函数和Photoshop测试了它 我得到了以下结果: pt1 = {X = 421 Y = 350} pt2 = {X = 241 Y = 325} angle = -3.0035866299322738 (calculated with the atan2 function as proposed in

我有以下图像:

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

眼睛的最低点应该在同一水平面上

如何确定旋转图像的程度

我已经按照建议尝试了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)
它导致这种旋转:

在以-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
这是一个简单的检查:

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

我确定了两点: pt1位于0,0处 pt2位于120,33

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

但atan2函数返回的角度为0.26836621090590684


我怎样才能得到我的15°呢?

如果你有这两个点的坐标,如果这些坐标的纵横比是一比一,如果坐标系被定义为向右移动增加第一个x坐标,向上移动增加第二个y坐标,如果第一个点x1,y1是这两点中最左边的,大多数计算机语言可以通过

angle = atan2(y2 - y1, x2 - x1)
将图片顺时针旋转该角度将使两点彼此水平。如果返回角度为负,则将其更改为正并逆时针旋转

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

在提问者尝试后添加

正如我在最初的回答中所强调的,我的公式取决于多个假设是否成立。既然你已经展示了你尝试的细节,我发现其中两个假设是错误的

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

angle = atan2(y1 - y2, x2 - x1)
请注意,我交换了y1和y2,这实际上用负片替换了它们

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

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

pt1 = {X = 241 Y = 325}
pt2 = {X = 421 Y = 350}
使用公式angle=atan2y1-y2,x2-x1得出结果

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


试试看它是否有效。我不知道你的语言是VB.NET吗?因此,我不能评论您的代码,也不能为您的环境显示代码。最近我用Python编程。

你是如何选择这两点的?一旦你选择了它们,它们是如何定义的,例如,作为一对有序的像素坐标?我只是看了一下,我认为每只眼睛的最低点在哪里。是的,它们是点=x,y。在这种情况下,它将是{X=195y=195}和{X=294y=190}。太好了,它工作了,谢谢@RoryDaultan你能告诉我旋转后如何计算坐标吗?对不起,我会先尝试自己解决这个问题。@t请注意,如果你只想旋转图像,实际上不需要显式计算角度。简单的向量数学就可以了。我有一个旋转函数来旋转位图,它需要一个角度,所以这对我来说非常好。@tmighty:正如我在原始答案中所说的,在大多数计算机环境中,我的公式得出的角度将以弧度为单位。许多环境都有将其转换为度的内置方法。如果你的不需要,你需要度,把我的结果乘以180,然后除以π。在您的示例中,给出7.907162702958458度。这就是你想要的吗?