Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 8

Построить кривые Гильберта рекурсивным алгоритмом

07.12.2015, 21:05. Показов 9457. Ответов 11

Студворк — интернет-сервис помощи студентам
Помогите построить кривые Гильберта рекурсивным алгоритмом. Не ленивый, просто никогда с графиками не работал.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2015, 21:05
Ответы с готовыми решениями:

C++, кривые Безье, Алгоритмом de Casteljau
Здравствуйте, В чем собственно состоит проблема: не могу придумать как написать уравнение кривой Безье! (x(t),y(t))\=B(t) по данному набору...

Кривые гильберта
Построить кривые Гильберта 3 и 4 порядка

Кривые Пеано (Гильберта) - что в них примечательного?
Помогите понять, что такого особенного в этих кривых? Как может кривая "заполнять квадрат", если кривая - это одномерный объект, а...

11
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
07.12.2015, 23:44
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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
 
double x, y, z;
void dl(HDC hDC, double i, double j) {x+=i*z; y+=j*z; LineTo(hDC, x, y); Sleep(10);}
 
void f(HDC hDC, double i, double j, unsigned int n) {
    if (n) {f(hDC, i,  (z/150+1)*j, n-1); dl(hDC, j, -i); dl(hDC, i, j);
            f(hDC, j, -i, n-1); dl(hDC, i, j);
            f(hDC, -j, i, n-1); dl(hDC, i, j); dl(hDC, -j, i);
            f(hDC, i,  j, n-1);}
    else dl(hDC, i, j);
}
int _tmain(int argc, _TCHAR* argv[]) {
    HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN pen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    SelectObject(hDC, pen);
 
    setlocale(LC_ALL, "Russian");
    unsigned int n=100;
    while (n>5) {
        system("cls");
        cout<<"Увеличьте высоту консоли, введите порядок фрактала (0-5): "; cin>>n;
    }
    z=1+1<<(6-n); x=3*z; y=30+z;
    MoveToEx(hDC, x, y, NULL);  
    f(hDC,  1,  1, n); dl(hDC, -1,  1);
    f(hDC, -1, -1, n); dl(hDC,  1, -1);
 
    DeleteObject(pen);
    ReleaseDC(hW, hDC);
    system("pause"); return 0;
}
1
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 8
08.12.2015, 09:10  [ТС]
А в классическом виде? Вот такая.
Миниатюры
Построить кривые Гильберта рекурсивным алгоритмом  
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
09.12.2015, 01:41
Лучший ответ Сообщение было отмечено polzovatel101 как решение

Решение

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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <cmath>
using namespace std;
 
int x, y, z;
void dl(HDC hDC, int d) {x+=(d-1)%2*z; y+=(d-2)%2*z; LineTo(hDC, x, y); Sleep(10);}
 
void f(HDC hDC, int i, int j, unsigned int n) {
    if (n) {f(hDC, j, i, n-1); dl(hDC, j);
            f(hDC, i, j, n-1); dl(hDC, i);
            f(hDC, i, j, n-1); dl(hDC,(j+2)%4);
            f(hDC,(j+2)%4,(i+2)%4, n-1);}
}
int _tmain(int argc, _TCHAR* argv[]) {
    HWND hW = GetConsoleWindow();
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN pen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    SelectObject(hDC, pen);
 
    setlocale(LC_ALL, "Russian");
    unsigned int n=100;
    while (n>8) {
        system("cls");
        cout<<"Увеличьте высоту консоли, введите порядок фрактала (0-8): "; cin>>n;
    }
    x=10; y=40; z=600/((1<<n)-1);
    MoveToEx(hDC, x, y, NULL);  
    f(hDC, 2, 3, n);
 
    DeleteObject(pen);
    ReleaseDC(hW, hDC);
    system("pause"); return 0;
}
ЗЫ а по-моему, как раз ленивый и халявщик. Но мне то все равно интересно алгоритм придумать.
2
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 8
09.12.2015, 12:39  [ТС]
Конечно оооогрооомное спасибо) Но вот для ясности хочу спросить, для чего массив _TCHAR* нужен?! И почему stdafx.h в 15 студии не нужен?!
0
0 / 0 / 0
Регистрация: 24.09.2019
Сообщений: 1
24.09.2019, 21:29
_Ivana, вы случаем не знаете как создать НЕрекурсивное построения алгоритма построения кривой Гильберта????
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
25.09.2019, 23:19
Знаю. Клини как-то доказал, что любую рекурсивную функцию можно реализовать в нерекурсивном виде. В общем случае можно накостылить свой собственный стек вызовов, куда сохранять промежуточные аргументы вызовов и обрабатывать его итеративно. В конкретном частном случае скорее всего можно еще проще.

