0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 9
1

Dev C++ или VS построение фракталов Драконовы ключи

20.04.2020, 23:24. Показов 1268. Ответов 9

Author24 — интернет-сервис помощи студентам
Добрый ночи, помогите пожалуйста есть задание "Напишите программу для создания фрактальных структур.
Предусмотреть вывод фигуры в черно-белом и цветном вариантах. "
"Построить фрактал «Драконовы ключи»."
Пример того что должно получиться
Dev C++ или VS построение фракталов Драконовы ключи

Помогите пожалуйста, с чего начать, мб есть заготовки, или конечно готовый вариант
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2020, 23:24
Ответы с готовыми решениями:

Построение фракталов.
Составить программу, изображающую стохастический фрактал "Плазма" пожалуйста с пояснениями

Построение графика функции по точкам (Dev-C )
Подскажите как построить график по точкам(Dev-C++), какая это библиотека и где можно почитать...

Dev C++ задача на построение графика функции
Недавно начал изучать C++, до этого пытался выучить Си. Следовательно, хочу переделать график...

Key-Gen или ключи активации
Здраствуйте, пожалуйста, мог бы кто-нибудь растолковать принцип работы кей-генов, возможно ли...

9
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,051
Записей в блоге: 2
20.04.2020, 23:32 2
Цитата Сообщение от kto32 Посмотреть сообщение
"Построить фрактал «Драконовы ключи»."
это точно фрактал?
больше похоже на калейдоскоп.
1
617 / 937 / 150
Регистрация: 10.08.2015
Сообщений: 4,983
21.04.2020, 06:22 3
тут достаточно обычного цикла
1
369 / 310 / 65
Регистрация: 14.10.2014
Сообщений: 1,318
21.04.2020, 11:18 4
Цитата Сообщение от kto32 Посмотреть сообщение
«Драконовы ключи»
у меня есть пример функции, которая рисует драконову ломаную, но по-моему там не будет такого орнамента, как на картинке
1
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,051
Записей в блоге: 2
21.04.2020, 11:25 5
алгоритм:
1. псевдорандомно рисуем в секторе 1/12 части круга,
2. делаем зеркальную копию в соседний секторы.
3. пункт 2 делаем 12 раз.
4. идем в кабак праздновать решение.
1
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 9
28.04.2020, 22:04  [ТС] 6
Цитата Сообщение от XLAT Посмотреть сообщение
это точно фрактал?
Да это фрактал там есть еще по веселее
Цитата Сообщение от Recrut_rf Посмотреть сообщение
у меня есть пример функции
Можете пожалуйста прислать, посмотреть, поиграться с ней мб чего выйдет.
Цитата Сообщение от XLAT Посмотреть сообщение
алгоритм:
1. псевдорандомно рисуем в секторе 1/12 части круга,
2. делаем зеркальную копию в соседний секторы.
3. пункт 2 делаем 12 раз.
Вот совсем для графики не из того места руки, не могу понять как сделать круг из драконовой ломанной
Цитата Сообщение от vlisp Посмотреть сообщение
тут достаточно обычного цикла
Думаю скорее рекурсии
0
617 / 937 / 150
Регистрация: 10.08.2015
Сообщений: 4,983
29.04.2020, 05:35 7
Цитата Сообщение от kto32 Посмотреть сообщение
Думаю скорее рекурсии
Можно и рекурсии, но лучше цикл. Главное понять, что нужно рисовать патернами. Патерн (фигура) рисуется относительно точки под некоторым углом. Основная трудность - нарисовать патерн. Растиражировать его - дело техники. Патерн состоит из более простых субпаттернов и/или примитивов: линий, окружностей, дуг, которые рисуются аналогично патерну (относительно точки под углом).
1
369 / 310 / 65
Регистрация: 14.10.2014
Сообщений: 1,318
29.04.2020, 20:50 8
kto32, держи, сочинение не мое, а стянуто из книги "85 нетривиальных проектов, решений, и задач". Я лишь адаптировал его к WinAPI, оригинальный код представлен для Borland C++ Builder.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#define _CRT_SECURE_NO_WARNINGS  // чтоб не жаловался на всякие небезопасные функции
 
#include<windows.h>
#include<string.h>
 
#include <vector>
#include <math.h>
 
#define M_PI        3.14159265358979323846   // стянул из GCC С++
 
using namespace std;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char szProgName[] = "Имя программы";
 
 
/*
Построение ломанной удобно разбить на две функции.
Первая возвращает массив точек, соответсвующих углам ломаной:
*/
vector<POINT> GetDragonPolyline(int order, int cxClient, int cyClient);
 
/*
Вторая (главная) запрашивает ломанную в виде массива точек и выводит её на экран:
*/
void Dragon(int order, HDC hdc, int cxClient, int cyClient);
 
