- 題名: 折れ線を引くについて
- 日時: 2004/01/11 13:08:46
- ID: 2123
- この記事の返信元:
- (なし)
- この記事への返信:
- [2125] Re[1]: 折れ線を引くについて2004/01/11 22:44:08
- ツリーを表示
こんばんは、Tomさん。ピラルクです。
点の位置を変えるには、PointのOffset()メソッドが使えます。
しかしフラクタルとなると、中間点を増やしていくということ
になるでしょうから、再帰関数で同時並行的に描画する手法を
取らないのであれば、全体を管理する(動的に拡張可能な)コレ
クションなりが必要ではないかと思います。
ソースはArrayListを用いた例で、Formにボタンを1つ配置しま
す。Button_Click毎にコッホ成長させます。
# 一例としてベーシックなコッホで,
# ついつい組んでしまいましたが (^^;;;
# フラクタルの組み方には色々あるので、
# いいやつが出来たら見せてね。
'Point位置を格納するArrayList
Dim m_FractLine As New ArrayList()
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.WindowState = FormWindowState.Maximized
'最初の1本を用意
m_FractLine.Add(New Point(0, Me.Height \ 4))
m_FractLine.Add(New Point(Me.Width, Me.Height \ 4))
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'1ステップ分コッホ曲線にする
Dim i As Integer = 1
Do
m_FractLine.InsertRange(i, CalcKoch(CType(m_FractLine(i - 1), Point), _
CType(m_FractLine(i), Point)))
i += 4
Loop While i < m_FractLine.Count
'Point()を生成
Dim points(m_FractLine.Count - 1) As Point
m_FractLine.CopyTo(points)
'全ての線を引く
Dim g As Graphics = Me.CreateGraphics
g.Clear(SystemColors.Window)
g.DrawLines(SystemPens.WindowText, points)
End Sub
'線分(posS - posE)をコッホ成長させて中間点Point(2)を返す
Private Function CalcKoch(ByRef posS As Point, ByRef posE As Point) As Point()
Dim retPos() As Point = {posS, posS, posE}
Dim thrX As Integer = (posE.X - posS.X) \ 3
Dim thrY As Integer = (posE.Y - posS.Y) \ 3
Dim len As Double = Math.Sqrt(thrX ^ 2 + thrY ^ 2)
Dim d As Double = Math.Atan2(posE.Y - posS.Y, posE.X - posS.X) _
+ 60 * (Math.PI / 180)
'1/3の点
retPos(0).Offset(thrX, thrY)
'三角形頂点
retPos(1).Offset(thrX + CInt(len * Math.Cos(d)), _
thrY + CInt(len * Math.Sin(d)))
'2/3の点
retPos(2).Offset(-thrX, -thrY)
Return retPos
End Function
分類:[.NET]
はじめまして。Tomと申します。初めての質問です。よろしくおねがいします。
いま、VB.NETでフラクタルの描画するものを作ろうと思っています。
それで、線を描くといううところを参考に作り出したのですが、
以下のように定義して描画した後、
描画する点の位置を変えて再描画するには
どのようにして、点を変更すればよいのでしょうか?
初歩的な質問ですみません。どなたかお願いします。
Dim ps As Point() = _
{New Point(0, 0), New Point(150, 50), _
New Point(80, 100), New Point(100, 150)}
'折れ線を引く
g.DrawLines(Pens.Black, ps)