Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
jayvip96
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 11
1

Рандомный фрактал дерева

07.12.2016, 20:05. Просмотров 305. Ответов 5
Метки нет (Все метки)

Добрый вечер! Есть фрактал дерева. Функция построена на принципе рекурсии: сначала прорисовывается «ствол», а он него рекурсивным вызовом функции дорисовываем ее «отростки». Нужно сделать так, чтобы «отростки» дорисовывались рандомным способом(более натурального вида: разный угол и тд)
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
#include "stdafx.h"
#include <stdlib.h>
#include<glut.h>
#include<GL.h>
#include<GLU.h>
#include<math.h>
#include<random>
#include<time.h>
 
#define RADIUS 1.5
#define PI 3.141592
#define SPEED 24
 
float THICK = 1;
int Width= 650; int Height= 650;
float posX=0, posY=0;
GLfloat Time=0.1;
GLfloat camTime=0.0;
GLfloat Frequency=0.5;
GLfloat Altitude=2;
GLfloat X, Y;
int cnt=0;
 
void FractalTree( float startX, float startY, float startZ, float angle, float length, int depth)
{
    if(depth !=0)
    {
        float endX, endY, endZ;
        length = length*Time;
        endX = startX + length * cos(angle * PI/180);
        endY = startY + length * sin(angle * PI/180);
        endZ = 0;
 
    
        cnt++;
 
        GLfloat size[2];
        glGetFloatv(GL_LINE_WIDTH_RANGE, size);
        GLfloat lineWidth = size[1]/((80-depth)*1);
        glLineWidth(lineWidth*1.0);
        
        glBegin(GL_LINES);
            float aa = (20.0-depth)/20.0;
            ( (aa < 0.3)  ?  aa =0.1 :  aa=aa );
            glColor3f(aa, 0.1, 0.0);
            glVertex3f(startZ, startX, startY); // startX, startY
            glVertex3f(endZ, endX, endY);   // endX,    endY
        glEnd();
 
        depth -=1;
        float rndL = (float)(rand() % 30 + 5) / 100;
        if(cnt>1)
        {
            FractalTree(endX, endY, endZ, angle + 25, length*0.8, depth);
            FractalTree(endX, endY, endZ, angle - 25, length*0.8, depth);
 
        }       
    }
}
 
void MyDisplay()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0, 1.0, 1.0, 1.0);
    glViewport(posX, posY, Width, Height);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
        gluLookAt(0.0, 2.0, 3.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0);     //set of camera..
    glRotatef(90, 0.0, 1.0, 0.0);   
    FractalTree(0.0, 0.0, 0.0, 0, 0.3, 15);
 
    glutSwapBuffers();
}
 
void MyTimer(int a)
{
    camTime +=0.02;
    if(Time <1.04)  Time +=0.006;
 
    X = cos(camTime*Frequency)*Altitude;
    Y = sin(camTime*Frequency)*Altitude;
    glutPostRedisplay();
    glutTimerFunc(SPEED, MyTimer, 1);
}
void MyReshape(int a, int b)
{
    if(a>=b){
        posX =(a -b)/2;
        a=b;
    }
    Width =a;
    if(b>= a){
        posY= (b-a)/2;
        b = a;
    }
    Height =b;
}
void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowSize(Width, Height);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("[ Фрактальное дерево ]");
 
    glClearColor(0.2, 0.2, 0.2, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-RADIUS, RADIUS, -RADIUS, RADIUS, -RADIUS*10, RADIUS*10);
 
    glutDisplayFunc(MyDisplay);
    glutReshapeFunc(MyReshape);
    glutTimerFunc(SPEED, MyTimer, 1);
    glutMainLoop();
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2016, 20:05
Ответы с готовыми решениями:

Фрактал Мандельброта (C++)
Нужно нарисовать фрактал Мандельброта. Подскажите, где ошибка? На экране просто...

3D фрактал на Шейдерах
Привет! Может ли кто помочь написать программу на шейдерах для C#? Нужно...

Фрактал дерево opengl
Здравствуйте, есть проект который рисует фрактал дерево. Код #include...

Трёхмерный массовый фрактал
Прошу помощи в решении проблемы. Программа написана на C# в VS 2012 с...

Фрактал: Обезьянье дерево
Здравствуйте. Есть задание: построить фрактал &quot;Обезьянье дерево&quot;, используя...

5
qppq
13 / 13 / 5
Регистрация: 31.08.2016
Сообщений: 187
Завершенные тесты: 1
08.12.2016, 07:46 2
переменные , относящиеся к длине, углу и тд. надо умножить (поделить, прибавить, вычесть и тд) на рэндомную величину, например randomize(100)
0
jayvip96
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 11
08.12.2016, 18:58  [ТС] 3
qppq, Делал, не работало(
0
qppq
13 / 13 / 5
Регистрация: 31.08.2016
Сообщений: 187
Завершенные тесты: 1
09.12.2016, 13:22 4
мож попробовать циклом а не рекурсивным вызовом, и в цикле рэндом
0
jayvip96
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 11
11.12.2016, 13:01  [ТС] 5
Тоже не вариант, пытался тут, но все бесполезно(
C++
1
2
FractalTree(endX, endY, endZ, angle + 25, length*0.8, depth);
            FractalTree(endX, endY, endZ, angle - 25, length*0.8, depth);
0
Igor3D
1227 / 594 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
11.12.2016, 13:34 6
Ну вообще-то генерация фрактала - одна задача, его отрисовка - другая. Эти задачи/логику нужно разделить по файлам исходников/хедеров, выписать классы, организовать интерфейс между ними - словом делать все как положено (ну или как рекомендует "теория и практика программирования"). А пока "все на соплях" лезть в эту кашу никому не хочется.
0
11.12.2016, 13:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2016, 13:34

Почему не отображается фрактал Мандельброта?
Вот сам код, не могу понять, почему фрактал не генерируется как следует...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru