Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.01.2019, 12:33   #1
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,506
По умолчанию Фракталы

Свершилось! Настал мой звёздный час. Рисуем звезду Коха.
Сначала я перепутал направление внутреннего вектора, и у меня получился символ какого-то автопроизводителя. Кажется, Митсубиси.
Во вложении рабочая программа и код. Программа работает под Windows 95 и Windows Vista. На Celeron 333 получилось нарисовать звезду Коха порядка 10, на Pentium 1800 - порядка 11.
Программа работает так. После запуска рисуется звезда Коха порядка 1. После нажатия любой клавиши порядок увеличивается на 1, и так до тех пор, пока не повиснет ваш компьютер.
Код:
#include "stdafx.h"
#include <math.h>
#include "p22.h"
#include "p22Doc.h"
#include "p22View.h"


int n = 1;         //   уровень вложенности звезды Коха
int scale = 150;      //   масштаб изображения

/*   Рекуррентная функция звезды Коха.
     (x1, y1) - начальная точка
    (x2, y2) - конечная точка
    n - уровень вложенности (порядок)   */

void koh (double x1, double y1, double x2, double y2, int n, CDC *pDC);


void CP22View::OnDraw (CDC *pDC)
{
   CP22Doc *pdoc = GetDocument ();
   ASSERT_VALID (pdoc);
   CString a;

   a.Format ("Звезда Коха порядка n = %i.", n);
   pDC -> TextOut (20, 20, a);
   
   koh (scale * .5, scale * 2.5, scale * 1.5, scale * (2.5 - sqrt (3)), n, pDC);
   koh (scale * 1.5, scale * (2.5 - sqrt (3)), scale * 2.5, scale * 2.5, n, pDC);
   koh (scale * 2.5, scale * 2.5, scale * .5, scale * 2.5, n, pDC);
}


void CP22View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) 
{
   n++;
   Invalidate ();
   CView::OnChar (nChar, nRepCnt, nFlags);
}


void koh (double x1, double y1, double x2, double y2, int n, CDC *pDC)
{
   double x3 = x2 - x1;
   double y3 = y2 - y1;
   /*   (x3, y3) - базовый вектор
        (y3, -x3) - вектор, нормальный к базовому   */

   double x4 = x3 / 2 + y3 / 6 * sqrt (3);
   double y4 = y3 / 2 - x3 / 6 * sqrt (3);
   //   особая точка

   if (n == 1)
   {
      pDC -> MoveTo ((int) x1, (int) y1);
      pDC -> LineTo ((int) x2, (int) y2);
      return;
   }

   koh (x1, y1,
      (x1 * 2 + x2) / 3, (y1 * 2 + y2) / 3,
      n - 1, pDC);

   koh ((x1 * 2 + x2) / 3, (y1 * 2 + y2) / 3,
      x1 + x4, y1 + y4,
      n - 1, pDC);

   koh (x1 + x4, y1 + y4,
      (x1 + x2 * 2) / 3, (y1 + y2 * 2) / 3,
      n - 1, pDC);

   koh ((x1 + x2 * 2) / 3, (y1 + y2 * 2) / 3,
      x2, y2,
      n - 1, pDC);
}
Изображения
Тип файла: png 3.png (16.5 Кб, 123 просмотров)
Вложения
Тип файла: 7z p22.7z (6.3 Кб, 9 просмотров)
Тип файла: txt p22View.txt (3.6 Кб, 128 просмотров)
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...

Последний раз редактировалось jura_k; 01.01.2019 в 12:38.
jura_k вне форума Ответить с цитированием
Старый 01.01.2019, 13:00   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
и так до тех пор, пока не повиснет ваш компьютер.
Больше всего понравилось ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.01.2019, 14:21   #3
Vladimir.1982
Форумчанин
 
Регистрация: 30.04.2018
Сообщений: 171
По умолчанию

На Python еще меньше код.

Код:
import turtle
 
turtle.shape('turtle')
turtle.penup()
turtle.goto(-200, 0)
turtle.pendown()
 
def Koch_Line (l ,n):
    if n == 0:
        turtle.forward(l)
        return
    l //= 3
    Koch_Line(l, n-1)
    turtle.left(60)
    Koch_Line(l, n-1)
    turtle.right(120)
    Koch_Line(l, n-1)
    turtle.left(60)
    Koch_Line(l, n-1)
     
Koch_Line(400, 4)
Vladimir.1982 вне форума Ответить с цитированием
Старый 02.01.2019, 15:30   #4
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,506
По умолчанию

Для решения задачи пришлось преодолеть три трудности.

1) Узнать алгоритм. Придумать, что, как и в каком количестве использовать.
2) Нарисовать линию.
3) Применить аналитическую геометрию.

Откуда в Питоне черепашка?

Ну в принципе можно и через углы решать... Хорошая мысля приходит опосля.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...

Последний раз редактировалось jura_k; 02.01.2019 в 15:37.
jura_k вне форума Ответить с цитированием
Старый 02.01.2019, 18:54   #5
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,506
По умолчанию

Думаю, при таком подходе произойдет потеря точности, и звезда Коха не замкнется. Ведь нам не надо > 1000000 линий на экране?
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 05.01.2019, 16:56   #6
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,988
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Больше всего понравилось ))
Лучше бы у него ПК повис бы сразу, авось задумался что чтобы компьютер не вис далее нужно иногда хоть мозгами думать, чистить стек, на пример. Но ему, видать, это не дано так как либо лень, либо учиться не желает...
vasek123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фракталы C# newcome Помощь студентам 0 07.10.2013 18:14
Фракталы. Pascal. stas45rus Помощь студентам 0 20.07.2012 21:29
Фракталы!!!!!!!!!!!!!!!!!!!!!! Яна696 Паскаль, Turbo Pascal, PascalABC.NET 3 08.11.2011 15:24