5

座標 (x1,y1) と (x2,y2) を持つ四角形があり、回転行列を使用してその中心を中心に四角形を θ だけ回転させる必要があります。

 |  cosθ  sinθ |
 | -sinθ  cosθ |

回転後の境界四角形の座標を見つける必要があります。

回転前

0,0
 |"""""""""""""""""""""""""""""""""""""""""""|
 |                                           |
 |  x1,y1                                    |
 |       |"""""""""""""|                     |
 |       |             |                     |
 |       |             |                     | 
 |       |             |                     |
 |       """""""""""""" x2,y2                |
 |                                           |
 |                                           |
  """"""""""""""""""""""""""""""""""""""""""" W,H

回転後

 0,0
     |"""""""""""""""""""""""""""""""""""""""""""|
     |           ?,?                             |
     |            |""""/\"""""|                  |      
     |            |   /   \   |                  |
     |            |  /      \ |                  |
     |            | /        /|                  |
     |            |/        / |                  |
     |            |\       /  |                  |
     |            |  \    /   |                  |
     |            |    \ /    |                  |
     |             """""""""""  ?,?              |
     |                                           |
     |                                           |
      """"""""""""""""""""""""""""""""""""""""""" W,H

境界矩形の座標を見つけるための一般的な方程式はありますか?

ありがとう....

ハリス。

4

2 に答える 2

4

図面にすべての Fi 角度をマークするだけで、それがわかります

Old_Width = X2_Old - X1_Old, Old_Height = Y2_Old - Y1_Old
New_Height = Old_Width * Abs(Sin(Fi)) + Old_Height * Abs(Cos(Fi))
New_Width = Old_Width * Abs(Cos(Fi)) + Old_Height * Abs(Sin(Fi))
X1_New = X1_Old - (New_Width - OldWidth) / 2 = 
         (X1_Old + X2_Old - New_Width) / 2

ここに画像の説明を入力

デルファイ テスト:

procedure TForm1.DrawRotatedRectWithFrame(X0, Y0, X1, Y1: Integer; Fi: Double);
var
  P: array[0..3] of TPoint;
  CX, CY, WX, WY, NW, NH : Integer;
  CF, SF: Double;
begin
  CX := (X0 + X1) div 2;  //Center point
  CY := (Y0 + Y1) div 2;
  WX := (X1 - X0) div 2;  //Half-width
  WY := (Y1 - Y0) div 2;
  SinCos(Fi, SF, CF);
  //calculate vertices of rotated rectangle
  P[0] := Point(Round(CX  -WX*CF + WY * SF), Round(CY - WX * SF - WY * CF));
  P[1] := Point(Round(CX  +WX*CF + WY * SF), Round(CY + WX * SF - WY * CF));
  P[2] := Point(Round(CX  +WX*CF - WY * SF), Round(CY + WX * SF + WY * CF));
  P[3] := Point(Round(CX  -WX*CF - WY * SF), Round(CY - WX * SF + WY * CF));
  Canvas.Polygon(P); //draw rotated rectangle

  Canvas.Rectangle(CX - 2, CY - 2, CX + 3, CY + 3); //mark center point
  NH := Round(Abs(WX * SF) + Abs(WY * CF));  //boundrect half-height
  NW := Round(Abs(WX * CF) + Abs(WY * SF));  //boundrect half-width
  Canvas.Brush.Style := bsClear;
  Canvas.Rectangle(CX - NW, CY - NH, CX + NW, CY + NH); //draw bound rectangle
end;

出力例:

ここに画像の説明を入力

于 2013-11-07T08:21:10.207 に答える
3

点 (x 1 , y 1 ) は (x 1 cos θ - y 1 sin θ, x 1 sin θ + y 1 cos θ) に回転し、点 (x 2 , y 2 ) は (x 2 cos θ - y ) に回転します。 2 sin θ、x 2 sin θ + y 2 cos θ)。残りの 2 点は、それに応じて計算できます。

境界反応角の座標は (x 3 , y 3 ) と (x 4 , y 4 ) です。ここで、x 3はすべての新しい x 座標の最小値、y 3はすべての新しい y 座標の最小値、x 4は最大の値です。すべての新しい x 座標と y 4すべての新しい y 座標の最大値です。

どの角が最小の x (など) を生成するかは、角度または回転によって異なります。0° から 90° までの角度の場合、x 3は (x 1 , y 1 ) から得られるため、x 3 = x 1 cos θ - y 1 sin θ となります。90° から 180° までの角度の場合、(x 2 , y 1 ) などになります。したがって、回転角度に基づいて使用するポイントを決定するか、すべての x と y の最小と最大を取得します。


しかし、おそらくhttps://math.stackexchange.com/でこれを尋ねる必要があると思います

于 2013-11-07T08:10:04.390 に答える