我有一个有两个点的图像,对齐如下:
|----------------| | | | . | | | | . | | | |----------------|
我有两个点的X,Y坐标,我需要将图像旋转X度,所以它看起来像这样:
|----------------| | | | | | . . | | | | | |----------------|
基本上所以他们在彼此旁边对齐,这是什么数学?(C#中的代码示例会更好但不是必需的)
这取决于您希望将哪个点用作轮换的"中心".让我们将点指向向上和向左的点A,将点指向点B的右侧和下方.如果要绕点A旋转以使点B与其对齐,则以弧度计算旋转角度将如下所示:
double angle = Math.Atan2(pointB.Y - pointA.Y, pointB.X - pointA.X);
我不知道你是如何处理你的图像的,所以只有当你使用System.Drawing.Graphics时,以下内容才适用:
myImage.TranslateTransform(-pointA.X, -pointA.Y); myImage.RotateTransform((float) angle, MatrixOrder.Append); myImage.TranslateTransform(pointA.X, pointA.Y, MatrixOrder.Append);
希望能帮助到你.
没有代码,对不起,但是没有代价.
您需要能够通过对源图像进行采样来创建结果图像.您知道旋转角度,因此您现在需要创建一个映射器函数,该函数将结果映射回原始映射.
代码将简单地扫描结果图像的每一行,并将像素映射回原始图像.你可以做一个简单的事;
for (int plotY = 0; plotY < resultHeight; plotY++) { for (int plotX = 0; plotX < resultWidth; plotX++) { resultImage.PlotPixel(getOriginalPixel(plotX, plotY, angleOfRotation)); } }
所以现在我们只需要神奇的"getOriginalPixel"方法,这就是数学的用武之地.
如果我们将图像旋转0度,则plotX,plotY只是原始图像的X/Y. 但那没什么好玩的.
pickX = x * cos(angle) - y * sin(angle) pickY = y * cos(angle) + x * sin(angle)
我认为将映射到源像素.你需要检查它是否超出范围并且只返回黑色或者其他东西:)