0

我有一个 C 应用程序,我已将图像(gif)对象加载到屏幕上。现在我希望图像对象与我的指针一起在一个轴上旋转。

意味着无论我在屏幕上移动指针的任何位置,我的图像都应该从一个固定点旋转......我该怎么做?

我见过像这样的公式

newx = cos(angle) * oldx - sin(angle) * oldy

newy = sin(angle) * oldx + cos(angle) * oldy

但它也输入角度..但我没有角度...我有指针坐标...如何使对象根据鼠标指针移动?

4

3 回答 3

1

说真的……你在中学学过三角学吧?

angle = arctan((pointerY - centerY) / (pointerX - centerX))

在 C 中:

// obtain pointerX and pointerY; calculate centerX as width of the image / 2,
// centerY as heigth of the image / 2
double angle = atan2(pointerY - centerY, pointerX - centerX);

double newX = cos(angle) * oldX - sin(angle) * oldY
double newY = sin(angle) * oldX + cos(angle) * oldY
于 2012-06-07T07:34:14.757 回答
1

首先,如果您的旋转在 2D 空间中,则该公式非常好。您不能从公式中删除角度,因为没有角度的旋转是没有意义的!!想想看。

你真正需要的是在做你想做的事情之前学习更多基本的东西。例如,您应该了解:

  • 如何从窗口管理系统(例如SDL)获取鼠标位置
  • 如何根据鼠标位置找到角度
  • 如何绘制带有纹理的四边形(例如使用OpenGL
  • 如何执行转换,无论是手动还是例如使用OpenGL 本身

更新

如果您别无选择,只能绘制直矩形,则需要手动旋转图像,创建新图像。此链接包含您需要查找的所有关键字。但简而言之,它是这样的:

for every point (dr,dc) in destination image
    find inverse transform of (dr,dc) in original image, named (or, oc)
    // Note that most probably or and oc are fractional numbers
    from the colors of:
        - (floor(or), floor(oc))
        - (floor(or), ceil(oc))
        - (ceil(or), floor(oc))
        - (ceil(or), ceil(oc))
    using bilinear interpolation, computing a color (r,g,b)
    dest_image[dr][dc] = (r,g,b)
于 2012-06-07T07:35:23.943 回答
0

您计算的用户在屏幕上单击的位置与旧坐标之间的角度。

例如

在屏幕上你有一个正方形

( 0,10)-----(10,10)
       |    |
       |    |
       |    |
( 0, 0)-----(10, 0)

如果用户点击说(15,5)

例如,您可以从角或正方形的横截面计算相对于正方形的角度,然后只需使用您对正方形的每个坐标已有的公式。

于 2012-06-07T07:38:59.017 回答