2008年06月26日

水平線が斜めに見える?(Illusions0001)

今日は、「写真で絵画」のために技術情報を調査していました。
直接は関係ありませんが、画像つながりで錯覚画像を作成する
プログラムを掲載しているBlogに到着しました。

面白そうなので、私もVB.NETでプログラムを書いて錯覚画像を作成してみました。
Sloping Lines
クリックすると大きな画像を表示します。
ずっと見ていると目がまわってしまいます。
みなさん、ご注意ください。

見つけたBlogはそっとしていた方がよさそうなので、もともとの画像ページのみご紹介します。


お知らせ
技術ブログ記事一覧

これまでに投稿した技術的な記事を、Webデザイン、セキュリティ、
ソフトウェアなどのカテゴリー別にまとめています。
よろしければ時々ご覧ください。


作成したプログラム
Windows用の実行プログラム、ソースコードはコチラ


Public Class Form1
    Const IMG_WIDTH As Integer = 500
    Const IMG_HEIGHT As Integer = 250
    Dim BOX_X_SUM As Integer = 8
    Dim BOX_Y_SUM As Integer = 9
    Const HORIZONTAL_LINE_WIDTH As Integer = 1
    Const BOX_LINE_WIDTH As Integer = 14
    Const BOX_MOVE As Integer = 50 '移動距離(0,1,2)を箱の幅に対する割合で表現
    Const BOX_SHIFT_SUM As Integer = 2 ' BOXの移動距離(0,1,2...)
    Dim dt() As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim img As Bitmap
        If Not PictureBox1.Image Is Nothing Then
            img = PictureBox1.Image
        Else
            img = New Bitmap(IMG_WIDTH, IMG_HEIGHT)
        End If
        Dim picbox As Graphics = PictureBox1.CreateGraphics()
        Dim g As Graphics = Graphics.FromImage(img)
        g.Clear(Color.White)
        Dim dx As Integer = 10
        Dim dy As Integer = 10
        Dim hr_line_width As Integer = HORIZONTAL_LINE_WIDTH
        Dim bx_line_width As Integer = BOX_LINE_WIDTH
        Dim box_height As Integer = (IMG_HEIGHT - dy * 2) \ BOX_Y_SUM - hr_line_width
        Dim box_width As Integer = box_height
        Dim box_space As Integer = ((IMG_WIDTH - dx * 2) - box_width * BOX_X_SUM) \ (BOX_X_SUM + 2)
        dt = get_dt(BOX_Y_SUM)
        Dim pn_line As New Pen(Color.Red, hr_line_width)
        Dim br_box As New SolidBrush(Color.Black)
        For y As Integer = 0 To BOX_Y_SUM - 1
            Dim ys As Integer = dy + (box_height + hr_line_width) * y
            For x As Integer = 0 To BOX_X_SUM - 1
                Dim xs As Integer = dx + 1.5 * box_space
                xs += (box_width + box_space) * x
                xs += dt(y) * (box_width * BOX_MOVE / 100)
                Dim pn_box As New Pen(Color.Black, bx_line_width)
                If False Then
                    g.DrawRectangle(pn_box, New Rectangle(xs, ys, box_width - BOX_LINE_WIDTH, box_height - BOX_LINE_WIDTH))
                Else
                    g.FillRectangle(br_box, xs, ys, box_width, box_height)
                End If
            Next
            If y <> BOX_Y_SUM - 1 Then
                g.DrawLine(pn_line, dx, ys + box_height, IMG_WIDTH - 1 - dx, ys + box_height)
            End If
        Next
        picbox.DrawImage(img, 0, 0)
        g.Dispose()
        picbox.Dispose()
        PictureBox1.Image = img
    End Sub
    Function get_dt(ByVal sum As Integer) As Integer()
        If sum <= 0 Then Return Nothing
        Dim dt(sum - 1) As Integer
        Dim a As Integer = 1
        Dim max As Integer = 2
        Dim min As Integer = 0
        Dim value As Integer = min
        For i As Integer = 0 To sum - 1
            dt(i) = value
            value += a
            If value > max Then
                a = -a
                value += (2 * a)
            ElseIf value < min Then
                a = -a
                value += 2 * a
            End If
        Next
        Return dt
    End Function

    Sub set_parameter()
        BOX_X_SUM = NumericUpDown1.Value
        BOX_Y_SUM = NumericUpDown2.Value
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Label1.Text = "Sloping lines"
        Label3.Text = "Are the red lines horizontal or sloping?"
        set_parameter()
    End Sub

    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
    NumericUpDown1.ValueChanged, _
    NumericUpDown2.ValueChanged
        set_parameter()
    End Sub
End Class



同じカテゴリー(錯視・錯覚)の記事
 福田繁雄のトリックアート・トリップ (2009-02-13 02:18)
 きらめき格子錯視(Illusions0002) (2009-02-09 17:47)
Posted by 植物お手伝い係 at 19:08│Comments(0)錯視・錯覚
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。
削除
水平線が斜めに見える?(Illusions0001)
    コメント(0)