Problema Diamantului

Problemă:

Un “diamant” este perfect caracterizat de coordonatele centrului său, precum şi de latura pătratului iniţial. Alte elemente nu mai sunt necesare, deoarece pătratele imediat următoare, au laturile de c ori mai mici ş.a.m.d., unde c este o constantă reală oarecare, c≥1. De fapt, din ce constă un diamant? Dintr-un pătrat de centru (x,y) şi latură l, care are
patru diamante în colţurile acestui pătrat. Aceasta este o definiţie recursivă a diamantului. Ea ne va permite să scriem cu uşurinţă o procedură care să-l deseneze. Aceasta va desena un pătrat, apoi se va autoapela de patru ori, pentru cele patru diamante din colţuri. Însă nu putem merge aşa la infinit! De aceea, procedura va fac efectiv desenări doar dacă latura pătratului este mai mare decât o anumită valoare minimă, de pildă 0, 1 sau 2. Se cere să se deseneze un astfel de ”diamant”.

Implementare:

 

Logo_C_Sharp
Cod Sursa C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace FractalCS
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            m = 1;
            timer1.Start();
        }
 
        void patrat(int n, int x, int y, int l)
        {
            int l2 = l / 2;
            int l4 = l / 4;
            int l3 = l2 + l4;
            if (n > 1)
            {
                patrat(n - 1, x - l4, y - l4, l2);
                patrat(n - 1, x - l4, y + l3, l2);
                patrat(n - 1, x + l3, y - l4, l2);
                patrat(n - 1, x + l3, y + l3, l2);
            }
            Graphics graph = this.CreateGraphics();
            Pen penc;
            if (n % 2 == 0) penc = new Pen(Color.Red);
            else penc = new Pen(Color.BlueViolet);
            Point[] p = new Point[4];
            p[0].= x; p[0].= y;
            p[1].= x; p[1].= y + l;
            p[2].= x + l; p[2].= y + l;
            p[3].= x + l; p[3].= y;
            graph.DrawPolygon(penc, p);
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (m <= Convert.ToInt32(textBox1.Text))
            {
                int x = 300, y = 300, l = 150;
                patrat(m, x, y, l);
                m = m + 1;
            }
        }
    }
}

Rezultat:

diamant rezultat

Leave a comment