- 題名: 折れ線を引くについて
- 日時: 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)