0

image(gif) オブジェクトを画面にロードした C アプリケーションがあります。ここで、Image オブジェクトをポインターと一緒に 1 つの軸で回転させたいと思います。

画面上でポインターをどこに移動しても、画像は固定点から回転する必要があります...どうすればよいですか?

私は次のような式を見てきました

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 空間にある場合、その式は完全に問題ありません。角度のない回転は意味がないため、数式から角度を削除することはできません!! 考えてみてください。

本当に必要なのは、やろうとしていることを実行する前に、より基本的なことを学ぶことです。たとえば、次のことを学ぶ必要があります。

アップデート

どうしても真っ直ぐな長方形を描くしかない場合は、画像を手動で回転させて新しい画像を作成する必要があります。このリンクには、そのために検索する必要があるすべてのキーワードが含まれています。ただし、簡単に言うと、次のようになります。

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 に答える