12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236

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

19.11.2015, 17:18. Показов 3799. Ответов 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru