Форум программистов, компьютерный форум, киберфорум
Кроссплатфор­менная разработка
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236

Рисование треугольника Серпинского с помощью GTK

19.11.2015, 17:18. Показов 3771. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Сейчас разбераю тему фракталов и нашел код программы для построения треугольника Серпинского:

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
#include <iostream>
#include "gwindow.h"
#include "math.h"
#include "simpio.h"
using namespace std;
 
/* Function prototypes */
 
void drawTriangle(GWindow & gw, GPoint pt, int order, double length);
 
/*
 * Main program that asks the user for an edge length and a fractal order and draws the resulting
 * Sierpinski Triangle in the center of the graphics window.
 */
 
int main() {
   GWindow gw(600, 500);
   int length = getInteger("Enter edge length: ");
   int order = getInteger("Enter fractal order: ");
   double originalX = (gw.getWidth() - length)/2;
   double originalY = gw.getHeight()/2 + (length/2 * sqrt(3))/2;
   GPoint originalPoint(originalX, originalY);
   drawTriangle(gw, originalPoint, order, length);
   return 0;
}
 
/*
 * Draws a Sierpinski triangle of a given order recursively.
 */
void drawTriangle(GWindow & gw, GPoint pt, int order, double length) {
    if (order == 0) { //Draws simple triangle
        pt = gw.drawPolarLine(pt, length, 0);
        pt = gw.drawPolarLine(pt, length, 120);
        pt = gw.drawPolarLine(pt, length, -120);
    }
    else {
        GPoint newPoint1(pt.getX(), pt.getY()); //New points for each new Sierpinski triangles (bottom left triangle)
        GPoint newPoint2(pt.getX() + length/4, pt.getY() - ((length*sqrt(3)/4))); //(top triangle)
        GPoint newPoint3(pt.getX() + length/2, pt.getY()); //(bottom right triangle)
        drawTriangle(gw, newPoint1, order - 1, length/2); //Draws three Sierpinski triangles of one order less
        drawTriangle(gw, newPoint2, order - 1, length/2); //than the previous in the corners of the previous triangle
        drawTriangle(gw, newPoint3, order - 1, length/2); //with half the edge length
    }
}
Вопрос в следующем: подскажите пожалуйста, что делает 3-й параметр фун-ции drawPolarLine? Всм. что делают эти 0,120 и -120 и от куда они берутся?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.11.2015, 17:18
Ответы с готовыми решениями:

Что привычнее для Windows-программиста-GTK+, GTK#, wxWidgets, Qt, Java FX, Swing?
После Visual Basic 6, Delphi что будет привычнее?Что ближе всего к Windows?

быстрое рисование с помощью GDI+
Доброго времени суток! Хочу вывести прямоугольник в центр экрана используя GDI+, если рисовать сразу, то картинка будет тормозить. Поэтому...

Построение треугольника Серпинского
нужно построить треугольник серпинского с помощью рекурсии на java.

32
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
20.11.2015, 19:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от gru74ik Посмотреть сообщение
Но... как так-то, Карл?
Т.е. вот такая вещь тебя не смущает,
C++
1
2
3
4
int main() {
    using std::something;
    something();
}
а прототип смущает?
Мы просто внесли имя в локальный scope.
0
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
20.11.2015, 19:28  [ТС]
gru74ik, огромное спасибо за потраченное время и объяснения! В некоторых местах просто жутко тупил)И спасибо DrOffset за объяснения на счет прототипов ф-ций в мейне, а особенное спасибо _Ivana, которая на счет прототипов тоже, скорее всего ничего не знала, но сняла мне 17 баллов репутации
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
20.11.2015, 19:40

Не по теме:

Цитата Сообщение от JavJun Посмотреть сообщение
которая
который



Добавлено через 2 минуты
DrOffset, понятно. Благодарю.
0
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
21.11.2015, 01:18  [ТС]
gru74ik, кстати, если сделать так как Вы говорили:
C++
1
2
3
4
5
6
7
8
9
else {
        GPoint newPoint1(pt.getX(), pt.getY()); //New points for each new Sierpinski triangles (bottom left triangle)
        GPoint newPoint2(pt.getX() + length/4, pt.getY() - ((length*sqrt(3)/4))); //(top triangle)
        GPoint newPoint3(pt.getX() + length/2, pt.getY()); //(bottom right triangle)
        drawTriangle(gw, newPoint1, order, length/2); //Draws three Sierpinski triangles of one order less
        drawTriangle(gw, newPoint2, order, length/2); //than the previous in the corners of the previous triangle
        drawTriangle(gw, newPoint3, order, length/2); //with half the edge length
        --order;
    }
идет переполнение стека, а если "кривоватая", то все работает...
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 14:28
Цитата Сообщение от JavJun Посмотреть сообщение
а если "кривоватая", то все работает...
Ну, значит, я чего-то не допонял.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.11.2015, 17:22
Цитата Сообщение от gru74ik Посмотреть сообщение
кажется, реализация функции кривоватая. Переменная order не будет уменьшаться при каждом следующем вызове. Мне кажется, надо было бы как-то так написать
gru74ik, здесь зарыта интересная собака. Вы воспринимаете order как переменную, с нелокальной областью видимости, которая изменяется и следующие вызовы рекурсивной функции видят ее измененной. Если бы она была глобальной (или статической, что по сути одно и то же), тогда это было бы так. Но в данном случае это формальный входящий параметр функции - и как завещает волшебная концепция функционального вызова, при каждом новом вызове будет создаваться новая переменная с тем же формальным именем, но в новом вложенном локальном окружении текущего вызова, с новым фактическим значением. То есть это будет уже "не тот слон", или другими словами, это будет уже новый order - new order (гениальный пример: https://www.youtube.com/watch?v=ynA1dO9Kx8s)

А если вернуться к С++, то сравните 2 факториала - вы же уже года 2 муссируете эту тему: передача аргументов по ссылке и по значению:
C++
1
2
3
4
int f1(int  order) {return  order ?    order    *f1(order-1) : 1;}
int f2(int *order) {return *order ? ((*order)--)*f2(order)   : 1;}
 
int main() {int order=7; std::cout<<f1(order)<<'\n'; std::cout<<f2(&order)<<'\n';}
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 19:43
Цитата Сообщение от _Ivana Посмотреть сообщение
вы же уже года 2 муссируете эту тему
Кто "вы"? Я плюсами в июне прошлого года начал заниматься.

Добавлено через 1 минуту
Цитата Сообщение от _Ivana Посмотреть сообщение
передача аргументов по ссылке
Тем более, в твоём примере у тебя нет передачи аргумента по ссылке. Только передача по значению и по указателю.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.11.2015, 19:46

Не по теме:

Ну я и говорю - 2 неполных года :)



Добавлено через 2 минуты
Цитата Сообщение от gru74ik Посмотреть сообщение
Тем более, в твоём примере у тебя нет передачи аргумента по ссылке. Только передача по значению и по указателю.
Во, значит не зря муссируешь, разбираешься в таких тонкостях. А я до сих пор не знаю и не понимаю отличие ссылки от указателя, хотя и прочитал несколько статей на эту тему и ваяю на С (без плюсов) кое-что реальное для контроллеров
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 20:03
Цитата Сообщение от _Ivana Посмотреть сообщение
я до сих пор не знаю и не понимаю отличие ссылки от указателя, хотя и прочитал несколько статей на эту тему
Значит, не сильно оно тебе надо.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.11.2015, 20:32
Конечно не сильно. Но раз уж тема зашла про это - создал топик Ссылки vs указатели - в чем разница?

Добавлено через 26 минут
Вести с полей - только что прочитал такую фразу
Цитата Сообщение от Denis_Zurin Посмотреть сообщение
В Си указатели можно использовать, когда нужно передать параметры в функцию не по значению, а по ссылке
- она соответствует моим заблуждениям, но противоречит
Цитата Сообщение от gru74ik Посмотреть сообщение
Тем более, в твоём примере у тебя нет передачи аргумента по ссылке. Только передача по значению и по указателю.
Или не противоречит? Надо копать дальше.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 20:36
Цитата Сообщение от _Ivana Посмотреть сообщение
В Си указатели можно использовать, когда нужно передать параметры в функцию не по значению, а по ссылке
Видимо, имелось ввиду, "когда надо работать не с копией, а с оригиналом", ибо в Си никаких ссылок нет, насколько мне известно.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.11.2015, 20:40
Так и я пребывал в заблуждении, что "передача по ссылке" и "передача по указателю" - это одно и то же, и значит "передача адреса в области памяти", и все это полные синонимы. Но похоже С++ наделяет эти слова разным смыслом? Что и явилось причиной вашей придирки, хотя она совершенно не существенна в том контексте?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 21:02
Цитата Сообщение от _Ivana Посмотреть сообщение
"передача по ссылке" и "передача по указателю" - это одно и то же, и значит "передача адреса в области памяти", и все это полные синонимы
Это не так.

Цитата Сообщение от _Ivana Посмотреть сообщение
Но похоже С++ наделяет эти слова разным смыслом?
Конечно, ибо это хоть и в чём-то схожие, но всё же разные явления.

Цитата Сообщение от _Ivana Посмотреть сообщение
Что и явилось причиной вашей придирки
Я не придирался, и меня не много. Если ты имел ввиду вежливое обращение, то оно с большой буквы пишется - "Вашей", а не "вашей" (а вот теперь я придираюсь, да ). Так что, давай "на ты".

Цитата Сообщение от _Ivana Посмотреть сообщение
она совершенно не существенна в том контексте?
Не существенна, так не существенна. Закроем тему, раз не существенна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2015, 21:02

Масштабирование треугольника Серпинского
Такой вопрос, я рисую треугольник Серпинского на форме но когда его глубина становится больше 10 то пиксели начинаю закрашиваться...

Рисование примитивов в GTK
Прошу помощи, я уже замаялся. Куда не глянь предлагают разные примеры, и то, кусочками: GdkPixmap, GdkPixbuf, GtkDrawingArea, GdkImage. ...

Рисование графика с использованием GTK
Доброе время суток. Мне требуется нарисовать случайно генерирующий график в области для рисования. График должен идти от левого края экрана...

Построение фрактала «Треугольник Серпинского» с возможностью изменения числа образующих примитивов с помощью клавиш
Доброго времени суток. Помогите реализовать программу на языке Java реализующую построение фрактала «Треугольник Серпинского» с...

Внутри треугольника с помощью циркуля и линейки построить ​​точку, делящую треугольник на три равновеликие треугольника
Внутри треугольника с помощью циркуля и линейки построить такую ​​точку, чтобы отрезки, соединяющие эту точку с вершинами данного...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru