作成者 |
メッセージ |
|
|
記事の件名: |
位数(input "1から8程度",ct)について考察してみてください |
引用付きで返信する |
|
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)で正方形の大きさが変わるんですけど、
freebasicは知らないんですが、すみません。
再現されていればいいですが、
前のプログラム(ab)では、横長の長方形になってしまいます。
元のn88basicのプログラムがそうだったからかもしれませんが、すみません
TBのプログラムを参考にしてもらえれば、
正方形の大きさが変わる(位数って言うらしいんですが)
ほうが応用が利いてていいのかも、
僕自身ヒルベルト曲線について理解しているわけではなく、
直線を引く方向を再帰的に変えて(決めて)大きな正方形を描くわけですが、
こっちのほうが見ていて気持ちがいいです。
再帰は、自分自身の関数を呼び出して、なりったって、
いるというか、プログラムを読みやすくしたり、
可能にしたりしている、裏ではものすごい処理量になっている場合がある。
ので使い方に気をつけたほうがいいというところまで?です、すみません
階乗で、一杯一杯で、これは、
ヒルベルト曲線で、(階乗のように、単純でなく?(十分難しいという話もある?))
さっぱり分かりません。
直線の描画方向を、0度、90度、180度、270度の内どれかに決めて
書いていき、(すみません)わからないのでこの辺でやめときます。
毛虫のようにくねくねと線が描かれていく様子が、なんだか良いですね?
です。すみませんがfreebasicの付き合いはできないかもしれません
参考までに??????
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)で正方形の大きさが変わるんですけど、 freebasicは知らないんですが、すみません。 再現されていればいいですが、 前のプログラム(ab)では、横長の長方形になってしまいます。 元のn88basicのプログラムがそうだったからかもしれませんが、すみません TBのプログラムを参考にしてもらえれば、 正方形の大きさが変わる(位数って言うらしいんですが) ほうが応用が利いてていいのかも、 僕自身ヒルベルト曲線について理解しているわけではなく、 直線を引く方向を再帰的に変えて(決めて)大きな正方形を描くわけですが、 こっちのほうが見ていて気持ちがいいです。 再帰は、自分自身の関数を呼び出して、なりったって、 いるというか、プログラムを読みやすくしたり、 可能にしたりしている、裏ではものすごい処理量になっている場合がある。 ので使い方に気をつけたほうがいいというところまで?です、すみません 階乗で、一杯一杯で、これは、 ヒルベルト曲線で、(階乗のように、単純でなく?(十分難しいという話もある?)) さっぱり分かりません。 直線の描画方向を、0度、90度、180度、270度の内どれかに決めて 書いていき、(すみません)わからないのでこの辺でやめときます。 毛虫のようにくねくねと線が描かれていく様子が、なんだか良いですね? です。すみませんがfreebasicの付き合いはできないかもしれません 参考までに??????
|
|
|
投稿記事 |
Posted: 2008年12月31日(水) 17:33 |
|
|
|
|
|
小修正で、FreeBASICでも動きました。
[url]http://makotowatana.ld.infoseek.co.jp/FreeBasicPgPset.html#start[/url]
|
|
|
投稿記事 |
Posted: 2008年12月29日(月) 16:04 |
|
|
|
|
|
すみませんでした。
親切なご回答に感謝してます。
すみませんでした。 親切なご回答に感謝してます。
|
|
|
投稿記事 |
Posted: 2008年12月07日(日) 04:30 |
|
|
|
|
|
>いろいろなプログラム言語が読めるのですか?
一応、必要になったことのある言語の内大半は読める程度には理解しています。
>専門的に勉強したことはあるんですか
「専門的」の意味が掴めませんが、大学で講義を受けたことはありません。
殆ど独学のようなものですが、勉強する上で沢山の人にヒントを貰いました。
疑問文が質問形式になっているかどうか確認してから投稿したほうがいいよ。
#余分な改行が多い気が・・・
>いろいろなプログラム言語が読めるのですか? 一応、必要になったことのある言語の内大半は読める程度には理解しています。 >専門的に勉強したことはあるんですか 「専門的」の意味が掴めませんが、大学で講義を受けたことはありません。 殆ど独学のようなものですが、勉強する上で沢山の人にヒントを貰いました。
疑問文が質問形式になっているかどうか確認してから投稿したほうがいいよ。
#余分な改行が多い気が・・・
|
|
|
投稿記事 |
Posted: 2008年12月06日(土) 21:39 |
|
|
|
|
|
押し付けるような質問ですみませんでした。
ご助言ありがとうございました。
僕は変数の値を追っていくだけで精一杯なので、
ご助言より、
プログラムが動いている感じがします。
生もののようです。
正体はばれているようですんで、
もう少し言うと、いろいろなプログラム言語が読めるのですか?
VBを買ってしまい。(エクスプレスバージョン)2005
TBから入ったおかげでついていけてる気もするんですが、
分かってないなという風にも分かり、微妙です。
今は、CやC++、JAVAの勉強をしたほうがいいかもと、
柴田望洋氏の、明解を読んだりしているんですが、
専門的に勉強したことはあるんですか(失礼)
僕には努力が足りないとも思います。
本当にありがたいのですが、
掲示板チャット状態になってしまいそうですが???
よろしければご助言等いただけませんか。
以上すみませんがお願いします。
押し付けるような質問ですみませんでした。
ご助言ありがとうございました。
僕は変数の値を追っていくだけで精一杯なので、
ご助言より、
プログラムが動いている感じがします。
生もののようです。
正体はばれているようですんで、
もう少し言うと、いろいろなプログラム言語が読めるのですか?
VBを買ってしまい。(エクスプレスバージョン)2005
TBから入ったおかげでついていけてる気もするんですが、
分かってないなという風にも分かり、微妙です。
今は、CやC++、JAVAの勉強をしたほうがいいかもと、
柴田望洋氏の、明解を読んだりしているんですが、
専門的に勉強したことはあるんですか(失礼)
僕には努力が足りないとも思います。
本当にありがたいのですが、
掲示板チャット状態になってしまいそうですが???
よろしければご助言等いただけませんか。
以上すみませんがお願いします。
|
|
|
投稿記事 |
Posted: 2008年12月06日(土) 20:52 |
|
|
|
|
|
GosubやReturnを機械的に関数呼び出しに置き換えて、
PushとPopがいらなくなったので削りました。
他のユーザー定義関数を呼ばない関数から動作を確認して行き、あとは気合で(ry
再帰の捕らえ方は
私はまず、意味上は自分自身を呼び出さない場合(ここではN=1)にどのような動作になるかを確認し、
それから自分自身を呼び出す場合について考えます。
他に助言があるとすれば――hideやcodeのBBCodeを是非使ってください。
或いは、掲示板へのリンクがあれば十分なので、わざわざ全文貼らないでください。
掲示板を探して会話の流れを追うまで、質問の意味もよく分かりませんでした。
#ctの値が-1になることがあるのは、コードを目で追っていっても分かると思うのですが・・・。
GosubやReturnを機械的に関数呼び出しに置き換えて、 PushとPopがいらなくなったので削りました。 他のユーザー定義関数を呼ばない関数から動作を確認して行き、あとは気合で(ry
再帰の捕らえ方は 私はまず、意味上は自分自身を呼び出さない場合(ここではN=1)にどのような動作になるかを確認し、 それから自分自身を呼び出す場合について考えます。
他に助言があるとすれば――hideやcodeのBBCodeを是非使ってください。 或いは、掲示板へのリンクがあれば十分なので、わざわざ全文貼らないでください。 掲示板を探して会話の流れを追うまで、質問の意味もよく分かりませんでした。 #ctの値が-1になることがあるのは、コードを目で追っていっても分かると思うのですが・・・。
|
|
|
投稿記事 |
Posted: 2008年12月06日(土) 20:27 |
|
|
|
|
|
プログラム動作確認(走りました)
再帰の所が難しいと思うんですが、
移植の際どんな風に作業されたのですか、
あと、直線の描画方向の変更等も読みこなしていくには難しいと思うんですが。
再帰的定義について、ビジュアルベーシックで、以下のプロ
グラムを実行しました。
ヒルベルト曲線を描くプログラムですが、変数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
ご助言などありましたらお願いします。 参考にしてください。
|
|
|
投稿記事 |
Posted: 2008年12月06日(土) 19:07 |
|
|
|
|
|
間違いなく動くコード作ったら こんな具合になりました。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: #N88BASIC
Dim N As Double,L As Double,ANGLE As Double,ZP As Double
Dim PosX=240 As Double,PosY=280 As Double
N=4
L=10
ANGLE=90
ZP=0
Hilbert(N,ANGLE,L,ZP)
Sleep(-1)
Sub Hilbert(N As Long,ANGLE As Double,L As Double,ZP As Double)
If N<>0 then
Turn(ANGLE)
Hilbert(N-1,-ANGLE,L,ZP)
Move(L)
Turn(-ANGLE)
Hilbert(N-1,ANGLE,L,ZP)
Move(L)
Hilbert(N-1,ANGLE,L,ZP)
Turn(-ANGLE)
Move(L)
Hilbert(N-1,-ANGLE,L,ZP)
Turn(ANGLE)
End If
End Sub
Sub Move(ZLENG As Double)
Dim x As Double,y As Double
x=ZLENG*Cos(ZP*_System_PI/180)
y=ZLENG*Sin(ZP*_System_PI/180)
LINE (PosX,PosY)-(PosX+x,PosY-y),6
PosX=PosX+x
PosY=PosY-y
End Sub
Sub Turn(ZDEG As Double)
ZP=ZP+ZDEG
If ZP>360 then
ZP=ZP-360
Turn(0)
ElseIf ZP<0 then
ZP=ZP+360
Turn(0)
End If
End Sub
間違いなく動くコード作ったら[hide=こんな具合になりました。][code]#N88BASIC Dim N As Double,L As Double,ANGLE As Double,ZP As Double Dim PosX=240 As Double,PosY=280 As Double
N=4 L=10 ANGLE=90 ZP=0 Hilbert(N,ANGLE,L,ZP) Sleep(-1)
Sub Hilbert(N As Long,ANGLE As Double,L As Double,ZP As Double) If N<>0 then Turn(ANGLE) Hilbert(N-1,-ANGLE,L,ZP) Move(L) Turn(-ANGLE) Hilbert(N-1,ANGLE,L,ZP) Move(L) Hilbert(N-1,ANGLE,L,ZP) Turn(-ANGLE) Move(L) Hilbert(N-1,-ANGLE,L,ZP) Turn(ANGLE) End If End Sub
Sub Move(ZLENG As Double) Dim x As Double,y As Double x=ZLENG*Cos(ZP*_System_PI/180) y=ZLENG*Sin(ZP*_System_PI/180) LINE (PosX,PosY)-(PosX+x,PosY-y),6 PosX=PosX+x PosY=PosY-y End Sub
Sub Turn(ZDEG As Double) ZP=ZP+ZDEG If ZP>360 then ZP=ZP-360 Turn(0) ElseIf ZP<0 then ZP=ZP+360 Turn(0) End If End Sub[/code][/hide]
|
|
|
投稿記事 |
Posted: 2008年12月06日(土) 18:11 |
|
|
|
|
|
100 ' --------------------------
110 ' * ヒルベルト曲線 *
120 ' --------------------------
130 '
140 DIM STACK(1000)
150 SP=0
160 '
170 SCREEN 3,0,0,1:CLS 3
180 POINT(240,280)
190 N=4:L=10:ANGLE=90:GOSUB *HILBERT
200 END
210 *HILBERT
220 IF N=0 THEN RETURN
230 ZDEG=ANGLE:GOSUB *TURN
240 GOSUB *PUSH
250 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
260 GOSUB *POP
270 ZLENG=L:GOSUB *MOVE
280 ZDEG=-ANGLE:GOSUB *TURN
290 GOSUB *PUSH
300 N=N-1:GOSUB *HILBERT
310 GOSUB *POP
320 ZLENG=L:GOSUB *MOVE
330 GOSUB *PUSH
340 N=N-1:GOSUB *HILBERT
350 GOSUB *POP
360 ZDEG=-ANGLE:GOSUB *TURN
370 ZLENG=L:GOSUB *MOVE
380 GOSUB *PUSH
390 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
400 GOSUB *POP
410 ZDEG=ANGLE:GOSUB *TURN
420 RETURN
430 *PUSH
440 STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2
450 RETURN
460 *POP
470 ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2
480 RETURN
490 *MOVE
500 ZX=ZLENG*COS(ZP*3.14159/180)
510 ZY=ZLENG*SIN(ZP*3.14159/180)
520 LINE -STEP(ZX,-ZY)
530 RETURN
540 *TURN
550 ZP=(ZP+ZDEG) MOD 360
560 RETURN
n88互換basic for windows95でも成功しました、
ご助言ありがとうございました。
100 ' -------------------------- 110 ' * ヒルベルト曲線 * 120 ' -------------------------- 130 ' 140 DIM STACK(1000) 150 SP=0 160 ' 170 SCREEN 3,0,0,1:CLS 3 180 POINT(240,280) 190 N=4:L=10:ANGLE=90:GOSUB *HILBERT 200 END 210 *HILBERT 220 IF N=0 THEN RETURN 230 ZDEG=ANGLE:GOSUB *TURN 240 GOSUB *PUSH 250 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT 260 GOSUB *POP 270 ZLENG=L:GOSUB *MOVE 280 ZDEG=-ANGLE:GOSUB *TURN 290 GOSUB *PUSH 300 N=N-1:GOSUB *HILBERT 310 GOSUB *POP 320 ZLENG=L:GOSUB *MOVE 330 GOSUB *PUSH 340 N=N-1:GOSUB *HILBERT 350 GOSUB *POP 360 ZDEG=-ANGLE:GOSUB *TURN 370 ZLENG=L:GOSUB *MOVE 380 GOSUB *PUSH 390 N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT 400 GOSUB *POP 410 ZDEG=ANGLE:GOSUB *TURN 420 RETURN 430 *PUSH 440 STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 450 RETURN 460 *POP 470 ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 480 RETURN 490 *MOVE 500 ZX=ZLENG*COS(ZP*3.14159/180) 510 ZY=ZLENG*SIN(ZP*3.14159/180) 520 LINE -STEP(ZX,-ZY) 530 RETURN 540 *TURN 550 ZP=(ZP+ZDEG) MOD 360 560 RETURN
n88互換basic for windows95でも成功しました、 ご助言ありがとうございました。
|
|
|
投稿記事 |
Posted: 2008年12月06日(土) 16:12 |
|
|
|
|
|
以下のプログラムで結果を見ることが出来ました、
誠にありがとうございました。
ただ本に出てた結果と違うのと、
プログラムコードが僕には強者で、
理解不能、
正方形の外観になる予定でしたが、
やはり等脚台形でした。惜しい
ただこの短時間で移植らしきことが出来たことに感謝しています。
sleep(-1)感謝!!!
#N88BASIC
Dim STACK(1000) As Double
Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double
Dim SP As Long, POINT(240,280) As Double
SP=0
PSET(240,280)
N=4:L=10:ANGLE=90:GOSUB *HILBERT
Sleep(-1)'END
*HILBERT
IF N=0 THEN RETURN
ZDEG=ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
ZDEG=-ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZDEG=-ANGLE:GOSUB *TURN
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZDEG=ANGLE:GOSUB *TURN
RETURN
*PUSH
STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2
RETURN
*POP
ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2
RETURN
*MOVE
ZX=ZLENG*Cos(ZP*3.14159/180)
ZY=ZLENG*Sin(ZP*3.14159/180)
LINE -STEP(ZX,-ZY),6
RETURN
*TURN
ZP=(ZP+ZDEG) Mod 360
RETURN
以下のプログラムで結果を見ることが出来ました、 誠にありがとうございました。 ただ本に出てた結果と違うのと、 プログラムコードが僕には強者で、 理解不能、 正方形の外観になる予定でしたが、 やはり等脚台形でした。惜しい ただこの短時間で移植らしきことが出来たことに感謝しています。 sleep(-1)感謝!!!
#N88BASIC Dim STACK(1000) As Double Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double Dim SP As Long, POINT(240,280) As Double SP=0 PSET(240,280) N=4:L=10:ANGLE=90:GOSUB *HILBERT Sleep(-1)'END *HILBERT IF N=0 THEN RETURN ZDEG=ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE ZDEG=-ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZDEG=-ANGLE:GOSUB *TURN ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZDEG=ANGLE:GOSUB *TURN RETURN *PUSH STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 RETURN *POP ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 RETURN *MOVE ZX=ZLENG*Cos(ZP*3.14159/180) ZY=ZLENG*Sin(ZP*3.14159/180) LINE -STEP(ZX,-ZY),6 RETURN *TURN ZP=(ZP+ZDEG) Mod 360 RETURN
|
|
|
投稿記事 |
Posted: 2008年6月02日(月) 22:40 |
|
|
|
|
|
AB2を使うというのはだめですか?
SCREENステートメントを削除するだけで、問題なく動きました。
ここからダウンロードできます、と書こうとしたのですが、すみません。ダウンロードページが消滅していますね……。
AB2を使うというのはだめですか? SCREENステートメントを削除するだけで、問題なく動きました。 ここからダウンロードできます、と書こうとしたのですが、すみません。ダウンロードページが消滅していますね……。
|
|
|
投稿記事 |
Posted: 2008年6月02日(月) 22:17 |
|
|
|
|
|
おかげで無事成功!?とまでは行かずとも、
線の一筆書きらしきもの現れました。
ただ一瞬で終わるのと、止める場所が分からない、
正方形のような形になる予定でしたが、
等脚台形らしくて、下が長くて上が短いので、
予定外というかはっきり見てみないと分かりませんが、
たぶん失敗のうち???すみません、ありがとうございました。
はっきり見たら成功だったらいいのですけど??
以下、そのときのコードを示します。
#N88BASIC
Dim STACK(1000) As Double
Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double
Dim SP As Long, POINT(240,280) As Double
SP=0
Pset(240,280)
N=4:L=10:ANGLE=90:GOSUB *HILBERT
END
*HILBERT
IF N=0 THEN RETURN
ZDEG=ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
ZDEG=-ANGLE:GOSUB *TURN
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:GOSUB *HILBERT
GOSUB *POP
ZDEG=-ANGLE:GOSUB *TURN
ZLENG=L:GOSUB *MOVE
GOSUB *PUSH
N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT
GOSUB *POP
ZDEG=ANGLE:GOSUB *TURN
RETURN
*PUSH
STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2
RETURN
*POP
ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2
RETURN
*MOVE
ZX=ZLENG*Cos(ZP*3.14159/180)
ZY=ZLENG*Sin(ZP*3.14159/180)
LINE -STEP(ZX,-ZY),6
RETURN
*TURN
ZP=(ZP+ZDEG) Mod 360
RETURN
僕はぁPOINTと、PSETが分かりません。
あとぅ、どこで止めたら実行結果が止められるか分かりません。
よければ途中の変数値の変化も分かればいいかなぁ?
以上2点、特に結果が見えてきたので止め方お教え願えませんか???
優しいご助言ありがとうございます。
おかげで無事成功!?とまでは行かずとも、 線の一筆書きらしきもの現れました。 ただ一瞬で終わるのと、止める場所が分からない、 正方形のような形になる予定でしたが、 等脚台形らしくて、下が長くて上が短いので、 予定外というかはっきり見てみないと分かりませんが、 たぶん失敗のうち???すみません、ありがとうございました。 はっきり見たら成功だったらいいのですけど??
以下、そのときのコードを示します。
#N88BASIC Dim STACK(1000) As Double Dim N As Double, L As Double, ANGLE As Double, ZDEG As Double, ZLENG As Double, ZX As Double, ZY As Double, ZP As Double Dim SP As Long, POINT(240,280) As Double SP=0 Pset(240,280) N=4:L=10:ANGLE=90:GOSUB *HILBERT END *HILBERT IF N=0 THEN RETURN ZDEG=ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE ZDEG=-ANGLE:GOSUB *TURN GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:GOSUB *HILBERT GOSUB *POP ZDEG=-ANGLE:GOSUB *TURN ZLENG=L:GOSUB *MOVE GOSUB *PUSH N=N-1:ANGLE=-ANGLE:GOSUB *HILBERT GOSUB *POP ZDEG=ANGLE:GOSUB *TURN RETURN *PUSH STACK(SP)=N:STACK(SP+1)=ANGLE:SP=SP+2 RETURN *POP ANGLE=STACK(SP-1):N=STACK(SP-2):SP=SP-2 RETURN *MOVE ZX=ZLENG*Cos(ZP*3.14159/180) ZY=ZLENG*Sin(ZP*3.14159/180) LINE -STEP(ZX,-ZY),6 RETURN *TURN ZP=(ZP+ZDEG) Mod 360 RETURN
僕はぁPOINTと、PSETが分かりません。 あとぅ、どこで止めたら実行結果が止められるか分かりません。 よければ途中の変数値の変化も分かればいいかなぁ?
以上2点、特に結果が見えてきたので止め方お教え願えませんか???
優しいご助言ありがとうございます。
|
|
|
投稿記事 |
Posted: 2008年6月02日(月) 22:16 |
|
|
|
|
|
POINTは座標の初期値が欲しいのだと思うのですが、
一応PSETでも実行しました。
やはり一瞬で、経過、結果とも確認できず。
ただ実行までに時間がかかり手応えあり、
2回目以降は割りと速かったです。
理由が分からないのでなんともいえないのですが。
優しいハウトゥ、待ちます。
POINTは座標の初期値が欲しいのだと思うのですが、 一応PSETでも実行しました。 やはり一瞬で、経過、結果とも確認できず。 ただ実行までに時間がかかり手応えあり、 2回目以降は割りと速かったです。 理由が分からないのでなんともいえないのですが。 優しいハウトゥ、待ちます。
|
|
|
投稿記事 |
Posted: 2008年6月02日(月) 21:59 |
|
|
|
|
|
POINTAPIは構造体と言って、特殊な変数型のようなものです。
あなたが求めてるのはPSet関数かもしれません
そのLineの123の部分に来る数字は、白なら7、緑なら4などとする必要があります。
勿論123が来た場合の動作は規定されていません。(多分黒になります)
END命令語を実行すると、プログラムは終了します。
Sleep(-1)等に変更してみてください
POINTAPIは構造体と言って、特殊な変数型のようなものです。
あなたが求めてるのはPSet関数かもしれません
そのLineの123の部分に来る数字は、白なら7、緑なら4などとする必要があります。 勿論123が来た場合の動作は規定されていません。(多分黒になります)
END命令語を実行すると、プログラムは終了します。 Sleep(-1)等に変更してみてください
|
|
|
投稿記事 |
Posted: 2008年6月02日(月) 21:48 |
|
|
|
|
|
ヘルプよりPOINTを、POINTAPIにしたけれど、無効な識別子
LINE文を、 LINE -STEP(ZX,-ZY),123
で実行、
やはり一瞬だけ、コマンドプロンプトが表示され実行経過実行結果とも確認できず。
以上2点特にお願いします。
すみません
ヘルプよりPOINTを、POINTAPIにしたけれど、無効な識別子 LINE文を、 LINE -STEP(ZX,-ZY),123 で実行、 やはり一瞬だけ、コマンドプロンプトが表示され実行経過実行結果とも確認できず。
以上2点特にお願いします。
すみません
|
|
|
投稿記事 |
Posted: 2008年6月02日(月) 21:35 |
|
|
|
|