アクセスカウンター

Fractal: Crown Curve 1 (WPF with C#)


Applied rule of recursive drawing




It seems that some of the unmovable points (the green points shown in the left figure) are located at a specific position in each periodic pattern in the drawn curve.
This figure indicates an applied rule of recursive drawing. When the complexity order is increased, additional green points and new red-lined paths are generated in the same manner. Here, a set of fractional ratios of {1/2, cos 80o+(1/4)cos 10o, (1/4)cos 10o/sin 45o, (1/4)cos 10o/sin 45o, cos 80o+(1/4)cos 10o and 1/2} in length and turning angles of {20o in right, 100o , 55o, 90o, 55o and 100o in left, 20o in right} is always inherited for all the order.



//   CrownCurve1_Turtle_WPF\MainWindow.xaml.cs
//   Crown Curve 1 with Dots
//    (WPF application with C#
//     on Microsoft Visual Studio Express 2013 for Windows Desktop)
//   Nov. 5, 2014, by Masao Sakuraba

//   (Ref. 1-5 guided me to this program.)
//   * NOTE1: Blue-color parts were automatically generated by Visual Studio.
//   * NOTE2: Red-color parts were newly added.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;       // Namespace for class "Stopwatch".
using ThinkLib;                 // After adding the file "ThinkLib.dll" as a reference [2].

namespace CrownCurve1_Turtle_WPF
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        Turtle pen1;    // Make a turtle using ThinkLib [3].
        double PI = 3.141592654;
        double DotSize = 1.0;
        double Length = 400.0;
        int Complexity = 8;

        void PatternGenerator1(Turtle _pen, double _length, int _complexity)
        {
            if (_complexity == 0 | _length < 2.4)
            {
                _pen.BrushDown = false;
                _pen.Forward(_length - DotSize);
                _pen.BrushDown = true;
                _pen.Forward(DotSize);
            }
            else
            {
                _pen.Right(20);
                PatternGenerator1(_pen, _length / 2, _complexity - 1);
                _pen.Left(100);                                      // Recursion [4].
                PatternGenerator1(_pen, _length * (Math.Cos(PI / 180 * 80)
+ 0.2 * Math.Cos(PI / 180 * 10)), _complexity - 1);
                _pen.Left(55);
                PatternGenerator1(_pen, _length * (0.2 * Math.Sin(PI / 180 * 10)
/ Math.Cos(PI / 180 * 45)), _complexity - 1);
                _pen.Left(90);
                PatternGenerator1(_pen, _length * (0.2 * Math.Sin(PI / 180 * 10)
/ Math.Cos(PI / 180 * 45)), _complexity - 1);
                _pen.Left(55);
                PatternGenerator1(_pen, _length * (Math.Cos(PI / 180 * 80)
+ 0.2 * Math.Cos(PI / 180 * 10)), _complexity - 1);
                _pen.Left(100);
                PatternGenerator1(_pen, _length / 2, _complexity - 1);
                _pen.Right(20);
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            pen1 = new Turtle(playground);  // After making Canvas in MainWindow
            // with the Canvas name of "playground" [3].
            pen1.Visible = false;      // When you do not like showning a turtle [5].
            pen1.Clear();
            pen1.BrushWidth = DotSize;
            pen1.WarpTo(Length * 0.09, Length * 0.35);
            pen1.LineBrush = Brushes.Orange;
            pen1.Forward(DotSize);
            pen1.LineBrush = Brushes.White;
        }

        private void Button1_Click(object sender, RoutedEventArgs e)
        {                                      // After making Button for Event Handler.
            Stopwatch TimeMeasure = new Stopwatch();    // Make a stopwatch.
            TimeMeasure.Start();

            PatternGenerator1(pen1, Length, Complexity);

            double Time_in_s = (TimeMeasure.Elapsed).TotalSeconds;
            Label1.Content = ("Drawing Time : " + Time_in_s + " s.");
        }
    }
}



Reference
(1) "Think Sharply with C#" by Prof. Peter Wentworth (Rhodes Univ.),
    http://www.ict.ru.ac.za/resources/ThinkSharply/thinksharply/
(2) "Appendices : Getting Started with ThinkLib",
    http://www.ict.ru.ac.za/Resources/ThinkSharply/ThinkSharply/thinklib_getting_started.html
(3) "Chapter 7 : Hello, little turtles!",
    http://www.ict.ru.ac.za/Resources/ThinkSharply/ThinkSharply/hello_little_turtles.html
(4) "Chapter 21 : Recursion",
    http://www.ict.ru.ac.za/Resources/ThinkSharply/ThinkSharply/recursion.html
(5) "Appendices : ThinkLib.Turtle Documentation",
    http://www.ict.ru.ac.za/Resources/ThinkSharply/ThinkSharply/thinklib_turtle_docs.html



< Return to Computer-Related Skills >
< Return to Home >

This home page is produced by KompoZer (free and open software).