Kochovy křivky ve WPF

C# .NET Formuláře WPF Zdrojákoviště Kochovy křivky ve WPF

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Program generuje tzv. Kochovy křivky. Kromě základní známé vločky je schopen vytvořit různé jiné fraktálové struktury pomocí kombinací typu "růstu" fraktálu v jednotlivých krocích. Základním obrazcem může být čtverec, nebo trojúhelník, dle volby uživatele jsou pak úsečky základního obrazce segmentovány na třetiny, nebo čtvrtiny, navazující tvary jsou pak trojúhelníky, nebo čtverce. Dále lze zvolit, jestli obrazec "poroste" směrem ven, nebo dovnitř. Fraktál se konstruuje v šesti navazujících krocích. Je umožněna náhodná kombinace jednotlivých kroků. Pod tlačítkem O Aplikaci naleznete tipy pro zajímavé kombinace.


Galerie

Program byl vytvořen v roce 2018.

 

Stáhnout

Staženo 23x (105.83 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Program pro vás napsal Bruno Schwarzbach
Avatar
Jak se ti líbí článek?
1 hlasů
Autor pracuje v oboru polygrafie, programování má jako hobby.
Aktivity (2)

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:23. března 15:19

Krásné aplikace, děkujeme :)

Odpovědět  +1 23. března 15:19
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
lastp
Redaktor
Avatar
lastp:27. března 14:02

Před několika lety jsem také programoval Kochovy křivky, ale vyřešil jsem to jednoduše rekurzivní funkcí a umělo to generovat libovolné n-úhelníky. Například šestiúhelníky vypadaly docela hezky. Pro větší počet úhlů už to bylo moc kruhové. Navíc mohl uživatel plynule měnit počet kroků klávesami plus a minus. Nechtěl bys tvoji aplikaci také takto vylepšit ? Pokud ne, mohl bych to udělat já, pokud by ti to nevadilo.

 
Odpovědět 27. března 14:02
Avatar
Bruno Schwarzbach:27. března 16:04

Rekurzi jde určitě použít, dělal jsem tak nedávno Sierpinskeho trojúhelník:

public partial class MainWindow : Window
    {
        public static Canvas c;
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            c = MainCanvas;
            Triangl t = new Triangl();
            t.VytvorObrazec(c.ActualWidth / 4, c.ActualHeight / 8 * 7, c.ActualWidth / 2);
        }
    }

class Triangl
    {
        Point v1, v2, v3;

        public void SpoctiVrcholy(double x, double y, double delka)                                  //metoda výpočtu výšky a poloh vrcholů trojúhelníku
        {
            v1 = new Point(x, y);
            v2 = new Point(x + delka, y);
            double vyska = VyskaTrojuhel(delka);                                                    //pro výpočet 3. vrcholu je použita i výška
            v3 = new Point(x + delka / 2, y - vyska);
        }
        public double VyskaTrojuhel(double delka)
        {
            return Math.Sqrt(Math.Pow(delka, 2) * 3 / 4);                                           //výška se vrací i separátně pro další výpočty
        }

        public void VytvorObrazec(double x, double y, double vstupniDelka)                  //rekurzivní funkce
        {
            double delka = vstupniDelka;

            SpoctiVrcholy(x, y, delka);
            Polygon triangl = new Polygon()
            {
                Stroke = Brushes.Black,
                Fill = Brushes.AliceBlue,
                StrokeThickness = 1,
            };
            triangl.Points = new PointCollection() { v1, v2, v3 };
            MainWindow.c.Children.Add(triangl);
            if (delka > MainWindow.c.ActualWidth/100)                                                    //rekurzivní funkce pro změnšování a rozmisťování trojúhelníků uvnitř předešlých trojúhelníků
            {
                VytvorObrazec(x, y, delka / 2);                                               //levý vnořený
                VytvorObrazec(x + delka / 2, y, delka / 2);                                   //pravý vnořený
                double vyska = VyskaTrojuhel(delka);
                VytvorObrazec(x + delka / 4, y - vyska / 2, delka / 2);                       //horní vnořený
            }
        }
    }

Klidně kód Kochových křivek vylepši, mě to nevadí.

 
Odpovědět 27. března 16:04
Avatar
lastp
Redaktor
Avatar
lastp:31. března 10:53

Trochu jsem to vylepšil:

  • maximální počet úhlů mnohoúhelníků lze nastavit konstantou MaxVrcholu. Maximální počet kroků lze nastavit konstantou MaxKroku.
  • zobrazení jsem urychlil pomocí VisualCollection, DrawingVisual a DrawingContext.
  • po kliknutí na přepínače nebo náhodnou kombinaci se křivka okamžitě překreslí.
  • přidal jsem Slider na počet kroků.
  • přidal jsem ComboBox na zajímavé fraktály.
  • křivka je hezky barevná i při menším počtu kroků.

Stáhnout to lze zde

 
Odpovědět 31. března 10:53
Avatar
Bruno Schwarzbach:2. dubna 13:31

Díky, na kód se podívám, mám pocit, že se něco přiučím :-)

 
Odpovědět 2. dubna 13:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.