DOBON.NET DOBON.NETプログラミング掲示板過去ログ

折れ線を引くについて

環境/言語:[WindowsXP,VB.NET]
分類:[.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)
こんばんは、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
返信ありがとうございます。
自分初心者でソース見てもあまり理解できませんでした。
でもこんなに簡単にできるとはすごいですね。
まずはこのソースを理解できるようにしたいと思います。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板