PS пруф общего случая https://github.com/Ivana-/naso
0
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 29
28.03.2023, 01:36
Доброй ночи. Подскажите пожалуйста, а возможно ли написанный вами код переделать под библиотеку TXLib.h? У меня просто получается только вариант на изображении, так как функций с градусами и размещением множества точек я не обнаружил.
Миниатюры
Построить кривые Гильберта рекурсивным алгоритмом  
0
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 29
28.03.2023, 01:52
Пытался сделать на TXLib библиотеке, но результат желает лучшего. Вот код и что получилось:
Если на 1 уровне еще похоже, то на 2 все ломается.
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
#include "TXLib.h"
#include <iostream>
 
using namespace std;
 
int x, y, L, level, z;
 
void dl(int d) {
    x += (d - 1) % 2 * z;
    y += (d - 2) % 2 * z;
    txLine(x - (d - 1) % 2 * z, y - (d - 2) % 2 * z, x, y);
}
 
void f(int i, int j, unsigned int n) {
    if (n) {
        f(j, i, n - 1); dl(j);
        f(i, j, n - 1); dl(i);
        f(i, j, n - 1); dl((j + 2) % 4);
        f((j + 2) % 4, (i + 2) % 4, n - 1);
    }
}
 
int main() {
    txCreateWindow(800, 600);
 
    cout << "Enter the X coordinate of the lower left corner: ";
    cin >> x;
    cout << "Enter the Y coordinate of the lower left corner: ";
    cin >> y;
    cout << "Enter the length of the side: ";
    cin >> L;
    cout << "Enter the maximum number of levels: ";
    cin >> level;
 
    z = L / ((1 << level) - 1);
    txSetFillColor(RGB(255, 255, 255));
    txClear();
 
    txSetColor(RGB(0, 0, 0));
    txSetFillColor(RGB(255, 255, 255));
    txRectangle(x, y, x + L, y + L);
 
    txSetColor(RGB(255, 255, 255));
    txLine(x, y + L / 2, NULL, NULL);
    f(2, 3, level);
 
    txSleep(10000);
 
    return 0;
}
Миниатюры
Построить кривые Гильберта рекурсивным алгоритмом   Построить кривые Гильберта рекурсивным алгоритмом  
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.03.2023, 02:21
C++
1
2
3
4
5
void dl(int d) {
    txLine(x, y, x + (d - 1) % 2 * z, y + (d - 2) % 2 * z);
    x += (d - 1) % 2 * z;
    y += (d - 2) % 2 * z;
}
Cerega228Pro, вы так наугад все делаете ...
C++
1
z = размерполядлярисования / ((1 << level) - 1);
0
0 / 0 / 0
Регистрация: 02.11.2021
Сообщений: 29
28.03.2023, 02:32
Простите, я просто никогда не работал с данной библиотекой, да и мои знания в программировании еще слабы.
Спасибо вам за быстрый ответ. Я смог добиться своими силами того, что хотел!)
Миниатюры
Построить кривые Гильберта рекурсивным алгоритмом  
0
0 / 0 / 0
Регистрация: 17.12.2023
Сообщений: 3
18.12.2023, 15:34
Cerega228Pro, Поделись пожалуйста кодом, столкнуля с аналогичной проблемой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2023, 15:34
Помогаю со студенческими работами здесь

Зеркальное отражение текста, релизованного рекурсивным алгоритмом
Здравствуйте, как сделать чтобы вместе с этим алгоритмом, рядом создавалось зеркальное отображение этого текста через 2 оператора. ...

Найти количество сложений для вычисления n-го числа Фибоначчи рекурсивным и обычным алгоритмом.
Найти количество сложений для вычисления n-го числа Фибоначчи рекурсивным и обычным алгоритмом. Результаты выдать в виде таблицы. ...

Построить фрактальные кривые
Разработать программу, которая обеспечит рисование квадрата в центре экрана, окруженного со всех сторон окружностями меньшего диаметра,...

Построить кривые по их уравнениям
Помогите плиз с задачей.Никак не могу решить. Задача:Построить кривые по их уравнениям, заданным в полярных координатах: Кохлеоида...

Построить кривые 4ого порядка
1) Вы можете &quot;нарисовать&quot; на экране монитора кривую четвёртого порядка? Их нужно нарисовать сразу две на одном и том же экране и чтобы они...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru