2008年06月26日
水平線が斜めに見える?(Illusions0001)
今日は、「写真で絵画」のために技術情報を調査していました。
直接は関係ありませんが、画像つながりで錯覚画像を作成する
プログラムを掲載しているBlogに到着しました。
面白そうなので、私もVB.NETでプログラムを書いて錯覚画像を作成してみました。
クリックすると大きな画像を表示します。
ずっと見ていると目がまわってしまいます。
みなさん、ご注意ください。
見つけたBlogはそっとしていた方がよさそうなので、もともとの画像ページのみご紹介します。
作成したプログラム
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
直接は関係ありませんが、画像つながりで錯覚画像を作成する
プログラムを掲載しているBlogに到着しました。
面白そうなので、私もVB.NETでプログラムを書いて錯覚画像を作成してみました。
クリックすると大きな画像を表示します。
ずっと見ていると目がまわってしまいます。
みなさん、ご注意ください。
見つけた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
Posted by 植物お手伝い係 at 19:08│Comments(0)
│錯視・錯覚