vector<POINT> GetDragonPolyline(int order, int cxClient, int cyClient)
{
    if (order == 0)
    {
        // ломанная нулевого порядка состоит из одного сегмента
        vector<POINT> line;
        POINT p;
        
        p.x = cxClient / 4;
        p.y = cyClient / 2;
        
        // добавить первую точку
        line.push_back(p);
 
        p.x = 3 * cxClient / 4;
        p.y = cyClient / 2;
 
        // добавить последнюю точку
        line.push_back(p);
 
        return line;
    }
 
    // получить ломаную предыдущего порядка
    vector<POINT> prevLine = GetDragonPolyline(order - 1, cxClient, cyClient);
    vector<POINT> line;
 
    // знак направления угла (1 - влево, -1 - вправо)
    int DirSign = 1;
 
    // начальная точка ломаной не изменяется
    line.push_back(prevLine[0]);
    for (size_t i = 0; i < prevLine.size() - 1; ++i)
    {
        POINT p1 = prevLine[i];
        POINT p2 = prevLine[i + 1];
 
        double alpha = atan2(p2.y - p1.y, p2.x - p1.x) - DirSign * M_PI / 4;
        double R = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)) / sqrt(2);
 
        // найти новую точку ломаной (pc)
        POINT pc;
        pc.x = p1.x + R * cos(alpha);
        pc.y = p1.y + R * sin(alpha);
 
        // добавить pc и p2 в список точек текущей ломаной
        line.push_back(pc);
        line.push_back(p2);
 
        // изменить направление на противоположное
        DirSign = -DirSign;
    }
    return line;
}
 
void Dragon(int order, HDC hdc, int cxClient, int cyClient)
{
    vector<POINT> line = GetDragonPolyline(order, cxClient, cyClient);
    for (size_t i = 0; i < line.size() - 1; ++i)
    {
        MoveToEx(hdc, line[i].x, line[i].y, NULL);
        LineTo(hdc, line[i + 1].x, line[i + 1].y);      
    }
}
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    HWND hWnd;
    MSG lpMsg;
    WNDCLASS w;
 
    w.lpszClassName = szProgName; //имя программы - объявлено выше
    w.hInstance = hInstance; //идентификатор текущего приложения
    w.lpfnWndProc = WndProc; //указатель на функцию окна
    w.hCursor = LoadCursor(NULL, IDC_ARROW); //загружаем курсор
    w.hIcon = 0;
    w.lpszMenuName = 0;
    w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.cbClsExtra = 0;
    w.cbWndExtra = 0;
 
    //Если не удалось зарегистрировать класс окна - выходим
    if (!RegisterClass(&w))
        return 0;
 
    //Создадим окно в памяти, заполнив аргументы CreateWindow
    hWnd = CreateWindow(szProgName, //Имя программы
        "Грфические возможности Win32 API", //Заголовок окна
        WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся
        100, //положение окна на экране по х
        100, //положение по у
        1024, //ширина
        768, //высота
        (HWND)NULL, //идентификатор родительского окна
        (HMENU)NULL, //идентификатор меню
        (HINSTANCE)hInstance, //идентификатор экземпляра программы
        (HINSTANCE)NULL); //отсутствие дополнительных параметров
 
                          //Выводим окно из памяти на экран
    ShowWindow(hWnd, nCmdShow);
    //Обновим содержимое окна
    UpdateWindow(hWnd);
 
    //Цикл обработки сообщений
 
    while (GetMessage(&lpMsg, NULL, 0, 0)) {
        TranslateMessage(&lpMsg);
        DispatchMessage(&lpMsg);
    }
    return(lpMsg.wParam);
}
 
 
//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,
    WPARAM wParam, LPARAM lParam)
{
    // будут за координаты x и у
    static int cxClient, cyClient;
 
    HDC hdc; //создаём контекст устройства
    PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
    LOGFONT lf;
    HFONT hFont;
    RECT r;
    HBRUSH hBrush = NULL;   // инициализировал нулом так как студия ругается
    HPEN hPen = NULL;       // типа - использована неинициализированная локальная переменная 
                            // можно вынести в глобальную область - там она сама проинициализируется 
 
    //Цикл обработки сообщений
    switch (messg)
    {
    case WM_SIZE:
        cxClient = LOWORD(lParam);
        cyClient = HIWORD(lParam);
        break;
 
        //сообщение рисования
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
 
        hBrush = CreateSolidBrush(RGB(10, 200, 100));
        SelectObject(hdc, hBrush);
 
        Dragon(10, hdc, cxClient, cyClient);
 
        
        EndPaint(hWnd, &ps);
        break;
 
        //сообщение выхода - разрушение окна
    case WM_DESTROY:
        PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение
        DeleteObject(hPen);
        DeleteObject(hBrush);
        break;
 
    default:
        return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
    }
    return 0;
}
Нужные для тебя функции - vector<POINT> GetDragonPolyline(int order, int cxClient, int cyClient); и
void Dragon(int order, HDC hdc, int cxClient, int cyClient);
параметр int order - задаётся самому (я рисовал с int order = 15).
Итоговый результат - очень похож на тот, что в книге (правда в ней только один сегмент изображён, но всё же).
Но он бесконечно далёк от того, что тебе нужно.
В твоём варианте, скорее всего, нужно использовать наборы из подобных фигур
1
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 9
03.05.2020, 20:20  [ТС] 9
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Нужные для тебя функции - vector<POINT> GetDragonPolyline(int order, int cxClient, int cyClient); и
void Dragon(int order, HDC hdc, int cxClient, int cyClient);
параметр int order - задаётся самому (я рисовал с int order = 15).
Итоговый результат - очень похож на тот, что в книге (правда в ней только один сегмент изображён, но всё же).
Но он бесконечно далёк от того, что тебе нужно.
В твоём варианте, скорее всего, нужно использовать наборы из подобных фигур
Спасибо попробую посмотрю.
0
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,051
Записей в блоге: 2
05.05.2020, 09:51 10
kto32,

