Кривая Госпера - C#

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. *
  5. namespace Gosper_curve
  6. {
  7. public partial class Form1 : Form
  8. {
  9. public Form1()
  10. {
  11. InitializeComponent();
  12. }
  13. Graphics g;
  14. Pen pen = new Pen(Color.Black);
  15. *
  16. void Draw(double x, double y, double l, double u, int t, int q)
  17. {
  18. // начало построения ломанных
  19. if (t > 0)
  20. {
  21. if (q == 1)
  22. {
  23. //формулы построения
  24. x += l * Math.Cos(u);
  25. y -= l * Math.Sin(u);
  26. u += Math.PI;
  27. }
  28. u -= 2 * Math.PI / 19;//соединение линий
  29. l /= Math.Sqrt(7); //масштаб
  30. //функции рисования
  31. Paint(ref x, ref y, l, u, t - 1, 0);
  32. Paint(ref x, ref y, l, u + Math.PI / 3, t - 1, 1);
  33. Paint(ref x, ref y, l, u + Math.PI, t - 1, 1);
  34. Paint(ref x, ref y, l, u + 2 * Math.PI / 3, t - 1, 0);
  35. Paint(ref x, ref y, l, u, t - 1, 0);
  36. Paint(ref x, ref y, l, u, t - 1, 0);
  37. Paint(ref x, ref y, l, u - Math.PI / 3, t - 1, 1);
  38. }
  39. else g.DrawLine(pen, (float)Math.Round(x), (float)Math.Round(y), (float)Math.Round(x + Math.Cos(u) * l), (float)Math.Round(y - Math.Sin(u) * l));
  40. }
  41. *
  42. void Paint(ref double x, ref double y, double l, double u, int t, int q)
  43. {
  44. Draw(x, y, l, u, t, q);
  45. x += l * Math.Cos(u);
  46. y -= l * Math.Sin(u);
  47. }
  48. *
  49. private void button1_Click(object sender, EventArgs e)
  50. {
  51. g = Graphics.FromHwnd(pictureBox1.Handle);
  52. Draw(150, 350, 300, 0, 3, 0);
  53. }
  54. }
  55. }
Вы могли бы помочь понять сам алгоритм построения этой кривой? Желательно, прокомментировать код (описать для чего нужны параметры функций тоже не помешало бы).

Решение задачи: «Кривая Госпера»

textual
Листинг программы
  1. public partial class Form1 : Form
  2. {
  3.     public Form1()
  4.     {
  5.         InitializeComponent();
  6.     }
  7.  
  8.     protected override void OnPaint(PaintEventArgs e)
  9.     {
  10.         e.Graphics.TranslateTransform(230, 100);
  11.         Draw(e.Graphics, "A", 3, 60, new Dictionary<char, string>()
  12.         {
  13.             ['A'] = "A-B--B+A++AA+B-",
  14.             ['B'] = "+A-BB--B-A++A+B"
  15.         });
  16.     }
  17.  
  18.     void Draw(Graphics g, string rule, int level, int angle, Dictionary<char, string> rules)
  19.     {
  20.         // Если дошли до нулевого уровня то рисуем линию и выходим
  21.         if (level < 0)
  22.         {
  23.             g.DrawLine(Pens.Black, 0, 0, 0, 10);
  24.             g.TranslateTransform(0, 10);
  25.             return;
  26.         }
  27.  
  28.         // Иначе, следуя правилу,
  29.         foreach (var r in rule)
  30.         {
  31.             switch(r)
  32.             {
  33.                 // поворачиваемся
  34.                 case '-': g.RotateTransform(+angle); break;
  35.                 case '+': g.RotateTransform(-angle); break;
  36.                 // или рекурсивно запускаем отрисовку правила из словаря
  37.                 default: Draw(g, rules[r], level - 1, angle, rules); break;
  38.             }
  39.         }
  40.     }
  41. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.455 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы