Побудова паралельних прямих. Допустимі відрізки для побудови за допомогою циркуля та лінійки

В основі способів побудови паралельних прямих за допомогою різних інструментів є ознаки паралельності прямих.

Побудова паралельних прямих за допомогою циркуля та лінійки

Розглянемо принцип побудови паралельної прямої, що проходить через задану точку, за допомогою циркуля та лінійки.

Нехай дана пряма та деяка точка А, яка не належить даній прямій.

Необхідно побудувати пряму, що проходить через задану точку $А$ паралельно даній прямій.

На практиці часто потрібно побудувати дві або більше паралельних прямих без даної прямої точки. У такому випадку необхідно накреслити пряму довільно і відзначити будь-яку точку, яка не лежатиме на даній прямій.

Розглянемо етапи побудови паралельної прямої:

Насправді також застосовують метод побудови паралельних прямих з допомогою креслярського косинця і лінійки.

Побудова паралельних прямих за допомогою косинця та лінійки

Для побудови прямої, яка проходитиме через точку М паралельно даній прямій а, необхідно:

  1. Кутник прикласти до прямої $а$ діагоналлю (дивіться малюнок), а до його більшого катету прикласти лінійку.
  2. Пересунути косинець по лінійці доти, поки ця точка $М$ не опиниться на діагоналі косинця.
  3. Провести через точку $М$ шукану пряму $b$.

Ми отримали пряму, що проходить через задану точку $М$, паралельну даній прямій $а$:

$a \parallel b$, тобто $M \in b$.

Паралельність прямих $а$ і $b$ видно з рівності відповідних кутів, які позначені малюнку буквами $\alpha$ і $\beta$.

Побудова паралельної прямої, що віддалена на задану відстань від даної прямої

У разі необхідності побудови прямої, паралельної заданої прямої та віддаленої від неї на заданій відстані можна скористатися лінійкою та косинцем.

Нехай дана пряма $MN$ та відстань $а$.

  1. Зазначимо на заданій прямій $MN$ довільну точку та назвемо її $В$.
  2. Через точку $В$ проведемо пряму, перпендикулярну до прямої $MN$, і назвемо її $АВ$.
  3. На прямій $АВ$ від точки $В$ відкладемо відрізок $ВС=а$.
  4. За допомогою косинця та лінійки проведемо пряму $CD$ через точку $С$, яка і буде паралельною заданою прямою $АВ$.

Якщо відкласти на прямий $АВ$ від точки $В$ відрізок $ВС=а$ в іншу сторону, то отримаємо ще одну паралельну пряму до заданої, що віддалена від неї на задану відстань $а$.

Інші способи побудови паралельних прямих

Ще одним способом побудови паралельних прямих є побудова за допомогою рейсшини. Найчастіше цей спосіб використовують у креслярській практиці.

При виконанні столярних робіт для розмітки та побудови паралельних прямих використовується спеціальний креслярський інструмент – малка – дві дерев'яні планки, які скріплюються шарніром.

Відома з античних часів.

У завдання на побудову можливі такі операції:

  • Вибрати довільну точкуна площині, точку на одній із побудованих ліній або точку перетину двох побудованих ліній.
  • За допомогою циркуляпровести коло з центром у побудованій точці з радіусом, що дорівнює відстані між двох побудованих точок.
  • За допомогою лінійкипровести пряму, що проходить через дві побудовані точки.

Простий приклад

Завдання.За допомогою циркуля та лінійки розбити цей відрізок ABна дві рівні частини. Одне з рішень показано малюнку:

  • Циркулем проводимо коло з центром у точці Aрадіусом AB.
  • Проводимо коло з центром у точці Bрадіусом AB.
  • Знаходимо точки перетину Pі Qдвох побудованих кіл.
  • Лінійкою проводимо відрізок, що з'єднує точки Pі Q.
  • Знаходимо точку перетину ABі PQ. Це - шукана середина відрізка AB.

Правильні багатокутники

Античним геометрам були відомі способи побудови правильних для n=2^k\,\!, 3\cdot 2^k, 5\cdot 2^kі 3\cdot5\cdot2^k.

Нерозв'язні завдання

Наступні три завдання на побудову було поставлено ще в античності:

  • - Розбити довільний кут на три рівні частини.
  • - побудувати відрізок, що є ребром куба вдвічі більшого обсягу, ніж куб із ребром.
  • - Побудувати квадрат, рівний за площею даному колу.

Побудови одним циркулем та однією лінійкою

За теоремою Мора-Маскероні (Mohr–Mascheroni theorem) за допомогою одного циркуля можна побудувати будь-яку фігуру, яку можна побудувати циркулем та лінійкою. У цьому пряма вважається побудованою, якщо у ній задані дві точки.