Вот два главных метода без всяких редакций(но рабочих):
1.
Цитата Сообщение от XLAT Посмотреть сообщение
псевдорандомно рисуем в секторе 1/12 части круга,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
...
    void build(carr<int>& a)
    {   int w = a.column_();
        int h = a.row_   ();
 
        int R = w / 2 - 2 ;
 
        int r  = carr<int>::rrand(  10,  48);
        int dx = carr<int>::rrand(-200, 200);
        int dy = carr<int>::rrand(-200, 200);
 
        ucolor u;
               u.I.i = get_rand_color();
 
        FORi(r)
        {   float X = i - r;
            float Y = sqrt(r * r - i * i);
            a[int(Y) + R + dy][i + R + dx] = u.I.i;
            a[R - int(Y) + dy][i + R + dx] = u.I.i;
            a[int(Y) + R + dy][R - i + dx] = u.I.i;
            a[R - int(Y) + dy][R - i + dx] = u.I.i;
 
            if(u.R.r > 3) u.R.r -= 3;
            if(u.R.g > 3) u.R.g -= 3;
            if(u.R.b > 3) u.R.b -= 3;
        }
    }
...
2.
Цитата Сообщение от XLAT Посмотреть сообщение
2. делаем зеркальную копию в соседний секторы.
3. пункт 2 делаем 12 раз.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
...
    void duplicator()
    {   const float A12 = PI_2/12;
        const float A6  = PI_2/6;
 
        float step = 0.f;
        for(int i = 0.f; i < 6; i++, step += A6)
        {
            for(float A = 0.f; A < A12; A += 0.002f)
            {
                const float D = a.row_()/2;
                for(float r = 0.f; r < D; r += 0.5f)
                {
                    float aa = A + step;
 
                    int x = r * sinf(A) + D;
                    int y = r * cosf(A) + D;
                    int v = a[y][x];
 
 
                    int fx1  = r * sinf(aa) + D;
                    int fy1  = r * cosf(aa) + D;
                    f[fy1][fx1] = v;
 
                    int fx2  = r * sinf(2 * A12 - aa) + D;
                    int fy2  = r * cosf(2 * A12 - aa) + D;
                    f[fy2][fx2] = v;
                }
            }
        }
    }
...
Для отрисовки юзал bgi32 в консоле.
что получилось(брал подряд без кастинга):
Dev C++ или VS построение фракталов Драконовы ключи

Dev C++ или VS построение фракталов Драконовы ключи


само Демо Генератора:
fractal.rar

Хотя и предусмотрел интерфейс для разных фигур, но обошёлся только кругами.

так же есть большое поле для refactoring'a и оптимизаций, которые я даже не начинал делать.
0
05.05.2020, 09:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2020, 09:51
Помогаю со студенческими работами здесь

Ключи для питания ЦАП от 8.4V или 16,8V. На вход 3,3V
Нужно реализовать 2 ключа включения питания для портативного аудио ЦАП и последующей обвязки с 2ух...

Ключи глобальных массивов в кавычках или без?
Доброго времени суток! Как правильно записывать ключи (правильно ли их называть ключами?) в...

"webpack-dev-server" не является внутренней или внешней командой, исполняемой программой или пакетным файлом
C:\pycharm\duty\vueapp&gt;npm run dev &gt; vueapp@1.0.0 dev C:\pycharm\duty\vueapp &gt;...

Ключи, ключи, ключики. нужен совет
Дорого времени суток. Народ помогите пожалуйста разобраться с проблемой ключей в 1С 8.3.6.2237....

Если хранить ключи не во внешних файлах или в реестре, то где?
Во всех статьях пишут &quot;не хранить ключи во внешних файлах или в реестре&quot;. Спрашивается - а где его...

Через /dev или /proc
Всем доброго времени суток. Появилась задача написать драйвер для PCI устройства. В ходе изучения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru