ピクチャーを回転して表示(その1)
                                                       玄関へお回り下さい。
ピクチャーを回転して表示(90度毎  角度指定)       (085)
     
Option Explicit   'SampleNo=085 WindowsXP VB6.0(SP5) 2002.05.17

Private Sub Form_Load()
  Dim i As Integer
  For i = 0 To 4
    'ピクセル単位に設定
    Picture1(i).ScaleMode = 3
  Next i
End Sub


Private Sub Command1_Click()
  Dim co1 As Double, co2 As Double, co3 As Double, co4 As Double
  Dim si1 As Double, si2 As Double, si3 As Double, si4 As Double
  Dim x1 As Long, x2  As Long, x3  As Long, x4  As Long
  Dim y1 As Long, y2  As Long, y3  As Long, y4  As Long
  Dim x  As Long, y   As Long
  Dim c  As Long
  Dim i  As Integer

  co1 = Cos(1.57) '90 * 3.1417 / 180
  si1 = Sin(1.57)
  co2 = Cos(3.14) '180 * 3.1417 / 180
  si2 = Sin(3.14)
  co3 = Cos(4.71) '270 * 3.1417 / 180
  si3 = Sin(4.71)
  co4 = Cos(0.785) '45 * 3.1417 / 180
  si4 = Sin(0.785)
  'コントロールの中心を原点(0,0)に設定
  '正方形で割り切れる寸法が望ましい
  Picture1(0).ScaleLeft = -Picture1(0).ScaleWidth \ 2
  Picture1(0).ScaleTop = -Picture1(0).ScaleHeight \ 2
  Picture1(1).ScaleLeft = -Picture1(1).ScaleWidth \ 2
  Picture1(1).ScaleTop = -Picture1(1).ScaleHeight \ 2
  Picture1(2).ScaleLeft = -Picture1(2).ScaleWidth \ 2
  Picture1(2).ScaleTop = -Picture1(2).ScaleHeight \ 2
  Picture1(3).ScaleLeft = -Picture1(3).ScaleWidth \ 2
  Picture1(3).ScaleTop = -Picture1(3).ScaleHeight \ 2
  Picture1(4).ScaleLeft = -Picture1(4).ScaleWidth \ 2
  Picture1(4).ScaleTop = -Picture1(4).ScaleHeight \ 2
  '一旦ピクチャーをクリヤ
  For i = 1 To 4
    Set Picture1(i).Picture = LoadPicture()
  Next i
  For x = -Picture1(0).ScaleWidth \ 2 To Picture1(0).ScaleWidth \ 2
    For y = -Picture1(0).ScaleHeight \ 2 To Picture1(0).ScaleHeight \ 2
      x1 = x * co1 - y * si1
      y1 = x * si1 + y * co1
      x2 = x * co2 - y * si2
      y2 = x * si2 + y * co2
      x3 = x * co3 - y * si3
      y3 = x * si3 + y * co3
      x4 = x * co4 - y * si4
      y4 = x * si4 + y * co4
      '図のカラー情報の読み取り
      c = Picture1(0).Point(x, y)
      '読み取ったカラー情報を角度を変更して描画
      If c <> -1 Then
        Picture1(1).PSet (x1, y1), c
        Picture1(2).PSet (x2, y2), c
        Picture1(3).PSet (x3, y3), c
        Picture1(4).PSet (x4, y4), c
      End If
    Next y
  Next x
End Sub


    結 果
   

90度単位の回転はほぼ正確な位置に回転できますが45度のようになると誤差の為に正確な位置に回転できず、塗り残しができご覧の通りの図になる
(隣接する個所の色情報を平均化して補間してやれば、ほぼ綺麗な画像になるかと思います)
ピクチャーボックスに描いた画像等は AutoRedraw プロパティをTrue に設定しておかないとフォームの後ろ等に隠れたりした時画像が消えます。
ビットマップファイル等をロードして表示したものは、消えません。



2002/05/17