Легко помітити, що за допомогою однієї лінійки можна проводити тільки проектно-інваріантні побудови (див., наприклад, теорії поверхонь ).

Зокрема, неможливо навіть розбити відрізок на рівні частини. Але за наявності на площині заздалегідь проведеного кола з зазначеним центром за допомогою лінійки можна провести ті ж побудови, що і циркулем і лінійкою ( теорема Понселе-Штейнера (Poncelet-Steiner theorem), .

Див. також

  • - програма, що дозволяє робити побудови за допомогою циркуля та лінійки.

Література

Ця стаття написана за матеріалами одного з розділів книги Седжвіка, Уейна та Дондеро "Програмування мовою Python", що вже згадувалося раніше. Називається цей розділ "Системи ітераційних функцій", і в ньому описано побудову різних зображень, таких як трикутник Серпіньського, папороть Барнслі та деяких інших, за допомогою досить нескладного алгоритму, який ще й з легкістю реалізується.

Почну з опису даного алгоритму. Я використатиму математичну термінологію, в тому числі, і ту, яку автори книги, в ході своєї розповіді, не задіють. Суто математичний погляд на алгоритми полегшує мені їхнє розуміння, та й викладати їх за допомогою математичної мови мені досить зручно.

Тож для розуміння теоретичної частини статті читачеві знадобляться знання деяких розділів математики, які зазвичай читаються у технічних вузах. Зокрема, незайвим буде знайомство з теорією ймовірностей та елементами математичного аналізу.

За теоретичною частиною статті слідуватиме практична, що описує реалізацію алгоритму мовою C99. Оскільки результатами роботи програми будуть зображення, ми будемо використовувати в програмі графічну бібліотеку pgraph, припускаючи, що читач, хоча б загалом, з нею знайомий.

Отже, переходимо до теоретичної частини нашої оповіді.

Ітераційні функції та випадкові послідовності

Перед тим, як викласти схему, за якою вестиметься побудова зображень, поговоримо про послідовності, члени яких обчислюються за допомогою рекурентних формул.

Задамо 2 послідовності, x n n = 1 ∞ та y n n = 1 ∞ , за допомогою наступних рекурентних формул:

X n = f x n - 1 , y n - 1 , n ∈ ℕ , y n = g x n - 1 , y n - 1 , n ∈ ℕ .

Пояснимо, що x 0 та y 0 - це деякі заздалегідь задані числа, а f(x, y) та g(x, y) - це деякі функції двох змінних, звані ітераційними. Сам процес обчислення чергового члена тієї чи іншої послідовності через такі функції називатимемо ітераціями, а наведений вище набір рекурентних формул - ітераційною схемою.

Рекурсивний спосіб завдання послідовностей, швидше за все, добре знайомий читачеві, якщо він вивчав математику у вузі. Дещо незвичайним може здатися "перехресний" спосіб обчислення членів послідовностей, при якому для обчислення n-го члена кожної з двох послідовностей потрібний не тільки n− 1-й член тієї ж послідовності, а й n− 1-й член інший.

А тепер розглянемо схему побудови членів двох послідовностей, яка використовує не одну пару ітераційних функцій, а mпар. Кожна з цих функцій буде лінійною по обох змінних, а також міститиме адитивну константу. Більш конкретно, функції матимуть вигляд:

F k x , y = k + k + k + k g k x , y = d k x + e k y + h k , k = 0 , 1 , … , m - 1 .

Для кожного nпочинаючи з 1, буде випадковим чином вибиратися число від 0 до m− 1, та при обчисленні x nі y nу рекурентних формулах буде використовуватися пара ітераційних функцій, індекси яких дорівнюють даному випадковому числу. Зазначимо, що випадкові числа, " які " перед кожною ітерацією, нічого не винні бути равновероятными. Однак для різних кроків ймовірність появи конкретного фіксованого числа та сама.

Давайте тепер сформулюємо сказане суворою математичною мовою. Розглянемо послідовність дискретних незалежних у сукупності випадкових величин T n = 1 ∞ , розподілених по тому самому закону. А саме: кожна випадкова величина набуває значення 0, 1, …, m− 1 з відповідними ймовірностями p 0 , p 1 , …, p m-1 .

Тепер послідовності, x n n = 1 ∞ і y n n = 1 ∞ поставимо за допомогою наступної ітераційної схеми:

X n = f T n x n - 1 , y n - 1 , n ∈ ℕ , y n = g T n x n - 1 , y n - 1 , n ∈ ℕ .

Як і раніше, x 0 та y 0 – це деякі заздалегідь задані числа.

Таким чином, кожна з послідовностей є випадковою, тобто її члени – це випадкові величини. Однак, кожну з цих послідовностей можна "реалізувати", тобто обчислити всі її члени (зрозуміло, таких реалізацій буде дуже багато).

Поставимо головне питання даного розділу. А яке ж відношення зображення, яке ми збираємося будувати, мають до цієї пари випадкових послідовностей? Дуже просте. Побудуємо реалізацію цих двох послідовностей. Для кожного натурального nпару ( x n, y n) можна розглядати як координати точки, заданої в декартовій прямокутній системі координат на площині. Так ось, зображення, що відповідає деякій парі реалізованих послідовностей, є геометричним місцем всіх таких точок на площині.

Здавалося б, кожної реалізації пари послідовностей ми отримуватимемо своє зображення, відмінне від інших. Однак, як це не парадоксально, зображення щоразу будуть практично збігатися (тобто при побудові на комп'ютері будуть невиразні людським оком). А при відповідному доборі ітераційних функцій та законів розподілу випадкових величин, що беруть участь у формуванні членів послідовностей, можна створювати цікаві візерунки.

Додамо, що з побудові зображень на комп'ютері, зрозуміло, виконуватимемо лише кінцеве (але досить велике) число ітерацій.

Про генерацію псевдовипадкових чисел

При написанні програми ми зіткнемося з необхідністю генерувати псевдовипадкові числа, розподілені, взагалі кажучи, не рівномірно, а за наперед заданим законом. У той самий час, ми матимемо лише програмним генератором псевдовипадкових чисел, рівномірно розподілених на проміжку . Як із другого розподілу отримати перший?

Переведемо завдання до математичної площини. Нехай є безперервна випадкова величина U, Розподілена рівномірно на відрізку . Задамося метою побудувати дискретну випадкову величину Tяк функцію від U, таким чином, щоб Tприймала значення 0, 1, …, m− 1 з відповідними ймовірностями p 0 , p 1 , …, p m-1 .

Вирішити поставлене завдання дуже просто. Введемо на розгляд суми ймовірностей

s k = ∑ i = 0 k - 1 pi, k = 0, 1, …, m - 1.

Якщо верхня межа підсумовування iменше нижнього, то таку суму за визначенням вважатимемо рівною 0.

Твисловимо через Uнаступним чином:

T = 0 , якщо U ? s 0 , s 1 , 1 , якщо U ? s 1 , s 2 , 2 , якщо U ? s 2 , s 3 , … … … … … … , … … … … … … - 1 , якщо U ∈ s m - 1 , 1 .

Очевидно, випадкова величина Tрозподілено за необхідним нами законом. Зауважимо, що, по суті, Т- це номер проміжку, до якого потрапляє випадкова величина U(за умови, що проміжки ми нумеруємо числами від 0 до m− 1 у порядку зростання їх лівих кордонів).

З практичної точки зору отриманий результат дозволяє на кожному кроці ітерації як номер ітераційних функцій брати номер проміжку, який потрапляє число, згенероване датчиком псевдовипадкових чисел, рівномірно розподілених на відрізку .

А тепер можна переходити до написання програми.

Структура програми

Програма складається з файлу main.c та файлів, що утворюють графічну бібліотеку pgraph. Вміст файлу main.c починається з наступної директиви, що включає графічну бібліотеку:

#include "pgraph.h"

Далі у файлі містяться описи глобальних константних змінних та константних масивів. За ними - визначення функцій get_random_value() та main(). Перша з них генерує псевдовипадкові числа, а друга виконує основну роботу з побудови зображень.

Глобальні константні змінні та константні масиви

Вся інформація, необхідна побудови конкретного зображення, міститься у глобальних константних змінних і константних масивах. Зрозуміло, для кожного зображення набір значень констант та елементів константних масивів буде "свій".

Нижче наводяться описи даних констант та масивів.

  • n – кількість ітерацій;
  • w - ширина зображення у пікселях;
  • h - висота зображення у пікселях;
  • xc - абсциса початку нової системи координат у старій системі;
  • yc - ордината початку нової системи координат у старій системі;
  • l - довжина в пікселях відрізка, паралельного до однієї з осей координат, що має в новій системі координат одиничну довжину;
  • m - кількість пар ітераційних функцій, тобто число m;
  • s - одновимірний масив розміру m, що містить суми ймовірностей випадкових величин T n (k-й елемент масиву містить s k);
  • f - двомірний масив, що складається з m f k(x, yk, 0), (k, 1), (k, 2) містять числа a k, b k, c kвідповідно, де 0 ≤ km − 1);
  • g - двомірний масив, що складається з m"рядок" і 3-х "стовпців", що містить константи, задіяні у функціях g k(x, y) (елементи масиву з індексами ( k, 0), (k, 1), (k, 2) містять числа d k, e k, h kвідповідно, де 0 ≤ km − 1).

Усі змінні мають тип int, а базовим типом всіх масивів є double.

Пояснимо, що під "старою" системою координат мається на увазі та, яка визначена у бібліотеці pgraph. Побудови всіх зображень будуть вестись у новій системі, отриманій зі старої паралельним переносом (зрушення по осях абсцис та ординат рівні відповідно x cі y c) і "стисненням" в lразів. Таким чином, точка, що має в новій системі координати ( x, y), у старій буде мати координати ( x l + x c, y l + y c). Зайве, гадаю, пояснювати, що за зберігання чисел x c, y cі lвідповідальні константні змінні xc, yc та l відповідно.

Для зберігання чисел x 0 та y 0 змінні не виділяються, оскільки у всіх випадках побудови зображень як ці цифри беруться нулі.

Генерація псевдовипадкових чисел: функція get_random_value()

Функція get_random_value() при кожному зверненні до неї генерує ціле псевдовипадкове число в діапазоні від 0 до m− 1 відповідно до описаної раніше схеми. Ось код цієї функції:

1. int get_random_value() 2. { 3. double r = (double) rand() / RAND_MAX; 4. int c = 1; 5. while (s[c]< r && ++c < m) 6. ; 7. return c - 1; 8. }

Отримуємо за допомогою стандартної бібліотечної функції rand() псевдовипадкове число в діапазоні від 0 до значення макросу RAND_MAX , ділимо отриманий результат на це значення і привласнюємо приватне змінної r (стор. 3). Тепер у r зберігається число, що належить відрізку . Його приблизно можна вважати значенням випадкової величини, рівномірно розподіленої на цьому відрізку.

Пояснимо, що значення макросу RAND_MAX , у разі (т. е. у разі використання компілятора MinGW64 версії 4.9.2 для 64-бітних систем) дорівнює 32767.

Тепер, за допомогою лінійного пошуку, що діє цикл while , шукаємо індекс найбільшого елемента масиву s , що не перевищує значення r , збільшений на одиницю, і зберігаємо його в змінній c (див. стор 4-6). Зазначимо, що у разі, якщо значення r - нульове, цикл не виконується жодного разу, а змінна з зберігає одиничне значення (див. стор. 4).

Значення, яке повертається функцією, можна наближено розглядати як значення випадкової величини T, описаної у вищезгаданому розділі.

Генерація зображення: функція main()

А ось і код функції main():

1. int main() 2. { 3. image *img = create_image(w, h); 4. double x = 0, y = 0; 5. for (int i = 0; i< n; i++) 6. { 7. int r = get_random_value(); 8. double x1 = f[r] * x + f[r] * y + f[r]; 9. double y1 = g [r] * x + g [r] * y + g [r]; 10. x = x1; 11. y = y1; 12. set_color(img, round(x * l) + xc, round (y * l) + yc, BLACK); 13. } 14. save_to_file(img, "out.bmp"); 15. free(img); 16. return 0; 17. }

Створюємо зображення із заданими розмірами (стор. 3). Виділяємо пам'ять під змінні xі y, у яких зберігатимуться поточні члени послідовностей, та ініціалізуємо їх нулями (стор. 4). Нагадаю, що як чисел x 0 та y 0 , що у обчисленні перших членів кожної з послідовностей, беруться нулі.

Обчислюємо у циклі for перші nчленів кожної послідовності (стор. 5-13). Отримуємо спочатку псевдовипадкове число і записуємо його в r (стор. 7). Далі обчислюємо поточні значення членів обох послідовностей, поміщаючи в тимчасові змінні x1 і y1 (стор. 8, 9). При обчисленні використовуємо константи, що фігурують в ітераційних функціях і зберігаються в масивах f і g. Вибір тієї чи іншої пари наборів коефіцієнтів (а значить, пари ітераційних функцій) залежить від значення r, що використовується як перші індекси елементів масивів, що беруть участь у обчисленнях.

Переписуємо обчислені поточні значення змінні x і y (стор. 10, 11). Координати точки, що містяться в цих змінних, переводимо в координати вихідної системи координат, округляємо до цілих і наносимо крапку з результуючими координатами зображення чорним кольором (стор. 12).

Після завершення циклу зберігаємо сформоване зображення у файлі "out.bmp" (стор. 14) і звільняємо пам'ять (стор. 15). У цьому робота функції завершується.

Побудова зображення трикутника Серпінського

Трикутник Серпіньського є безліч точок, одержуваного з усіх точок деякого вихідного рівностороннього трикутника наступним чином. Трикутник розбивається трьома середніми лініями на 4 трикутники, після чого "центральний" трикутник видаляється. Далі з кожним із трьох рівносторонніх трикутників, що залишилися, виконується та ж операція. Нарешті, те саме ми робимо з дев'ятьма рівносторонніми трикутниками.

Продовжуючи описані операції до нескінченності, видаляємо, зрештою, з вихідного трикутника нескінченне число рівносторонніх трикутників, сума площ яких дорівнює площі вихідного. Точки, що залишилися, утворюють лінію, звану трикутником Серпіньського, що відіграє важливу роль у теорії множин.

У книзі Седжвіка та інших авторів пропонується наступний спосіб побудови зображення трикутника Серпінського. Розглянемо 3 точки на площині, що є вершинами рівностороннього трикутника, наприклад, точки з координатами 0, 0, 0, 1, 1/2, 3/2 у прямокутній декартовій системі координат. Вибираємо навмання (з рівними ймовірностями) одну з трьох вершин трикутника і будуємо точку, що ділить відрізок, що з'єднує вершину з координатами 0, 0 і обрану навмання вершину навпіл. Це перша точка нашого зображення.

Наведений алгоритм можна укласти в описану раніше схему побудови зображень, що задіяла випадкові послідовності та ітераційні функції.

Нам потрібні 3 пари ітераційних функцій. Їхні індекси 0, 1, 2 повинні вибиратися з ймовірностями 1/3, 1/3, 1/3 відповідно. Самі ітераційні функції наведені нижче.

F 0 x , y = 1 / 2 x , g 0 x , y = 1 / 2 y , f 1 x , y = 1 / 2 x + 1 / 2 , g 1 x , y = 1 / 2 y , f 2 x, y = 1/2 x + 1/4, g 2 x, y = 1/2 y + 3/4.

Тепер давайте вставимо в нашу програму описи глобальних константних змінних та константних масивів, що відповідають даним ймовірностям та даним ітераційним функціям. Але для початку визначимо макрос TRIANGLE , помістивши файл main.с після інструкції #include наступну інструкцію

#define TRIANGLE

Після інструкції вставляємо у файл наступний код:

//Трикутник Серпінського #ifdef TRIANGLE const int n = 100000; //кількість ітерацій const int w = 620, h = 550; //Розміри зображення const int xc = 10, yc = 10; //координати початку нової системи координат у старій const int l = 600; //Коефіцієнт стиснення const int m = 3; //кількість пар ітераційних функцій const double s = (0, 0.3333333, 0.6666667); //масив сум ймовірностей const double f = ((0.5, 0.0, 0.0), //масив коефіцієнтів для функцій f(x,y), {0.5 , 0.0 , 0.5 }, //задіяних для обчислень x {0.5 , 0.0 , 0.25 }}; const double g = ((0.0, 0.5, 0.0), //масив коефіцієнтів для функцій g(x,y), {0.0 , 0.5 , 0.0 }, //задіяних для обчислень y {0.0 , 0.5 , 0.4330127 }}; #endif

Наведений фрагмент коду (без директив препроцесора) буде скомпілюваний лише у випадку, якщо визначено макрос TRIANGLE (а він визначено). Зрозуміло, константи, представлені лише з допомогою нескінченних десяткових дробів (раціональних чи ірраціональних) ми округляли.

В результаті компіляції та виконання програми в кореневій директорії файлу з'являється графічний файл out.bmp, що містить наступне зображення:

Побудова зображення папороті Барнслі

Наступне зображення, побудова якого описується у книзі Седжвіка та інших, - це зображення папороті Барнслі. Тепер нам уже знадобиться 4 пари ітераційних функцій. Їхні індекси 0, 1, 2, 3 будуть вибиратися з ймовірностями 0,01, 0,85, 0,07, 0,07 відповідно. А ось і самі ітераційні функції:

F 0 x , y = 0 , 5 , g 0 x , y = 0 , 16 y , f 1 x , y = 0 , 85 x + 0 , 04 y + 0 , 075 , g 1 x , y = - 0 , 04 x + 0 , 85 y + 0 , 18 , f 2 x , y = 0 , 2 x - 0 , 26 y + 0 , 4 , g 2 x , y = 0 , 23 x + 0 , 22 y + 0 , 045 , f 3 x , y = - 0 , 15 x + 0 , 28 y + 0 , 575 , g 3 x , y = 0 , 26 x + 0 , 24 y - 0 , 086 .

Вносимо тепер зміни до програми. Інструкцію #define замінюємо інструкцією

#define FERN

А після #ifdef -блоку поміщаємо наступний фрагмент коду:

//Папороть Барнслі #ifdef FERN const int n = 100000; const int l = 600; const int m = 4; const double s = (0, 0.01, 0.86, 0.93); const double f = ((0.0, 0.0, 0.5), {0.85 , 0.04 , 0.075 }, {0.2 , -0.26 , 0.4 }, {-0.15 , 0.28 , 0.575 }}; const double g = ((0.0, 0.16, 0.0), {-0.04 , 0.85 , 0.18 }, {0.23 , 0.22 , 0.045 }, {0.26 , 0.24 , -0.086 }}; #endif

Результатом компіляції та запуску програми є таке зображення:

Побудова зображення дерева

Тепер побудуємо те, що у книзі Седжвіка та інших авторів називається "деревом", хоча те, що виявляється зображеним, швидше за все, схоже на набір дерев різних розмірів. На цей раз в ітераційному процесі братимуть участь 6 пар ітераційних функцій. Їхні індекси 0, 1, 2, 3, 4, 5 будуть вибиратися з ймовірностями 0,1, 0,1, 0,2, 0,2, 0,2, 0,2 відповідно. Ось ці функції:

F 0 x , y = 0 , 55 , g 0 x , y = 0 , 6 y , f 1 x , y = - 0 , 05 x + 0 , 525 , g 1 x , y = - 0 , 5 x + 0 , 75 , f 2 x , y = 0 , 46 x - 0 , 15 y + 0 , 27 , g 2 x , y = 0 , 39 x + 0 , 38 y + 0 , 105 , f 3 x , y = 0 , 47 x - 0 , 15 y + 0 , 265 , g 3 x , y = 0 , 17 x + 0 , 42 y + 0 , 465 , f 4 x , y = 0 , 43 x + 0 , 26 y + 0 , 29 , g 4 x , y = - 0 , 25 x + 0 , 45 y + 0 , 625 , f 5 x , y = 0 , 42 x + 0 , 26 y + 0 , 29 , g 5 x , y = - 0,35 x + 0, 31 y + 0,525.

#define TREE

За останнім #ifdef-блоком вставляємо наступний код:

//Дерево #ifdef TREE const int n = 100000; const int w = 620, h = 620; const int xc = 0, yc = 10; const int l = 600; const int m = 6; const double s = (0, 0.1, 0.2, 0.4, 0.6, 0.8); const double f = ((0.0, 0.0, 0.55), {-0.05 , 0.0 , 0.525 }, {0.46 , -0.15 , 0.27 }, {0.47 , -0.15 , 0.265 }, {0.43 , 0.26 , 0.29 }, {0.42 , 0.26 , 0.29 }}; const double g = ((0.0, 0.6, 0.0), {-0.5 , 0.0 , 0.75 }, {0.39 , 0.38 , 0.105 }, {0.17 , 0.42 , 0.465 }, {-0.25 , 0.45 , 0.625 }, {-0.35 , 0.31 , 0.525 }}; #endif

Результат роботи скомпільованої програми – це зображення, наведене нижче:

Останнє зображення, яке ми збудуємо, керуючись книгою Седжвіка, - це зображення корала. Нам потрібні 3 пари ітераційних функцій. Їхні індекси 0, 1, 2 будуть вибиратися з ймовірностями 0,4, 0,15, 0,45 відповідно. Ітераційні функції наведені нижче.

F 0 x , y = 0 , 3077 x - 0 , 5315 y + 0 , 8863 , g 0 x , y = - 0 , 4615 x - 0 , 2937 y + 1 , 0962 , f 1 x , y = 0,30 x - 0 , 0769 y + 0 , 2166 , g 1 x , y = 0 , 1538 x - 0 , 4476 y + 0 , 3384 , f 2 x , y = 0 , 5455 y + 0 , 0106 , g 2 y = 0,6923 x-0, 1958 y + 0,3808.

Замінюємо інструкцію #define інструкцією

#define CORAL

За останнім #ifdef-блоком вставляємо новий блок:

//Корал #ifdef CORAL const int n = 100000; const int w = 620, h = 620; const int xc = 10, yc = 10; const int l = 600; const int m = 3; const double s = (0, 0.4, 0.55); const double f = ((0.3077, -0.5315, 0.8863), {0.3077 , -0.0769 , 0.2166 }, {0.0 , 0.5455 , 0.0106 }}; const double g = ((-0.4615, -0.2937, 1.0962), {0.1538 , -0.4476 , 0.3384 }, {0.6923 , -0.1958 , 0.3808 }}; #endif

Ось яке зображення отримуємо в результаті компіляції та виконання програми:

Висновок

Не знаю, як вам, а мені було цікаво спостерігати за тим, як набори математичних формул "перетворюється" на дуже кумедні зображення. А ще мене дивує те, що ті, хто все це придумали, змогли підібрати ймовірності та константи, які беруть участь в ітераційних функціях, таким чином, щоб досягти таких дивовижних картин! Методика підбору всіх цих чисел (за винятком трикутника Серпінського) мені абсолютно незрозуміла!

Зазначу, що, судячи з зображень, трикутник Серпіньського та папороть Барнслі є фракталами. Швидше за все, те саме можна сказати про "дерево" і "корал", але їх фрактальна природа, мабуть, трохи менш очевидна.

За наведеним нижче посиланням, як завжди, можна завантажити вихідний код розглянутої статті програми. У файлі main.c є чотири вказівки #define , кожна з яких відповідає одному з чотирьох зображень. Три з них закоментовані. Зрозуміло, що для того, щоб перейти від одного зображення до іншого, потрібно закоментувати інструкцію некоментовану і розкоментувати одну з закоментованих. Ну ви зрозуміли...

А ще за допомогою нескладного алгоритму можна домогтися того, щоб розглянуті у статті зображення плавно перетворювалися один на одного. Але це вже тема для окремої статті.

Відомий ще з античних часів.

У завдання на побудову можливі такі операції:

  • Відзначити довільну точкуна площині, точку на одній із побудованих ліній або точку перетину двох побудованих ліній.
  • За допомогою циркулянамалювати коло з центром у побудованій точці та радіусом, що дорівнює відстані між двома вже побудованими точками.
  • За допомогою лінійкипровести пряму, що проходить через дві побудовані точки.

При цьому циркуль та лінійка вважаються ідеальними інструментами, зокрема:


1. Простий приклад

Розподіл відрізка навпіл

Завдання.За допомогою циркуля та лінійки розділити цей відрізок ABна дві рівні частини. Одне з рішень показано малюнку:

  • Циркулем будуємо коло з центром у точці Aрадіусу AB.
  • Будуємо коло з центром у точці Bрадіусу AB.
  • Знаходимо точки перетину Pі Qдвох побудованих кіл.
  • Лінійкою проводимо відрізок, що з'єднує точки Pі Q.
  • Знаходимо точку перетину ABі PQ.Це - шукана середина відрізка AB.

2. Правильні багатокутники

Античним геометрам були відомі методи побудови правильних n-кутників для , , і .


4. Можливі та неможливі побудови

Усі побудови є нічим іншим, як розв'язанням будь-якого рівняння , причому коефіцієнти цього рівняння пов'язані з довжинами заданих відрізків. Тому зручно говорити про побудову числа – графічного рішення рівняння певного типу.

У рамках вищеокреслених вимог можливі такі споруди:

Інакше висловлюючись, можна побудувати лише числа рівні арифметичним виразам з допомогою квадратного кореня з вихідних чисел (довжин відрізків). Наприклад,


5. Варіації та узагальнення


6. Смішні факти

  • GeoGebra, Kig, KSEG - програми, що дозволяють виконувати побудови за допомогою циркуля та лінійки.

Література

  • А. Адлер. Теорія геометричних побудов,Переклад з німецької Г. М. Фіхтенгольц. Видання третє. Л., Навчпедвід, 1940-232 с.
  • І. Олександров, Збірник геометричних завдань на побудову,Видання вісімнадцяте, М., Навчпедвід, 1950-176 с.
  • Б. І. Аргунов, М Б Балк.

2. Розділимо її на деяку кількість рівних дуг, у нашому випадку 8. Для цього проведемо радіуси так, щоб вийшло 8 дуг, і кут між двома найближчими радіусами дорівнював
:
кількість сторін (у разі 8.
Отримуємо точки А1, А2
, A3, A4, A5, A6, A7, A8

А2
А1
А8
А7
А6
А5
А4
А3
n-
косинця
3. З'єднаємо центри кола та одну з точок їх перетину

Ми отримуємо правильний трикутник

1
. Побудуємо 2 кола, що проходять через центр один одного.

2
. З'єднаємо центри прямий, отримавши одну із сторін п'ятикутника.

3. З'єднаємо точки перетину кіл.

5 . З'єднуємо точки перетину всіх прямих з вихідним колом.

Ми отримуємо правильний шестикутник
Доказ існування правильного
n-
косинця
Якщо
n
(кількість кутів багатокутника) більше 2, то такий багатокутник існує.
Пробуємо побудувати 8ми косинець і доведемо це.
1. Візьмемо коло довільного радіусу з центром у точці «О»

Побудова трикутника за допомогою циркуля та лінійки
«
O
» .

2. Побудуємо ще одне коло того ж радіусу, що проходить через точку «О».


4. З'єднаємо точки, що лежать на колі.

Отримуємо правильний восьмикутник.
Побудова правильних багатокутників за допомогою циркуля та лінійки.

У 1796 році одним з найбільших математиків усіх часів Карл Фрідріх Гаус показав можливість побудови правильних
n-
косинців, якщо рівність
n =
+ 1
, де
n –
кількість кутів, а
k
– будь-яке натуральне число
.
Тим самим вийшло, що в межах 30 можливий поділ кола на 2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 17, 20, 24, 30, рівних частин
.
У 1836 році
Ванцель
довів, що правильні багатокутники, що не задовольняють цій рівності за допомогою лінійки та циркуля побудувати не можна.

Побудова правильного шестикутника за допомогою циркуля та лінійки.

4. Проведемо прямі через центр початкового кола та точки перетину дуги з цим колом

ЛІТЕРАТУРА
Атанасян
Л. С. та ін. Геометрія: Підручник для 7-9 класів освітніх закладів. - М: "Освіта". 1998.
Б. І. Аргунов, М. Б.
Балк
. Геометричні побудови на площині, Посібник для студентів педагогічних інститутів. Видання друге. М.,
Учпедгіз
, 1957 - 268 с.
І. Ф.
Шаригін
, Л.М.
Єрганжієва
. "Наочна геометрія".
Ще
одним
великим математиком, який вивчав правильні багатокутники, був
Евклід
або
Евклід
(ін. грец.
Εὐκλείδης
, від «добра слава»
ок
. 300 р. до зв. е.)

автор першого з теоретичних трактатів з математики, що дійшли до нас.
.
Його головна робота «Початку» містить виклад планіметрії, стереометрії та ряди питань теорії чисел
;
в ній він підбив підсумок подальшого розвитку математики. У
IV
книзі він описав побудову правильних багатокутників при
n
рівному
3
, 4, 5, 6, 15

та визначив перший критерій побудови багатокутників.
Побудова правильного восьмикутника.
1. Побудуємо восьмикутник за допомогою чотирикутника.
2. З'єднаємо протилежні вершини чотирикутника
3. Проведемо бісектриси кутів утворених діагоналі, що перетинаються.

Трикутники
, сторонами яких є найближчі радіуси та
сторони восьмикутника, що вийшов, рівні по двох сторонах і куті між ними, відповідно сторони восьмикутника рівні і він є правильним. Цей доказ застосовується не тільки до восьмикутників.
,
але і до багатокутників з кількістю кутів
більше 2-х
. Що й потрібно було довести
.
Доказ існування правильного
n-
косинця

А2
А1
А8
А7
А6
А5
А4
А3

4 . Проводимо прямі через точки перетину кіл
5. З'єднуємо точки перетину прямих та кола

Отримуємо правильний чотирикутник.
Побудова правильного п'ятикутника методом Дюрера.
6. З'єднаємо точки зіткнення цих відрізків з колами з кінцями збудованої сторони п'ятикутника.
7. Добудуємо до п'ятикутника

Основоположниками розділу математики про правильні багатокутники були давньогрецькі вчені. Одним із них був
Архімед.
Архімед
- Відомий давньогрецький математик, фізик та інженер. Він зробив безліч відкриттів у геометрії, ввів основи механіки, гідростатики, створив безліч важливих винаходів. Архімед був просто одержимий математикою. Він забував про їжу, зовсім не дбав про себе. Його відкриття послужили для сучасних винаходів.
Побудова правильного шестикутника за допомогою циркуля та лінійки.

1. Побудуємо коло з центром у точці
O
.
2. Проведемо пряму лінію через центр кола.
3. Проведемо дугу коло того ж радіуса з центром у точці перетину прямий з колом до перетину з колом.

Презентація на тему: «Побудова правильних багатокутників за допомогою циркуля та лінійки»
Підготував:
Гурома
Денис
учень 10 класу МБОУ школи №3
Вчитель:
Наїмова
Тетяна Михайлівна
2015 рік
3. По черзі з'єднуємо їх та отримуємо правильний восьмикутник.
Доказ існування правильного
n-
косинця

А2
А1
А8
А7
А6
А5
А4
А3
Побудова правильного чотирикутника.

1. Побудуємо коло з центром у точці
O
.
2. Проведемо 2 взаємно перпендикулярні діаметри.
3. З точок у яких діаметри стосуються кола проводимо інші кола даного радіусу до їх перетину (кіл).

Побудова правильного п'ятикутника методом Дюрера.

4. Проведемо ще одне коло того ж радіусу з центром у точці перетину двох інших кіл.

5. Проведемо 2 відрізки.



Останні матеріали розділу:

Структура мови Структура мови у психології
Структура мови Структура мови у психології

Поняття мови в психології розшифровується як система звукових сигналів, що використовуються людиною, письмових позначень для передачі...

Врівноваженість нервових процесів
Врівноваженість нервових процесів

«ТАК» - 3, 4, 7, 13, 15, 17, 19, 21, 23, 24, 32, 39, 45, 56, 58, 60, 61, 66, 72, 73, 78, 81, 82, 83, 94, 97, 98, 102, 105, 106, 113, 114, 117, 121,...

Що таке асиміляція досвіду у психології
Що таке асиміляція досвіду у психології

асиміляція- згідно з Ж. Піаже - механізм, що забезпечує використання в нових умовах раніше набутих умінь та навичок без їх суттєвого...