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

В основе способов построения параллельных прямых с помощью различных инструментов лежат признаки параллельности прямых.

Построение параллельных прямых с помощью циркуля и линейки

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

Пусть дана прямая и некоторая точка А, которая не принадлежит данной прямой.

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

На практике зачастую требуется построить две или более параллельных прямых без данной прямой и точки. В таком случае необходимо начертить прямую произвольно и отметить любую точку, которая не будет лежать на данной прямой.

Рассмотрим этапы построения параллельной прямой :

На практике также применяют метод построения параллельных прямых с помощью чертежного угольника и линейки.

Построение параллельных прямых с помощью угольника и линейки

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

  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 = a k x + b k y + c 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 p i , 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 , … … … … … … , … … … … … … , m - 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 , y k , 0), (k , 1), (k , 2) содержат числа a k , b k , c k соответственно, где 0 ≤ k m − 1);
  • g - двухмерный массив, состоящий из m "строк" и 3-х "столбцов", содержащий константы, задействованные в функциях g k (x , y ) (элементы массива с индексами (k , 0), (k , 1), (k , 2) содержат числа d k , e k , h k соответственно, где 0 ≤ k m − 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 треугольника, после чего "центральный" треугольник удаляется. Далее c каждым из оставшихся трёх равносторонних треугольников выполняется та же операция. Наконец, то же самое мы делаем с получившимися девятью равносторонними треугольниками.

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

В книге Седжвика и других авторов предлагается следующий способ построения изображения треугольника Серпиньского. Рассмотрим 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 , 3077 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 x , 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 отрезка.



Последние материалы раздела:

Развитие критического мышления: технологии и методики
Развитие критического мышления: технологии и методики

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

Онлайн обучение профессии Программист 1С
Онлайн обучение профессии Программист 1С

В современном мире цифровых технологий профессия программиста остается одной из самых востребованных и перспективных. Особенно высок спрос на...

Пробный ЕГЭ по русскому языку
Пробный ЕГЭ по русскому языку

Здравствуйте! Уточните, пожалуйста, как верно оформлять подобные предложения с оборотом «Как пишет...» (двоеточие/запятая, кавычки/без,...