Фрактальная графика
Реализация программы, строящей фрактал с заданными границами по осям "X" и "Y" в среде программирования Visual Studio 2019 и Unity 3d с помощью интерфейса Windows Forms. Максимальное количество итераций и границы фрактала. Алгоритм решения и результаты.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 28.04.2022 |
Размер файла | 421,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное
Учреждение высшего профессионального образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра автоматизации обработки информации (АОИ)
Тема лабораторной работы «Фрактальная графика»
Отчет о выполнении лабораторной работы
по дисциплине «Компьютерная графика»
2021
Оглавление
Введение
1. Основная часть
1.1 Алгоритм решения
1.2 Описание
2. Результаты работы программы
Приложение
Введение
Реализовать программу, строящую фрактал с заданными границами расчета по осям “X” и “Y” в соответствии с таблицей 1.
Таблица 1.
№ Варианта |
Вид фрактала |
|||||
1 |
Мандельброта |
-2.2 |
1.0 |
-1.2 |
1.2 |
фрактал программирование итерация интерфейс
1. Основная часть
1.1 Алгоритм решения
Для создания этого фрактала необходимо для каждой точки изображения выполнить цикл итераций согласно формуле:
zk+1 = z 2 k + z0, k = 0, 1, . . ., n.
Величины zk -- это комплексные числа, zk = xk +i?yk , причем стартовые значения x0 и y0 -- это координаты точки изображения.
Для каждой точки изображения итерации выполняются ограниченное количество раз (n) или до тех пор, пока модуль числа zk не превышает 2.
Модуль комплексного числа равен корню квадратному из x 2 + y 2 .
Для вычисления квадрата величины zk можно воспользоваться формулой:
z = (x + i ? y) ? (x + i ? y) = (x 2 ? y 2 ) + i ? (2 ? y), поскольку i 2 = ?1.
Цикл итераций для фрактала Мандельброта можно выполнять в диапазоне x = (от ? 2.2 до 1), y = (от ? 1.2 до 1.2).
Для того чтобы получить изображение в растре, необходимо пересчитывать координаты этого диапазона в пиксельные.
1.2 Описание
Для реализации программы выбрана среда программирования Visual Studio 2019 и Unity 3d, язык C# с помощью интерфейса Windows Forms.
Изначально задаются константы C, R, максимальное количество итераций и границы фрактала.
Complex c = new Complex (0.36, 0.36);
const double r = 2;
//границы Visual Studio 2019 и Unity 3d
const double xMin = -1.1;
const double xMax = 0.7;
const double yMin = -0.9;
const double yMax = 1.1;
//максимальное количество итераций
const int maxIterations = 300;
//Для математических вычислений над комплексными числами и их объявлением был создан класс содержащий два поля для действительной и мнимой части комплексного числа.
Для реализации комплексных чисел использован класс имеющий два поляпринимающих значения чисел с плавающей точкой.
class Complex
{
//создания полей
public double a, b;
//конструктор
public Complex(double a, double b)
{
this.a = a;
this.b = b;
}
//возведение комплексного числа в квадрат
public void Kvadrat()
{
double temp = (a * a) - (b * b);
b = 2 * a * b;
a = temp;
}
//сложение комплексных чисел
public void Slogenie (Complex c)
{
a += c.a;
b += c.b;
}
//возврашает корень действительной и мномой части
public double Modul()
{
return Math.Sqrt((a * a) + (b * b));
}
Далее программа перебирает все пиксели на экране и выполняет для каждого следующий алгоритм:
1. Координаты из экранных преобразуются в действительные.
Complex z = new Complex ((x / (1.0f * pictureBox1.Width)) * (xMax - xMin) + xMin,
(y / (1.0f * pictureBox1.Height)) * (yMax - yMin) + yMin);
2. Далее проводится итерация z = z2 + c.
2.1 Возводим комплексное число в квадрат.
public void Kvadrat()
{
double temp = (a * a) - (b * b);
b = 2 * a * b;
a = temp;
}
2.2 Складываем комплексные числа.
public void Slogenie (Complex c)
{
a += c.a;
b += c.b;
}
3. Если |z| <= r2, то начинается следующая итерация.
if (z.Modul() > r*r) break;
4. Если нет, то номер итерации передаётся дальше, и пиксель заполняется соответствующим цветом.
//вычисляется реальная и мнимая части числа z
//на основе расположения пикселей, масштабирования и значения позиции
Complex z = new Complex ((x / (1.0f * pictureBox1.Width)) * (xMax - xMin) + xMin,
(y / (1.0f * pictureBox1.Height)) * (yMax - yMin) + yMin);
// для выполнения матиматических операций с комплексными числами в созданном классе добавлены методы(сложения, возведения в степень, )
class Complex
{
//поля
public double a, b;
//конструктор
public Complex(double a, double b)
{
this.a = a;
this.b = b;
}
//возведение комплексного числа в квадрат
public void Kvadrat()
{
double temp = (a * a) - (b * b);
b = 2 * a * b;
a = temp;
}
//сложение комплексных чисел
public void Slogenie (Complex c)
{
a += c.a;
b += c.b;
}
//возврашает корень действительной и мномой части(модуль)
public double Modul()
{
return Math.Sqrt((a * a) + (b * b));
}
}
//цикл итераций
int i;
for (i = 0; i < maxIterations; i++)
{
//возводим в квадрат комплексное число
z.Kvadrat();
//складываем два комплексных числа
z.Slogenie(c);
//если |z| > r^2, то цикл итераций прерывается
if (z.Modul() > r * r) break;
}
bmp.SetPixel(x, y, i < maxIterations ? Color.FromArgb( i / 2, i / 2, i / 2): Color.FromArgb( 255, 255, 255));
pictureBox1.Image = bmp;
//кнопка для отрисовки и обновления при изменении размера окна
private void button1_Click_1(object sender, EventArgs e)
{
Kartinka();
}
В результате получаем изображение фрактала.
Результаты работы программ
Результат Unity 3D Результат Visual Studio 2019
Приложение
Листинг(Unity 3D)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class Fractal : MonoBehaviour {
public Material material;
double y_max = 1.1, y_min = -0.9, x_max = 0.7, x_min = -1.1, texture_size, r = 2, zoom_x, zoom_y, step_ = 0.05;
public GameObject in_x_min, in_x_max, in_y_min, in_y_max, in_step, in_size_display, kol_vo_iteration;
int maxIteration;
Numbers c = new Numbers(0.36, 0.36);
private void Start()
{
kol_vo_iteration.GetComponent<InputField>().text = 300.ToString();
in_step.GetComponent<InputField>().text = step_.ToString();
in_x_min.GetComponent<InputField>().text = x_min.ToString();
in_x_max.GetComponent<InputField>().text = x_max.ToString();
in_y_min.GetComponent<InputField>().text = y_min.ToString();
in_y_max.GetComponent<InputField>().text = y_max.ToString();
in_size_display.GetComponent<InputField>().text = (100).ToString();
zoom_x = (x_max - x_min) / 2;
zoom_y = (y_max - y_min) / 2;
Debug.Log("zoom X = "+zoom_x);
Main_start();
}
public void Up_()
{
y_min += step_;
y_max += step_;
in_y_min.GetComponent<InputField>().text = y_min.ToString();
in_y_max.GetComponent<InputField>().text = y_max.ToString();
Main_start();
}
public void Down_()
{
y_min -= step_;
y_max -= step_;
in_y_min.GetComponent<InputField>().text = y_min.ToString();
in_y_max.GetComponent<InputField>().text = y_max.ToString();
Main_start();
}
public void Right_()
{
x_min += step_;
x_max += step_;
in_x_min.GetComponent<InputField>().text = x_min.ToString();
in_x_max.GetComponent<InputField>().text = x_max.ToString();
Main_start();
}
public void Left_()
{
x_min -= step_;
x_max -= step_;
in_x_min.GetComponent<InputField>().text = x_min.ToString();
in_x_max.GetComponent<InputField>().text = x_max.ToString();
Main_start();
}
void Write_var_coordinate()
{
in_x_min.GetComponent<InputField>().text = x_min.ToString();
in_x_max.GetComponent<InputField>().text = x_max.ToString();
in_y_min.GetComponent<InputField>().text = y_min.ToString();
in_y_max.GetComponent<InputField>().text = y_max.ToString();
}
public void Zoom_function() {
zoom_x = zoom_x / 2;
zoom_y = zoom_y / 2;
step_ = step_ / 2;
in_step.GetComponent<InputField>().text = step_.ToString();
x_min = x_min + zoom_x;
x_max = x_max - zoom_x;
y_min = y_min + zoom_y;
y_max = y_max - zoom_y;
Debug.Log(x_min +" "+x_max+" ---------- "+y_min+" "+y_max);
Write_var_coordinate();
Main_start();
}
public void Main_start()
{
maxIteration = int.Parse(kol_vo_iteration.GetComponent<InputField>().text);
texture_size = Double.Parse(in_size_display.GetComponent<InputField>().text);
Write_var_coordinate();
Debug.Log(x_min + " " + x_max + " ---------- " + y_min + " " + y_max);
Texture2D texture = new Texture2D((int)texture_size, (int)texture_size);
material.mainTexture = texture;
int t_x = 0, t_y = 0;
for (int x = 0; x <= texture_size; x ++)
{
for (int y = 0; y < texture_size; y++)
{
Numbers z = new Numbers((x / (1.0f * texture_size)) * (x_max - x_min) + x_min,
(y / (1.0f * texture_size)) * (y_max - y_min) + y_min);
int it = 0;
while(it < maxIteration)
{
it++;
z.Sqr();
z.Add(c);
if (Math.Abs(z.Magn()) > r*r)
{
break;
}
}
Color color = (it < maxIteration ? new Color(it*0.003f, it*0.003f, it*0.003f) : new Color(1,1,1));
texture.SetPixel(t_x, t_y, color);
t_y++;
}
t_x++;
}
texture.Apply();
texture.filterMode = FilterMode.Point;
}
}
public class Numbers
{
public double a, b;
public Numbers(double a, double b)
{
this.a = a;
this.b = b;
}
public void Sqr()
{
double temp = (a * a) - (b * b);
b = 2.0 * a * b;
a = temp;
}
public double Magn()
{
return Math.Sqrt((a * a) + (b * b));
}
public void Add(Numbers c)
{
a += c.a;
b += c.b;
}
}
Листинг(Visual Studio)
using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
using System.Drawing;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;
namespace fractal
{
public partial class Form1 : Form
{
const double r = 2;
const double xMin = -1.1;
const double xMax = 0.7;
const double yMin = -0.9;
const double yMax = 1.1;
const int maxIterations = 300;
Complex c = new Complex (0.36, 0.36);
public Form1()
{
InitializeComponent();
//this.Resize += new System.EventHandler(this.MForm_Resize);
}
private void MForm_Resize(object sender, EventArgs e)
{
// button1.Location = new Point(Width - (button1.Width + button1.Width / 2), Height - (button1.Height * 2));
//Kartinka();
}
public void Kartinka()
{
pictureBox1.Width = Width;
pictureBox1.Height = Height;
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
for (int x = 0; x < pictureBox1.Width; x++ )
{
for (int y = 0; y < pictureBox1.Height; y++)
{
//преобразование координат
Complex z = new Complex ((x / (1.0f * pictureBox1.Width)) * (xMax - xMin) + xMin,
(y / (1.0f * pictureBox1.Height)) * (yMax - yMin) + yMin);
int i;
for (i = 0; i < maxIterations; i++)
{
z.Kvadrat();
z.Slogenie(c);
if (z.Modul() > r*r) break;
}
bmp.SetPixel(x, y, i < maxIterations ? Color.FromArgb( (int)(i * 0.85), (int)(i * 0.85), (int)(i * 0.85)) : Color.FromArgb( 255, 255, 255));
}
}
pictureBox1.Image = bmp;
}
private void button1_Click_1(object sender, EventArgs e)
{
Kartinka();
}
}
}
using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
namespace fractal
{
class Complex
{
//создания полей
public double a, b;
//конструктор
public Complex(double a, double b)
{
this.a = a;
this.b = b;
}
//возведение комплексного числа в квадрат
public void Kvadrat()
{
double temp = (a * a) - (b * b);
b = 2 * a * b;
a = temp;
}
//сложение комплексных чисел
public void Slogenie (Complex c)
{
a += c.a;
b += c.b;
}
//возврашает корень действительной и мномой части
public double Modul()
{
return Math.Sqrt((a * a) + (b * b));
}
}
}
Размещено на Allbest.ru
Подобные документы
Разработка игрового проекта на игровом движке Unity 3D в среде программирования MS Visual Studio 2017. Блок-схема алгоритма работы приема сообщений с сервера на клиенте с упрощенным описанием выполняемых команд. Реализация пользовательского интерфейса.
курсовая работа [1,5 M], добавлен 10.07.2017Общие сведения о работе программы в среде программирования Microsoft Visual Studio 2008, на языке программирования C++. Ее функциональное назначение. Инсталляция и выполнение программы. Разработанные меню и интерфейсы. Алгоритм программного обеспечения.
курсовая работа [585,5 K], добавлен 24.03.2009Microsoft Visual C++ и среда программирования Microsoft Developer Studio 6.0. Решение интеллектуальной задачи на компьютере. Построение алгоритма кодирования на Visual C++. Алгоритм решения задачи. Описание программы "Sort". Инструкции пользователя.
курсовая работа [46,0 K], добавлен 27.11.2007Техника создания графики при помощи API функций, экспортируемых библиотекой GDI32.DLL. Разработка на языке программирования С++ в среде программирования Microsoft Visual C++ программы для отображения часов реального времени в цифровом и аналоговом виде.
курсовая работа [2,8 M], добавлен 27.01.2010Краткая история становления языка программирования Pascal и основные понятия графики. Основные функции и процедуры работы с графикой в PascalABC. Создание графического проекта: понятие "фрактал" и реализация треугольника. Построения фрактала "Дерево".
курсовая работа [1,4 M], добавлен 26.10.2014Изучение алгоритмов, написание программ на языке C#. Работа с массивами, строками, перечислениями, структурами, интерфейсами. Разработка и функциональность Windows-приложения. Создание и подключение баз данных в среде программирования Visual Studio 2019.
отчет по практике [6,7 M], добавлен 18.10.2020Исследование алгоритма взаимодействия пользователя с сервером, на котором находится база данных. Реализация безопасности информационной системы с помощью возможностей программного комплекса Visual Studio. Анализ особенностей интерфейса веб-приложения.
курсовая работа [1,3 M], добавлен 17.06.2017Общая характеристика сетевой игры с несколькими клиентами в программной среде MS Visual Studio 2010 на языке программирования C++ с использованием функций работы с сокетами. Реализация системного сервиса, разработки интерфейса, алгоритм его тестирования.
курсовая работа [495,3 K], добавлен 06.01.2013Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.
курсовая работа [639,0 K], добавлен 16.03.2012Проектирование игры "Жизнь" и ее реализация в среде разработки Visual Studio 2010, версия .Net Framework 4.0. Особенности языка программирования C#, основных принципов ООП на языке C#. Проектирование пользовательского интерфейса. Описание алгоритмов.
курсовая работа [990,0 K], добавлен 18.04.2013