Используя модуль graph построить фрактал дерево пифагора. Обнаженное обдуваемое ветром дерево пифагора. Функция построения дерева Пифагора на языке С

Следующим примером может быть известное "Пифагорово дерево". Оно часто изображается так, как показано на рис. 3.2. Каждый из прямоугольных треугольников в этом дереве имеет внутренний угол, равный 45°.

Опять воспользуемся генератором случайных чисел для создания более общей программы, которая может сформировать не только рис. 3.2, но также генерировать и менее регулярные деревья. Углы, задаваемые равными 45° для рис. 3.2, в общем случае будут задаваться случайным образом в пределах между (45 - delta) ° и (45 + delta) °, где значение delta задается в качестве входного параметра вместе с параметром n, определяющим глубину рекурсии. Регулярная версия, изображенная на рис. 3.2, получается при задании delta = 0 и n = 7. На рисунке параметр п определяет количество треугольников на пути от корня до листьев дерева. Сердцевиной программы будет рекурсивная функция square_and_triangle ("квадрат и треугольник") с параметром n, определяющим глубину рекурсии, в качестве первого аргумента. Если значение параметра n больше нуля, то задачей функции square_and_triangle, как это определяется названием, будет вычертить квадрат и над ним треугольник, а затем еще дважды обратиться к самой себе с соответствующими новыми аргументами, первый из которых задается равным n-1. Размер и положение квадрата полностью определяются четырьмя параметрами: X0,Y0, а и j (см. рис. 3.3). Для вычерчивания треугольника необходимо знать угол a. Этот угол, выраженный в градусах, равен 45+deviation , где deviation равно одному из целых чисел ряда -delta, -delta+I, ... , delta, выбираемому случайным образом. На рис. 3.3 необходимые точки пронумерованы последовательными числами 0,1,2,3,4. Координаты X0 , Y0 точки О задаются в обращении к функции. Для вычисления остальных точек вначале рассмотрим более простую ситуацию при j = 0 , то есть когда сторона 0 1 квадрата занимает горизонтальное положение.


В этом положении координаты точек определить очень просто. Они записываются в массивах х и у. Затем вся конструкция поворачивается вокруг точки О на угол j. Результат поворота записывается в массивах хх и уу.

/* PYTH_TREE: Вариант дерева Пифагора */

#include "math.h"

#include "stdlib.h"

#include "time.h"

#define pi 3.1415927

#include "stdio.h"

struct {float xx; float yy; int ii;} s;

void pfopen(){ fp=fopen("scratch", "wb"); }

void pmove(float x,float y)



{ s.xx=x; s.yy=y; s.ii=0; /* 0 = pen up */ /* 0 = перо поднято */

fwrite(&s, sizeof s, 1, fp);

void pdraw(float x,float y)

{ s.xx=x; s.yy=y; s.ii=1; /* 1 = pen down */ /* 1 = перо опущено */

fwrite(&s, sizeof s, 1, fp);

void pfclose(){ fclose(fp); }

void square_and_triangle(int n,float x0,float y0, float a, float phi)

{ float x, y, xx, yy, cphi, sphi, c1, c2, b, c,

alpha, calpha, salpha;

int i, deviation; /* phi and alpha in radians */

/* delta in degrees */

if(n==0) return; /* углы phi и alpha в радианах */

/* угол delta в градусах */

deviation=rand()%(2*delta+1)-delta;

alpha=(45+deviation)*pi/180.0;

x=x=x0; x=x=x0+a;

y=y=y0; y=y=y0+a;

calpha=cos(alpha); salpha=sin(alpha);

c=a*calpha; b=a*salpha;

/* Rotation about (x0, y0) through angle phi ; */

/* Поворот вокруг точки (x0, y0) на угол phi;*/

cphi=cos(phi); sphi=sin(phi);

c1=x0-x0*cphi+y0*sphi;

c2=y0-x0*sphi-y0*cphi;

for (i=0; i<5; i++)

{ xx[i]=x[i]*cphi-y[i]*sphi+c1;

yy[i]=x[i]*sphi+y[i]*cphi+c2;

for (i=0; i<5; i++) pdraw(xx[i],yy[i]);

square_and_triangle(n-1, xx, yy, c, phi+alpha);

square_and_triangle(n-1, xx, yy, b, phi+alpha-0.5*pi);

pfopen(); time(&seed); srand((int)seed);

printf (" Задайте угол delta в градусах (0 < delta < 45) ");

scanf("%d", &delta);

printf(" Задайте глубину рекурсии n "); scanf("%d", &n);

square_and_triangle(n, 0.0, 0.0, 1.0, 0.0);

Эта программа формирует файл SCRATCH, который должен быть обработан программой GENPLOT из лекции 2. Графический результат работы программы для delta = 30 и п = 7 показан на рис. 3.4.

Дерево Пифагора - один из видов фрактала, который основан на фигуре, известной под именем «Пифагоровы штаны».

Доказывая свою знаменитую теорему, Пифагор построил фигуру, в которой на каждой стороне прямоугольного треугольника были расположены квадраты. Спустя время эта фигура Пифагора превратилась в целое дерево. Первым дерево Пифагора построил в период второй мировой войны А. Босман, пользуясь обычной чертежной линейкой.

Одним из основных свойств дерева Пифагора считается то, что когда площадь первого квадрата составляет единицу, то на каждом из уровней сумма площадей квадратов также будет равна единице. Классическое дерево Пифагора имеет угол, равный 45 градусам, но также можно построить обобщённое дерево Пифагора, используя другие углы. Такое дерево называют обдуваемым ветром деревом Пифагора. Если изобразить только отрезки, которые соединяют каким-либо образом определенные «центры» треугольников, тогда получится обнаженное дерево Пифагора.

Следующим примером может быть известное "Пифагорово дерево". Оно часто изображается так, как показано на рис. 3.2. Каждый из прямоугольных треугольников в этом дереве имеет внутренний угол, равный 45°.

Опять воспользуемся генератором случайных чисел для создания более общей программы, которая может сформировать не только рис. 3.2, но также генерировать и менее регулярные деревья. Углы, задаваемые равными 45° для рис. 3.2, в общем случае будут задаваться случайным образом в пределах между (45 - delta) ° и (45 + delta) °, где значение delta задается в качестве входного параметра вместе с параметром n, определяющим глубину рекурсии. Регулярная версия, изображенная на рис. 3.2, получается при задании delta = 0 и n = 7. На рисунке параметр п определяет количество треугольников на пути от корня до листьев дерева. Сердцевиной программы будет рекурсивная функция square_and_triangle ("квадрат и треугольник") с параметром n, определяющим глубину рекурсии, в качестве первого аргумента. В случае если значение параметра n больше нуля, то задачей функции square_and_triangle, как это определяется названием, будет вычертить квадрат и над ним треугольник, а затем еще дважды обратиться к самой себе с соответствующими новыми аргументами, первый из которых задается равным n-1. Размер и положение квадрата полностью определяются четырьмя параметрами: X0,Y0, а и j (см. рис. 3.3). Для вычерчивания треугольника крайне важно знать угол a. Этот угол, выраженный в градусах, равен 45+deviation , где deviation равно одному из целых чисел ряда -delta, -delta+I, ... , delta, выбираемому случайным образом. На рис. 3.3 необходимые точки пронумерованы последовательными числами 0,1,2,3,4. Координаты X0 , Y0 точки О задаются в обращении к функции. Для вычисления остальных точек вначале рассмотрим более простую ситуацию при j = 0 , то есть когда сторона 0 1 квадрата занимает горизонтальное положение.

В этом положении координаты точек определить очень просто. Οʜᴎ записываются в массивах х и у. Затем вся конструкция поворачивается вокруг точки О на угол j. Результат поворота записывается в массивах хх и уу.

/* PYTH_TREE: Вариант дерева Пифагора */

#include "math.h"

#include "stdlib.h"

#include "time.h"

#define pi 3.1415927

#include "stdio.h"

struct {float xx; float yy; int ii;} s;

void pfopen(){ fp=fopen("scratch", "wb"); }

void pmove(float x,float y)

{ s.xx=x; s.yy=y; s.ii=0; /* 0 = pen up */ /* 0 = перо поднято */

fwrite(&s, sizeof s, 1, fp);

void pdraw(float x,float y)

{ s.xx=x; s.yy=y; s.ii=1; /* 1 = pen down */ /* 1 = перо опущено */

fwrite(&s, sizeof s, 1, fp);

void pfclose(){ fclose(fp); }

void square_and_triangle(int n,float x0,float y0, float a, float phi)

{ float x, y, xx, yy, cphi, sphi, c1, c2, b, c,

alpha, calpha, salpha;

int i, deviation; /* phi and alpha in radians */

/* delta in degrees */

if(n==0) return; /* углы phi и alpha в радианах */

/* угол delta в градусах */

deviation=rand()%(2*delta+1)-delta;

alpha=(45+deviation)*pi/180.0;

x=x=x0; x=x=x0+a;

y=y=y0; y=y=y0+a;

calpha=cos(alpha); salpha=sin(alpha);

c=a*calpha; b=a*salpha;

/* Rotation about (x0, y0) through angle phi ; */

/* Поворот вокруг точки (x0, y0) на угол phi;*/

cphi=cos(phi); sphi=sin(phi);

c1=x0-x0*cphi+y0*sphi;

c2=y0-x0*sphi-y0*cphi;

for (i=0; i<5; i++)

{ xx[i]=x[i]*cphi-y[i]*sphi+c1;

yy[i]=x[i]*sphi+y[i]*cphi+c2;

for (i=0; i<5; i++) pdraw(xx[i],yy[i]);

square_and_triangle(n-1, xx, yy, c, phi+alpha);

square_and_triangle(n-1, xx, yy, b, phi+alpha-0.5*pi);

pfopen(); time(&seed); srand((int)seed);

printf (" Задайте угол delta в градусах (0 < delta < 45) ");

scanf("%d", &delta);

printf(" Задайте глубину рекурсии n "); scanf("%d", &n);

square_and_triangle(n, 0.0, 0.0, 1.0, 0.0);

Эта программа формирует файл SCRATCH, который должен быть обработан программой GENPLOT из лекции 2. Графический результат работы программы для delta = 30 и п = 7 показан на рис. 3.4.

Занимаясь изучением алгоритмов обнаружения событий электрокардиограммы для исследовательской части дипломной работы, я обнаружил, что длительность R-R интервала кардиограммы, вычисленная даже с точностью до второго знака после запятой, достаточно точно характеризует сердечнососудистую систему конкретного человека. Поскольку я уже довольно давно увлекаюсь фрактальной геометрией, в моей голове моментально родилась мысль, как можно придать «личных» качеств какому-нибудь простейшему фрактальному объекту.

Так появилось «Электрокардиографическое дерево Пифагора».

Теоретическая часть – 1. Об электрокардиограмме

Графическая запись разности потенциалов, создающихся между различными участками сердечной мышцы в процессе ее возбуждения, называется электрокардиограммой (ЭКГ). Ориентация и величина этих потенциалов сердца на электрокардиограмме выражаются в амплитуде зубцов и их направленности (полярности) по отношению к изоэлектрической линии. И охватывают диапазон 0,15…300 Гц при уровне сигналов 0,3…3 мВ.

Нормальная ЭКГ состоит из зубцов и горизонтально расположенных между ними отрезков (сегментов) линий (Рисунок 1).

Рисунок 1 – Схематическое изображение нормальной электрокардиограммы.

В клинической практике применяются отведения от различных участков поверхности тела. Эти отведения называются поверхностными. При регистрации ЭКГ обычно используется 12 общепринятых отведений, шесть от конечностей и шесть грудных. Первые три стандартных отведения были предложены Эйнтховеном. Частота сокращений сердца (ЧСС) определяется по продолжительности одного сердечного цикла, т.е. по продолжительности интервала R – R.

Стандартным и наиболее удобным для определения ЧСС является II-отведение по Эйнтховену, т.к. в нем наибольшую амплитуду имеет именно зубец R.

Практическая часть – 1

Для расчетов будем использовать реальную ЭКГ здорового человека во II-отведении по Эйнтховену, полученную из базы данных физиологических сигналов .

Параметры ЭКГ:
Разрешение АЦП 12 бит;
Частота семплирования 100 Гц;
Длительность 10 секунд;

Рисунок 2 – Изображение нормальной ЭКГ из БД.

Далее определим QRS-комплекс, чтобы потом из него выделить зубец R. Для этого воспользуемся алгоритмом, основанном на взвешенном и возведенном в квадрат операторе первой производной и на фильтре скользящего среднего .

Звучит сложнее, чем выглядит:

Где x(n) - сигнал ЭКГ, N -ширина окна, в пределах которого разность первого порядка вычисляется, возводится в квадрат и взвешивается с использованием, коэффициента (N-i+1) .

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

Дальнейшее сглаживание выполняется с использованием фильтра скользящего среднего по M точкам:

При частоте дискретизации 100Гц ширина окна фильтра устанавливается как M=N=8 . Данный алгоритм дает единственный пик для каждого QRS-комплекса и подавляет зубцы P и Т. В результате обработки, получаем следующий вид ЭКГ (Рисунок 3).

Рисунок 3 – Изображение ЭКГ после фильтрации.

Поиск зубца R в обработанном сигнале может быть выполнен с помощью простого алгоритма поиска пиков:
1. Сканирование фрагмента сигнала g(n) , на котором ожидается наличие пика, и определение максимальной величины gmax .
2. Определение порога, как некоторой доли от максимума, Th=0.8gmax .
3. Для всех g(n)>Th выбираются те отсчеты, для которых соответствующие величины g(n) больше, чем определенное заданное число M предыдущих или последующих отсчетов g(n) .

Определенный таким образом набор {p} содержит индексы всех найденных в сигнале g(n) пиков.
Пики, вызванные артефактами, можно отбраковать дополнительными условиями, например - минимальный интервал между двумя соседними пиками.

Рисунок 4 – Изображение ЭКГ с отмеченными R-зубцами.

Далее стоит сама простая задача - определение средней длины R-R интервала данной ЭКГ. И в этом случае она равна 733мс. «По фану» рассчитаем ЧСС: 60/0.733=81.85 ударов/мин. Теперь у нас есть величина, характеризующая работу сердца конкретного человека.

Небольшое пояснение:
Сердце – не метроном, оно не может выстукивать такт с равными временными промежутками между ударами. R-R интервал для здорового человека колеблется в небольших пределах. Если колебания интервала будут значительными – это свидетельствует о наличии аритмий и других нарушений. Механизм колебаний является очень сложным комплексом процессов, связанным с электрической проводимостью конкретного сердца.

Используя величину среднего R-R интервала в качестве параметра при построении дерева Пифагора можно придать ему «неповторимые» («личные») черты.

Теоретическая часть – 2. О фракталах

Фракталами называются геометрические объекты: линии, поверхности, пространственные тела, имеющие сильно изрезанную форму и обладающие свойством самоподобия. Основоположник теории фракталов франко-американский математик Бенуа Мандельброт образовал термин фрактал от латинского причастия fractus. Соответствующий глагол frangere переводится, как ломать, разламывать, т.е. создавать фрагменты неправильной формы. Самоподобие, предопределяет масштабную инвариантность (скейлинг) основных геометрических особенностей фрактального объекта, их неизменность при изменении масштаба. Повторяемость изрезанности линий фрактальных объектов может быть полной (в этом случае говорят о регулярных фракталах), либо может наблюдаться некоторый элемент случайности (такие фракталы называют случайными). Структура случайных фракталов на малых масштабах не является точно идентичной всему объекту, но их статистические характеристики совпадают.

Дерево Пифагора - разновидность геометрического регулярного фрактала, основанная на фигуре, известной как «Пифагоровы штаны» .

Принцип построения геометрического фрактала - рекурсия.

Практическая часть – 2

Алгоритм построения дерева Пифагора:
1) Строим вертикальный отрезок;
2) Из верхнего конца этого отрезка рекурсивно строим еще 2 отрезка меньшей длины под углом 90° друг к другу;
3) Вызываем функцию построения двух последующих отрезков для каждой ветви дерева;

Функция построения дерева Пифагора на языке С.

Void Draw(double x, double y, double L, double a) { if(L > max) { L*=0.7; moveto(x,y); lineto((int)(x+L*cos(a)),(int)(y-L*sin(a))); x=x+L*cos(a); y=y-L*sin(a); Draw(x,y,L,a+Pi/n); Draw(x,y,L,a-Pi/m); } }
Рисунок 5 – дерево Пифагора для ЭКГ при R-R: 733ms.

Единственное, что осталось изменить - это в качестве переменной L использовать в программе вычисленную длину среднего R-R интервала ЭКГ.

Таким образом можно получить «личное» дерево Пифагора, которое будет «дышать», в зависимости от физической нагрузки, а длина ветвей и их закрученность - «максимально точно описывать» вашу личность.

Список литературы

1. Исследовательский ресурс сложных физиологических сигналов:

Дерево Пифагора - разновидность фрактала, основанная на фигуре, известной как «Пифагоровы штаны».

История

Пифагор, доказывая свою знаменитую теорему, построил фигуру, где на сторонах прямоугольного треугольника расположены квадраты. В наш век эта фигура Пифагора выросла в целое дерево. Впервые дерево Пифагора построил А. Е. Босман (1891-1961) во время второй мировой войны, используя обычную чертёжную линейку.


Особенности

Одним из свойств дерева Пифагора является то, что если площадь первого квадрата равна единице, то на каждом уровне сумма площадей квадратов тоже будет равна единице.

Если в классическом дереве Пифагора угол равен 45 градусам, то также можно построить и обобщённое дерево Пифагора при использовании других углов. Такое дерево часто называют обдуваемое ветром дерево Пифагора. Если изображать только отрезки, соединяющие каким-либо образом выбранные «центры» треугольников, то получается обнаженное дерево Пифагора.


Алгоритм:


1) Строим вертикальный отрезок
2) Из верхнего конца этого отрезка рекурсивно строим еще 2 отрезка под определенными углами
3) Вызываем функцию построения двух последующих отрезков для каждой ветви дерева

Примеры


Классическое дерево Пифагора

Обдуваемое ветром дерево Пифагора

Обнаженное дерево Пифагора

Обнаженное обдуваемое ветром дерево Пифагора