by kikiriri » 2008年12月06日(土) 19:07
プログラム動作確認(走りました)
再帰の所が難しいと思うんですが、
移植の際どんな風に作業されたのですか、
あと、直線の描画方向の変更等も読みこなしていくには難しいと思うんですが。
再帰的定義について、ビジュアルベーシックで、以下のプロ
グラムを実行しました。
ヒルベルト曲線を描くプログラムですが、変数ctが位数らし
いのですが、ct=1(最初は、6でした)ctと、ct-1(ct)の所
で、ctの値が、1,0、-1の順で、変わっていくのです
が、ctの値が、-1から0になるのが分かりません。
手間とは思いますが、もしよければ、ご意見いただけないで
しょうか、再帰的定義や、ぷろぐらむのながれがわかってい
ないなと、実感しました。
Public Class Form1
Dim g As Graphics
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Const GSIZE As Integer = 256
Dim ct, lenn, x, y As Integer
Dim d As Integer
g = PictureBox1.CreateGraphics()
g.Clear(PictureBox1.BackColor)
ct = 1
lenn = GSIZE / (2 ^ ct)
x = GSIZE - GSIZE / (2 ^ (ct + 1))
y = GSIZE / (2 ^ (ct + 1))
d = 270
drawA(ct - 1, x, y, d, lenn)
End Sub
Private Sub drawA(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
If ct < 0 Then Exit Sub
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90
End Sub
Private Sub drawB(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
If ct < 0 Then Exit Sub
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90
End Sub
Private Sub myDrawLine(ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
Dim oldx, oldy As Integer
If d < 0 Then d = d + 360
If d >= 360 Then d = d - 360
oldx = x : oldy = y
Select Case d
Case 0 : x = x + lenn
Case 90 : y = y - lenn
Case 180 : x = x - lenn
Case 270 : y = y + lenn
End Select
g.DrawLine(Pens.Black, oldx, oldy, x, y)
End Sub
End Class
確かにタイニーベーシックで、勉強したことは、多かれ少な
かれ、生かされていると思いました。
また以下は、TB
[875] Re[874]: 再帰的定義NO.47 投稿者:takeuchi 投稿日:2007/01/16(Tue) 19:30
> 再帰的定義について、ビジュアルベーシックで、以下のプロ
> グラムを実行しました。
このプログラムをTBで書き直してみました。殆ど同じです。
Const GSIZE As real = 256
GScreen(GSIZE,GSIZE)
input "1から8程度",ct
lenn = GSIZE / (2 ^ ct)
x = GSIZE - GSIZE / (2 ^ (ct + 1))
y = GSIZE / (2 ^ (ct + 1))
d = 270
drawA(ct - 1, x, y, d, lenn)
End
Sub drawA(ct , x , y , d , lenn)
If ct < 0 Then Exit Sub
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90
End Sub
Sub drawB(ct, x , y , d ,lenn)
If ct < 0 Then Exit Sub
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90
End Sub
Sub myDrawLine(x, y, d, lenn)
If d < 0 Then d = d + 360
If d >= 360 Then d = d - 360
oldx = x : oldy = y
Select Case d
Case 0 : x = x + lenn
Case 90 : y = y - lenn
Case 180 : x = x - lenn
Case 270 : y = y + lenn
End Select
Line(oldx, oldy)-(x, y)
End Sub
ご助言などありましたらお願いします。
参考にしてください。
プログラム動作確認(走りました)
再帰の所が難しいと思うんですが、
移植の際どんな風に作業されたのですか、
あと、直線の描画方向の変更等も読みこなしていくには難しいと思うんですが。
再帰的定義について、ビジュアルベーシックで、以下のプロ
グラムを実行しました。
ヒルベルト曲線を描くプログラムですが、変数ctが位数らし
いのですが、ct=1(最初は、6でした)ctと、ct-1(ct)の所
で、ctの値が、1,0、-1の順で、変わっていくのです
が、ctの値が、-1から0になるのが分かりません。
手間とは思いますが、もしよければ、ご意見いただけないで
しょうか、再帰的定義や、ぷろぐらむのながれがわかってい
ないなと、実感しました。
Public Class Form1
Dim g As Graphics
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Const GSIZE As Integer = 256
Dim ct, lenn, x, y As Integer
Dim d As Integer
g = PictureBox1.CreateGraphics()
g.Clear(PictureBox1.BackColor)
ct = 1
lenn = GSIZE / (2 ^ ct)
x = GSIZE - GSIZE / (2 ^ (ct + 1))
y = GSIZE / (2 ^ (ct + 1))
d = 270
drawA(ct - 1, x, y, d, lenn)
End Sub
Private Sub drawA(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
If ct < 0 Then Exit Sub
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90
End Sub
Private Sub drawB(ByVal ct As Integer, ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
If ct < 0 Then Exit Sub
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90
End Sub
Private Sub myDrawLine(ByRef x As Integer, ByRef y As Integer, ByRef d As Integer, ByVal lenn As Integer)
Dim oldx, oldy As Integer
If d < 0 Then d = d + 360
If d >= 360 Then d = d - 360
oldx = x : oldy = y
Select Case d
Case 0 : x = x + lenn
Case 90 : y = y - lenn
Case 180 : x = x - lenn
Case 270 : y = y + lenn
End Select
g.DrawLine(Pens.Black, oldx, oldy, x, y)
End Sub
End Class
確かにタイニーベーシックで、勉強したことは、多かれ少な
かれ、生かされていると思いました。
また以下は、TB
[875] Re[874]: 再帰的定義NO.47 投稿者:takeuchi 投稿日:2007/01/16(Tue) 19:30
> 再帰的定義について、ビジュアルベーシックで、以下のプロ
> グラムを実行しました。
このプログラムをTBで書き直してみました。殆ど同じです。
Const GSIZE As real = 256
GScreen(GSIZE,GSIZE)
input "1から8程度",ct
lenn = GSIZE / (2 ^ ct)
x = GSIZE - GSIZE / (2 ^ (ct + 1))
y = GSIZE / (2 ^ (ct + 1))
d = 270
drawA(ct - 1, x, y, d, lenn)
End
Sub drawA(ct , x , y , d , lenn)
If ct < 0 Then Exit Sub
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90 : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90
End Sub
Sub drawB(ct, x , y , d ,lenn)
If ct < 0 Then Exit Sub
d = d + 90 : drawA(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
d = d - 90 : drawB(ct - 1, x, y, d, lenn) : myDrawLine(x, y, d, lenn)
drawB(ct - 1, x, y, d, lenn) : d = d - 90 : myDrawLine(x, y, d, lenn)
drawA(ct - 1, x, y, d, lenn) : d = d + 90
End Sub
Sub myDrawLine(x, y, d, lenn)
If d < 0 Then d = d + 360
If d >= 360 Then d = d - 360
oldx = x : oldy = y
Select Case d
Case 0 : x = x + lenn
Case 90 : y = y - lenn
Case 180 : x = x - lenn
Case 270 : y = y + lenn
End Select
Line(oldx, oldy)-(x, y)
End Sub
ご助言などありましたらお願いします。
参考にしてください。