График функции в виде сердца


Один и один — получается два. Все одиноки — здесь ты, а там я.
Люди всегда одиноки вдвойне сами с собою наедине.
Если б их что-то сблизить могло, сразу б из двух получилось одно.
Пусть математика сложит сердца — чтобы проделать нам путь до конца.

Уильямс Джей, «Герои Ниоткуда»

Вероятно, пост следовало назвать «Как нарисовать анимированное сердечко ко дню Святого Валентина, используя математику не по назначению». Я отверг это название в пользу более поэтичного: как-никак, надвигается замечательный романтический праздник, который мы, айтишники и прочие нёрды, должны встретить во всеоружии. Я сразу покажу вам результат, а под хабракатом будет много букв о том, как я этого результата достиг.

Дисклеймер

Я осознаю, что красивое мигающее сердечко можно сделать и без малейшего знания математики. Но разве это интересно?

Шаг 1. Параметризуем сердечко.

Для начала нам нужен математический объект, хотя бы отдалённо напоминающий сердечко. К счастью, для меня этот шаг был тривиален: ещё пару лет назад я обнаружил замечательную формулу как раз для такого случая (из эстетических соображений график на рисунке растянут по горизонтали, на самом деле он должен умещаться между -1 и 1).


График функции в виде сердца

Формула была обнаружена из следующий соображений: возьмём обыкновенную окружность (x = cos(t); y = sin(t)) и представим, что она состоит из желе, будучи при этом жёстко прикреплена к оси ординат. Теперь «подуем» на неё снизу: прибавим к координате игрек некую функцию w(x) = w(x(t)), равную нулю при x=0, монотонно возрастающую при x>0 и чётную по x. После такого «дуновения» половинки окружности сместятся вверх, образуя «выпуклости» сердечка, а благодаря жёсткому креплению к оси Y образуется нижний «хвостик» и верхняя «вмятинка». В данном случае w(x(t)) = |x| 1/2 = |cos(t)| 1/2 . Можете самостоятельно попробовать другую «функцию дуновения» и посмотреть, что из этого выйдет.

Шаг 2. От параметрического задания к неявной функции.

Для нашего коварного плана параметрическое уравнение (x(t); y(t)) неудобно; предпочтительнее было бы неявное задание вида f(x, y) = 0. Что ж, всё в наших руках. Итак, брюки превращаются:

x = cos(t)
y = sin(t) + |cos(t)| 1/2
y — |x| 1/2 = sin(t)
(y — |x| 1/2) 2 + x 2 = 1
f(x,y) = (y — |x| 1/2) 2 + x 2 — 1 = 0


Шаг 3. От неявной функции к функции двух переменных. Функция цвета.

Имея на руках f(x,y), мы наконец можем осуществить свою мечту: нарисовать красивую цветную картинку. Для этого нам понадобится ещё одна функция: функция цвета. Она должна принимать вещественный аргумент r и возвращать целое значение от 0 до 255. Также желательно, чтобы она была монотонна на каждой полуоси и имела максимум в точке нуль. В качестве такой функции можно взять, например, эту:

c(r) = max(, 0)

Здесь 100 — «магическое число», позднее мы его в полном соответствии с «хорошим стилем программирования» заменим параметром.
Теперь для каждой точки (x,y) мы можем задать цвет как rgb(c(f(x,y)), 0, 0). Те точки, которые раньше принадлежали непосредственно графику «сердечка», стали ярко-красными (обратите внимание на неподвижный светлый контур на гифке). По мере удаления от графика цвет будет тускнеть, пока на некотором расстоянии от него не станет чёрным.

Шаг 4. Добавляем параметр, создаём анимацию.

Теперь заменим магическое число 100 параметром k. Новая функция цвета выглядит так:

c(r, k) = max(, 0)

Пусть k — это некоторая функция времени. Тогда для каждой точки изображения в каждый момент времени мы можем вычислить её цвет (что и является, по сути, математическим определением анимации). Сначала я хотел взять что-нибудь типа k(t) = 80(sin(t)+1). Потом, однако, я понял, что при большом количестве кадров гифка будет весить более 640 килобайт. С другой стороны, при малом количестве кадров нет смысла заморачиваться с аналитическим заданием k(t). В итоге, чтобы добиться пульсирования сердца, я последовательно присвоил k значения 80, 90, 100, 110, 120, 110, 100, 90, а затем изображения, сгенерированные для этих значений, объединил в циклический GIF. В общем-то, всё.


Заключение

К сожалению, мне не удалось устроить сюрприз своей девушке: она коварно подкралась ко мне сзади как раз тогда, когда я генерировал кадры для анимации. Тем не менее, ей понравилось.
Художники, дизайнеры и прочие товарищи с обострённым чувством прекрасного наверняка скажут, что сердечко могло бы быть и покрасивее. Отчасти я с ними соглашусь: картинка не лишена недостатков. Однако её истинная красота — в математической строгости. Моя девушка это оценила. А вы?

На эту статью меня подтолкнул интерес дочери к возможности описать изображение сердца формулами. Это не новая тема, она уже довольно «широко освещена» в интернете. Но простых и грамотных мануалов как сделать простое изображение сердца, к сожалению, я не нашёл. Либо в них использована алгебраическая форма с уравнениями шестого порядка, либо полярная система координат, а ни то ни друге не очень удобно для быстрого графического изображения функции в программах типа Calc или Excel. Так как, я думаю, это может оказаться интересным не только ей, я выкладываю небольшие соображения по этой части сюда, стараясь не очень сильно углубляться в математику, хотя как вы понимаете, совсем без неё тут не обойтись. Впрочем, базового школьного курса должно быть достаточно, чтобы понимать что происходит.


Кардиоида и маленькое занудство

Слово кардиоид — можно перевести с греческого как «имеющий вид сердца» (καρδία — сердце, εἶδος — вид). Первые упоминания об этой линии появились в начале XVIII века. Само же название этой линии в 1741 году дал Жан-Франсуа Сальвемини де Кастильон в одной из своих работ, посвящённых ей.
В полярных координатах её уравнение выглядит так: r = 2a(1 + cos(φ)). Построить её в LibreOffice Calc можно при помощи сетчатой диаграммы линии. Например, мы можем сделать столбец с углами от 0,017 до 6,283 радиана, и подставить это значение ссылкой вместо φ в формулу. Если вам сложно понимать радианы, можно использовать знакомые градусы от 1 до 360, но тогда вам нужно будет позаботиться о переводе их в радианы, когда вы будете записывать формулу. Константа a в уравнении — это радиус окружности, поэтому мы его можем приравнять к единице, или другими словами, в данном примере опустить. Формулы для таблицы будут выглядеть так: =2*(1+COS(A1)) — для входящих углов в радианах =2*(1+COS(RADIANS(A1))) — для входящих углов в градусах. Затем нам нужно выделить результирующий столбец (углы не нужно указывать в диаграмме, они заданы будут автоматически) и создать сетчатую диаграмму «только линии». Ось в сетчатых диаграммах в LibreOffice повернута вертикально, поэтому нам нужно развернуть диаграмму на 90 градусов против часовой стрелки. Выйдите из редактора диаграмм, нажмите на неё правой кнопкой мыши и выберите в контекстном меню «Положение и размер». На вкладке «Вращение» в поле «Угол поворота» поставьте значение 270 (360-90=270). Теперь у нас есть классическая кардиоида:


Как видите, в электронных таблицах типа Calc и Excel, построение линий в полярных координатах выглядит не очень эстетично для наших целей, да и делается это достаточно муторно, хотя такой способ тоже приемлем. Кроме того, если мы будем делать более сложные линии (например спирали), то нам придётся действительно изгаляться, чтобы добиться нужного результата. Поэтому, дальше я буду описывать только прямоугольную (Декартову) систему координат.
Алгебраическая форма записи кардиоиды в прямоугольных координатах:

Это тоже не очень красиво, кроме того, приведение алгебраических выражений к корням выше второй степени (в этом примере четвёртой) не всегда нам даёт простую и удобную для записи форму. Именно поэтому, часто используют параметрическую форму уравнения. Для кардиоиды параметрическая форма в прямоугольных координатах будет выглядеть следующим образом:

где a — константа (радиус окружности), а t — это параметр, который мы будем задавать.
Для того чтобы повернуть наше сердце в нормальное положение, можно просто поменять x и y местами.
я нашей цели такое решение достаточно приемлемо. Поэтому таблица будет выглядеть так: в первом столбце у нас будут цифры от 0 до 6,28 (=2*3,14), я сделал с шагом 0,1, во второй столбец мы помещаем формулу =2*SIN(A1)-SIN(2*A1) , а в третий =2*COS(A1)-COS(2*A1) и протягиваем их до конца столбца. Диаграмму будем строить на двух последних столбцах. Выделяем их, и вызвав мастер диаграмм, выбираем диаграмму XY (разброс) «Только линии». Легенда нам тут не нужна, поэтому на четвёртом шаге можно снять галочку «Показать легенду». После нажатия в мастере «Готово», щелкаем по линии правой кнопкой мыши и выбираем «Формат рядов данных…». На вкладке «Линии» в разделе «Цвет» выбираем желаемый цвет, я выбрал «Красный 3». После этого можно выйти из мастера диаграмм. Чтобы придать диаграмме правильные очертания её нужно немного уменьшить по горизонтали. Вот, что в итоге у меня получилось.

Форма кардиоиды встречается не редко, самыми известными вещами, наверное, являются микрофоны и антенны с кардиоидной направленностью. Такая форма позволяет увеличить помехоустойчивость и сохранить достаточно большой угол для работы. В природе форму кардиоиды можно увидеть в отраженном свете от предметов напоминающих вогнутые зеркала (например, кольцо).

Спираль Архимеда

Ещё одна классическая и хорошо известная кривая, при помощи которой можно изобразить сердце, — это спираль Архимеда. Спираль Архимеда была описана, как вы понимаете, Архимедом в III веке до н.э., хотя достаточно точное её воспроизведение было и раньше. Формула спирали в прямоугольных координатах в параметрическом виде выглядит следующим образом:


Спираль, это естественно только один виток, поэтому для наших целей нам нужно будет взять две спирали: одну, закрученную по часовой стрелке, и второю, её близняшку, закрученную против часовой. Поэтому, множество на котором нам нужно будет строить спираль -3,5π ≤ t ≤ 3,5π .
Заполним столбец A числами от -11 до 11 (≈3,5*3,14) с шагом 0,1. В первую ячейку второго столбца введём формулу для x: =A1*COS(A1) , в первую ячейку третьего столбца введём формулу для y: =A1*SIN(A1) , протянем их до конца множества. Теперь нам осталось только сделать график для нашей кривой. Выделяем второй и третий столбец и запускаем мастер диаграмм, выбираем диаграмму XY(разброс), убираем легенду и перекрашиваем линию, то есть, шаги те же, что и для предыдущего графика. В центре мы получили маленькое красивое сердечко с подвеской:

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

Эвольвента окружности

Так как я обещал в начале статьи особо не занудствовать математическими терминами и выводами, то скажем просто: Эвольвента окружности, в данном контексте, представляет обобщённую форму спирали Архимеда:). Если вам интересны трансцендентальные кривые и их свойства, я рекомендую обратиться к книге А. А. Совелова «Плоские кривые. Систематика, свойства, применения», а тут я постараюсь продолжить повествование ненавязчиво и без лишних углублений в математику.
Параметрическая форма в прямоугольных координатах для эвольвенты окружности выглядит следующим образом:


В этой формуле у нас появилось 2 новых параметра: R и h. Не тяжело догадаться, что при h &lt 0 и h = -R (например, R=1, h=-1) мы получим уравнение спирали Архимеда с иксами в обратном порядке для того случая, который был представлен выше. «Играя» этими двумя параметрами, мы можем изменять вид линии, от абсолютного круга, до различных спиралей. Для нас же, наверное, будет интересен случай когда R = 1, а h = 0. То есть уравнение примет вид

Если вы читали статью с самого начала, то для вас не будет сложностью построить диаграмму. Множество, на котором я предлагаю строить ее с заданными параметрами: от -10,9 до 10,9. Итоговый вид её будет следующий:

Если менять параметры R и h, нижние «хвостики» у спиралей будут менять своё положение от пересечения, до образования разрыва между ними, поэтому найдя понравившуюся вам форму, придётся немного подкорректировать диапазон множества на котором она построена. Оставляю эту задачу вам.
Эвольвента окружности часто используется при проектировании зубчатых колёс, также эвольвенту можно получить при сматывании нити с цилиндрической поверхности.
Вообще, спирали очень интересная тема, и не только с точки зрения геометрии, но и потому, что они постоянно встречаются в природе, примерами могут быть цветок подсолнуха, сосновая шишка и многое другое.


Бокаловидное сердце

Это изображение сердца было предложено H. Dascanio в 2003 году. К сожалению, самые ранние источники указывают, что это была личная переписка, и более подробная информация появления этого сердца останется, наверное, загадкой. Формула, предложенная Dascanio, выглядит вот так:

В этой формуле есть натуральный логарифм и модуль числа. В записи LibreOffice Calc эти формулы буду выглядеть для x =SIN(A2)*COS(A2)*LN(ABS(A2)) и для y =(ABS(A2)^(1/3))*(COS(A2)^0,5) . Диапазон значений параметра t должен быть от -1 до 1. При построении этого сердца есть один нюанс, хотя в общем, достаточным шагом будет 0,05, приблизительно с -0,2 и до 0,2 приближаясь к нулю нужно шаг уменьшать, создавая тем самым лучшее разрешение графика на этом интервале (в прилагаемом файле есть пример). В остальном это сердце строится как и предыдущие. Изображение, которое мы должны получить, выглядит так:

Вытянутое сердце

Ещё одним примером приближенного изображения сердца может быть найденное мной на просторах интернета (к своему сожалению, не могу вспомнить источник, если вы знаете, сообщите, пожалуйста) форма, достаточно близкая к сердцу, но немного вытянутая по вертикали. Его формула выглядит следующим образом

Строить его нужно на диапазоне от -π до π с шагом 0,01. Сердце получается немного продолговатым, но достаточно приемлемым по форме, если сравнивать с предыдущим вариантом:


Маленькое замечание, так как в этой диаграмме точки по x стоят у нас достаточно часто, то мы можем отсортировать их по иксам. В этом случае мы получим закрашенное сердечко:

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

Классический вид сердца

Эта формула сердца была предложена Georg-Johann, одним из редактором Wikipedia, в июле 2009 года. Насколько я понял, оно было создано путем интерполяции.
На мой взгляд, из всего что я видел, подготавливаясь к этой статье, этот вариант является самым правильным и знакомым. Хотя, как говорится в поговорке: «на вкус и цвет все фломастеры разные». Формула в параметрическом виде для полярных координат этого сердца выглядит следующим образом:

В LibreOffice Calc мы его строим так же, как и предыдущие, только диапазон будет от 0 до π, шаг я предлагаю сделать 0,1. Во втором столбце для координаты х вводим формулу =16*SIN(A1)^3 , а в третий столбец для y =13*COS(A1)-5*COS(2*A1)-2*COS(3*A1)-COS(4*A1) . После чего выделяем второй и третий столбец и, как и в предыдущих случаях, строим диаграмму.

прилагаемом файле

Формула любви или вместо заключения

Кажется, я сумел сдержать свое обещание — не занудствовать. Я пишу эту статью накануне 14 февраля, дня, который многие называют днем влюблённых, и хотел бы добавить пару слов. И простое изображение сердца, и формула, рисующая его на графике, никогда не заменит вашу любовь к близкому, так же как химическая формула никогда не заменит нам воду. Используйте их для того, чтобы порадовать и удивить любимого человека. Но в настоящей формуле любви должно обязательно присутствовать уважение и понимание, причем с обеих сторон и, наверное, в первую очередь, с вашей. Но эти два параметра относятся уже к алгебре нечетких чисел, а значит выходят далеко за рамки этой статьи. Приятного всем праздника и несгораемой любви в ваших сердцах.

13 февраля 2013 в 11:28

  • Математика

Один и один — получается два. Все одиноки — здесь ты, а там я.
Люди всегда одиноки вдвойне сами с собою наедине.
Если б их что-то сблизить могло, сразу б из двух получилось одно.
Пусть математика сложит сердца — чтобы проделать нам путь до конца.

Уильямс Джей, «Герои Ниоткуда»

Вероятно, пост следовало назвать «Как нарисовать анимированное сердечко ко дню Святого Валентина, используя математику не по назначению». Я отверг это название в пользу более поэтичного: как-никак, надвигается замечательный романтический праздник, который мы, айтишники и прочие нёрды, должны встретить во всеоружии. Я сразу покажу вам результат, а под хабракатом будет много букв о том, как я этого результата достиг.

Дисклеймер

Я осознаю, что красивое мигающее сердечко можно сделать и без малейшего знания математики. Но разве это интересно?

Шаг 1. Параметризуем сердечко.

Для начала нам нужен математический объект, хотя бы отдалённо напоминающий сердечко. К счастью, для меня этот шаг был тривиален: ещё пару лет назад я обнаружил замечательную формулу как раз для такого случая (из эстетических соображений график на рисунке растянут по горизонтали, на самом деле он должен умещаться между -1 и 1).

График функции в виде сердца

Формула была обнаружена из следующий соображений: возьмём обыкновенную окружность (x = cos(t); y = sin(t)) и представим, что она состоит из желе, будучи при этом жёстко прикреплена к оси ординат. Теперь «подуем» на неё снизу: прибавим к координате игрек некую функцию w(x) = w(x(t)), равную нулю при x=0, монотонно возрастающую при x>0 и чётную по x. После такого «дуновения» половинки окружности сместятся вверх, образуя «выпуклости» сердечка, а благодаря жёсткому креплению к оси Y образуется нижний «хвостик» и верхняя «вмятинка». В данном случае w(x(t)) = |x| 1/2 = |cos(t)| 1/2 . Можете самостоятельно попробовать другую «функцию дуновения» и посмотреть, что из этого выйдет.

Шаг 2. От параметрического задания к неявной функции.

Для нашего коварного плана параметрическое уравнение (x(t); y(t)) неудобно; предпочтительнее было бы неявное задание вида f(x, y) = 0. Что ж, всё в наших руках. Итак, брюки превращаются:

x = cos(t)
y = sin(t) + |cos(t)| 1/2
y — |x| 1/2 = sin(t)
(y — |x| 1/2) 2 + x 2 = 1
f(x,y) = (y — |x| 1/2) 2 + x 2 — 1 = 0

Шаг 3. От неявной функции к функции двух переменных. Функция цвета.

Имея на руках f(x,y), мы наконец можем осуществить свою мечту: нарисовать красивую цветную картинку. Для этого нам понадобится ещё одна функция: функция цвета. Она должна принимать вещественный аргумент r и возвращать целое значение от 0 до 255. Также желательно, чтобы она была монотонна на каждой полуоси и имела максимум в точке нуль. В качестве такой функции можно взять, например, эту:

c(r) = max(, 0)

Здесь 100 — «магическое число», позднее мы его в полном соответствии с «хорошим стилем программирования» заменим параметром.
Теперь для каждой точки (x,y) мы можем задать цвет как rgb(c(f(x,y)), 0, 0). Те точки, которые раньше принадлежали непосредственно графику «сердечка», стали ярко-красными (обратите внимание на неподвижный светлый контур на гифке). По мере удаления от графика цвет будет тускнеть, пока на некотором расстоянии от него не станет чёрным.

Шаг 4. Добавляем параметр, создаём анимацию.

Теперь заменим магическое число 100 параметром k. Новая функция цвета выглядит так:

c(r, k) = max(, 0)

Пусть k — это некоторая функция времени. Тогда для каждой точки изображения в каждый момент времени мы можем вычислить её цвет (что и является, по сути, математическим определением анимации). Сначала я хотел взять что-нибудь типа k(t) = 80(sin(t)+1). Потом, однако, я понял, что при большом количестве кадров гифка будет весить более 640 килобайт. С другой стороны, при малом количестве кадров нет смысла заморачиваться с аналитическим заданием k(t). В итоге, чтобы добиться пульсирования сердца, я последовательно присвоил k значения 80, 90, 100, 110, 120, 110, 100, 90, а затем изображения, сгенерированные для этих значений, объединил в циклический GIF. В общем-то, всё.

Заключение

К сожалению, мне не удалось устроить сюрприз своей девушке: она коварно подкралась ко мне сзади как раз тогда, когда я генерировал кадры для анимации. Тем не менее, ей понравилось.
Художники, дизайнеры и прочие товарищи с обострённым чувством прекрасного наверняка скажут, что сердечко могло бы быть и покрасивее. Отчасти я с ними соглашусь: картинка не лишена недостатков. Однако её истинная красота — в математической строгости. Моя девушка это оценила. А вы?

На эту статью меня подтолкнул интерес дочери к возможности описать изображение сердца формулами. Это не новая тема, она уже довольно «широко освещена» в интернете. Но простых и грамотных мануалов как сделать простое изображение сердца, к сожалению, я не нашёл. Либо в них использована алгебраическая форма с уравнениями шестого порядка, либо полярная система координат, а ни то ни друге не очень удобно для быстрого графического изображения функции в программах типа Calc или Excel. Так как, я думаю, это может оказаться интересным не только ей, я выкладываю небольшие соображения по этой части сюда, стараясь не очень сильно углубляться в математику, хотя как вы понимаете, совсем без неё тут не обойтись. Впрочем, базового школьного курса должно быть достаточно, чтобы понимать что происходит.

Кардиоида и маленькое занудство

Слово кардиоид — можно перевести с греческого как «имеющий вид сердца» (καρδία — сердце, εἶδος — вид). Первые упоминания об этой линии появились в начале XVIII века. Само же название этой линии в 1741 году дал Жан-Франсуа Сальвемини де Кастильон в одной из своих работ, посвящённых ей.
В полярных координатах её уравнение выглядит так: r = 2a(1 + cos(φ)). Построить её в LibreOffice Calc можно при помощи сетчатой диаграммы линии. Например, мы можем сделать столбец с углами от 0,017 до 6,283 радиана, и подставить это значение ссылкой вместо φ в формулу. Если вам сложно понимать радианы, можно использовать знакомые градусы от 1 до 360, но тогда вам нужно будет позаботиться о переводе их в радианы, когда вы будете записывать формулу. Константа a в уравнении — это радиус окружности, поэтому мы его можем приравнять к единице, или другими словами, в данном примере опустить. Формулы для таблицы будут выглядеть так: =2*(1+COS(A1)) — для входящих углов в радианах =2*(1+COS(RADIANS(A1))) — для входящих углов в градусах. Затем нам нужно выделить результирующий столбец (углы не нужно указывать в диаграмме, они заданы будут автоматически) и создать сетчатую диаграмму «только линии». Ось в сетчатых диаграммах в LibreOffice повернута вертикально, поэтому нам нужно развернуть диаграмму на 90 градусов против часовой стрелки. Выйдите из редактора диаграмм, нажмите на неё правой кнопкой мыши и выберите в контекстном меню «Положение и размер». На вкладке «Вращение» в поле «Угол поворота» поставьте значение 270 (360-90=270). Теперь у нас есть классическая кардиоида:

Как видите, в электронных таблицах типа Calc и Excel, построение линий в полярных координатах выглядит не очень эстетично для наших целей, да и делается это достаточно муторно, хотя такой способ тоже приемлем. Кроме того, если мы будем делать более сложные линии (например спирали), то нам придётся действительно изгаляться, чтобы добиться нужного результата. Поэтому, дальше я буду описывать только прямоугольную (Декартову) систему координат.
Алгебраическая форма записи кардиоиды в прямоугольных координатах:

Это тоже не очень красиво, кроме того, приведение алгебраических выражений к корням выше второй степени (в этом примере четвёртой) не всегда нам даёт простую и удобную для записи форму. Именно поэтому, часто используют параметрическую форму уравнения. Для кардиоиды параметрическая форма в прямоугольных координатах будет выглядеть следующим образом:

где a — константа (радиус окружности), а t — это параметр, который мы будем задавать.
Для того чтобы повернуть наше сердце в нормальное положение, можно просто поменять x и y местами. Для нашей цели такое решение достаточно приемлемо. Поэтому таблица будет выглядеть так: в первом столбце у нас будут цифры от 0 до 6,28 (=2*3,14), я сделал с шагом 0,1, во второй столбец мы помещаем формулу =2*SIN(A1)-SIN(2*A1) , а в третий =2*COS(A1)-COS(2*A1) и протягиваем их до конца столбца. Диаграмму будем строить на двух последних столбцах. Выделяем их, и вызвав мастер диаграмм, выбираем диаграмму XY (разброс) «Только линии». Легенда нам тут не нужна, поэтому на четвёртом шаге можно снять галочку «Показать легенду». После нажатия в мастере «Готово», щелкаем по линии правой кнопкой мыши и выбираем «Формат рядов данных…». На вкладке «Линии» в разделе «Цвет» выбираем желаемый цвет, я выбрал «Красный 3». После этого можно выйти из мастера диаграмм. Чтобы придать диаграмме правильные очертания её нужно немного уменьшить по горизонтали. Вот, что в итоге у меня получилось.

Форма кардиоиды встречается не редко, самыми известными вещами, наверное, являются микрофоны и антенны с кардиоидной направленностью. Такая форма позволяет увеличить помехоустойчивость и сохранить достаточно большой угол для работы. В природе форму кардиоиды можно увидеть в отраженном свете от предметов напоминающих вогнутые зеркала (например, кольцо).

Спираль Архимеда

Ещё одна классическая и хорошо известная кривая, при помощи которой можно изобразить сердце, — это спираль Архимеда. Спираль Архимеда была описана, как вы понимаете, Архимедом в III веке до н.э., хотя достаточно точное её воспроизведение было и раньше. Формула спирали в прямоугольных координатах в параметрическом виде выглядит следующим образом:

Спираль, это естественно только один виток, поэтому для наших целей нам нужно будет взять две спирали: одну, закрученную по часовой стрелке, и второю, её близняшку, закрученную против часовой. Поэтому, множество на котором нам нужно будет строить спираль -3,5π ≤ t ≤ 3,5π .
Заполним столбец A числами от -11 до 11 (≈3,5*3,14) с шагом 0,1. В первую ячейку второго столбца введём формулу для x: =A1*COS(A1) , в первую ячейку третьего столбца введём формулу для y: =A1*SIN(A1) , протянем их до конца множества. Теперь нам осталось только сделать график для нашей кривой. Выделяем второй и третий столбец и запускаем мастер диаграмм, выбираем диаграмму XY(разброс), убираем легенду и перекрашиваем линию, то есть, шаги те же, что и для предыдущего графика. В центре мы получили маленькое красивое сердечко с подвеской:

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

Эвольвента окружности

Так как я обещал в начале статьи особо не занудствовать математическими терминами и выводами, то скажем просто: Эвольвента окружности, в данном контексте, представляет обобщённую форму спирали Архимеда:). Если вам интересны трансцендентальные кривые и их свойства, я рекомендую обратиться к книге А. А. Совелова «Плоские кривые. Систематика, свойства, применения», а тут я постараюсь продолжить повествование ненавязчиво и без лишних углублений в математику.
Параметрическая форма в прямоугольных координатах для эвольвенты окружности выглядит следующим образом:

В этой формуле у нас появилось 2 новых параметра: R и h. Не тяжело догадаться, что при h &lt 0 и h = -R (например, R=1, h=-1) мы получим уравнение спирали Архимеда с иксами в обратном порядке для того случая, который был представлен выше. «Играя» этими двумя параметрами, мы можем изменять вид линии, от абсолютного круга, до различных спиралей. Для нас же, наверное, будет интересен случай когда R = 1, а h = 0. То есть уравнение примет вид

Если вы читали статью с самого начала, то для вас не будет сложностью построить диаграмму. Множество, на котором я предлагаю строить ее с заданными параметрами: от -10,9 до 10,9. Итоговый вид её будет следующий:

Если менять параметры R и h, нижние «хвостики» у спиралей будут менять своё положение от пересечения, до образования разрыва между ними, поэтому найдя понравившуюся вам форму, придётся немного подкорректировать диапазон множества на котором она построена. Оставляю эту задачу вам.
Эвольвента окружности часто используется при проектировании зубчатых колёс, также эвольвенту можно получить при сматывании нити с цилиндрической поверхности.
Вообще, спирали очень интересная тема, и не только с точки зрения геометрии, но и потому, что они постоянно встречаются в природе, примерами могут быть цветок подсолнуха, сосновая шишка и многое другое.

Бокаловидное сердце

Это изображение сердца было предложено H. Dascanio в 2003 году. К сожалению, самые ранние источники указывают, что это была личная переписка, и более подробная информация появления этого сердца останется, наверное, загадкой. Формула, предложенная Dascanio, выглядит вот так:

В этой формуле есть натуральный логарифм и модуль числа. В записи LibreOffice Calc эти формулы буду выглядеть для x =SIN(A2)*COS(A2)*LN(ABS(A2)) и для y =(ABS(A2)^(1/3))*(COS(A2)^0,5) . Диапазон значений параметра t должен быть от -1 до 1. При построении этого сердца есть один нюанс, хотя в общем, достаточным шагом будет 0,05, приблизительно с -0,2 и до 0,2 приближаясь к нулю нужно шаг уменьшать, создавая тем самым лучшее разрешение графика на этом интервале (в прилагаемом файле есть пример). В остальном это сердце строится как и предыдущие. Изображение, которое мы должны получить, выглядит так:

Вытянутое сердце

Ещё одним примером приближенного изображения сердца может быть найденное мной на просторах интернета (к своему сожалению, не могу вспомнить источник, если вы знаете, сообщите, пожалуйста) форма, достаточно близкая к сердцу, но немного вытянутая по вертикали. Его формула выглядит следующим образом

Строить его нужно на диапазоне от -π до π с шагом 0,01. Сердце получается немного продолговатым, но достаточно приемлемым по форме, если сравнивать с предыдущим вариантом:

Маленькое замечание, так как в этой диаграмме точки по x стоят у нас достаточно часто, то мы можем отсортировать их по иксам. В этом случае мы получим закрашенное сердечко:

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

Классический вид сердца

Эта формула сердца была предложена Georg-Johann, одним из редактором Wikipedia, в июле 2009 года. Насколько я понял, оно было создано путем интерполяции.
На мой взгляд, из всего что я видел, подготавливаясь к этой статье, этот вариант является самым правильным и знакомым. Хотя, как говорится в поговорке: «на вкус и цвет все фломастеры разные». Формула в параметрическом виде для полярных координат этого сердца выглядит следующим образом:

В LibreOffice Calc мы его строим так же, как и предыдущие, только диапазон будет от 0 до π, шаг я предлагаю сделать 0,1. Во втором столбце для координаты х вводим формулу =16*SIN(A1)^3 , а в третий столбец для y =13*COS(A1)-5*COS(2*A1)-2*COS(3*A1)-COS(4*A1) . После чего выделяем второй и третий столбец и, как и в предыдущих случаях, строим диаграмму.

прилагаемом файле

Формула любви или вместо заключения

Кажется, я сумел сдержать свое обещание — не занудствовать. Я пишу эту статью накануне 14 февраля, дня, который многие называют днем влюблённых, и хотел бы добавить пару слов. И простое изображение сердца, и формула, рисующая его на графике, никогда не заменит вашу любовь к близкому, так же как химическая формула никогда не заменит нам воду. Используйте их для того, чтобы порадовать и удивить любимого человека. Но в настоящей формуле любви должно обязательно присутствовать уважение и понимание, причем с обеих сторон и, наверное, в первую очередь, с вашей. Но эти два параметра относятся уже к алгебре нечетких чисел, а значит выходят далеко за рамки этой статьи. Приятного всем праздника и несгораемой любви в ваших сердцах.

Как вставить математические формулы на сайт?

Если нужно когда-никогда добавлять одну-две математические формулы на веб-страницу, то проще всего сделать это, как описано в статье : математические формулы легко вставляются на сайт в виде картинок, которые автоматически генерирует Вольфрам Альфа. Кроме простоты, этот универсальный способ поможет улучшить видимость сайта в поисковых системах. Он работает давно (и, думаю, будет работать вечно), но морально уже устарел.

Если же вы постоянно используете математические формулы на своем сайте, то я рекомендую вам использовать MathJax — специальную библиотеку JavaScript, которая отображает математические обозначения в веб-браузерах с использованием разметки MathML, LaTeX или ASCIIMathML.

Есть два способа, как начать использовать MathJax: (1) при помощи простого кода можно быстро подключить к вашему сайту скрипт MathJax, который будет в нужный момент автоматически подгружаться с удаленного сервера (список серверов ); (2) закачать скрипт MathJax с удаленного сервера на свой сервер и подключить ко всем страницам своего сайта. Второй способ — более более сложный и долгий — позволит ускорить загрузку страниц вашего сайта, и если родительский сервер MathJax по каким-то причинам станет временно недоступен, это никак не повлияет на ваш собственный сайт. Несмотря на эти преимущества, я выбрал первый способ, как более простой, быстрый и не требующий технических навыков. Следуйте моему примеру, и уже через 5 минут вы сможете использовать все возможности MathJax на своем сайте.

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

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

Подключить MathJax проще всего в Blogger или WordPress: в панели управления сайтом добавьте виджет, предназначенный для вставки стороннего кода JavaScript, скопируйте в него первый или второй вариант кода загрузки, представленного выше, и разместите виджет поближе к началу шаблона (кстати, это вовсе не обязательно, поскольку скрипт MathJax загружается асинхронно). Вот и все. Теперь изучите синтаксис разметки MathML, LaTeX и ASCIIMathML, и вы готовы вставлять математические формулы на веб-страницы своего сайта.

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

Итеративный алгоритм построения губки Менгера достаточно простой: исходный куб со стороной 1 делится плоскостями, параллельными его граням, на 27 равных кубов. Из него удаляются один центральный куб и 6 прилежащих к нему по граням кубов. Получается множество, состоящее из 20 оставшихся меньших кубов. Поступая так же с каждым из этих кубов, получим множество, состоящее уже из 400 меньших кубов. Продолжая этот процесс бесконечно, получим губку Менгера.

Источник: alluz.ru

Один и один — получается два. Все одиноки — здесь ты, а там я.
Люди всегда одиноки вдвойне сами с собою наедине.
Если б их что-то сблизить могло, сразу б из двух получилось одно.
Пусть математика сложит сердца — чтобы проделать нам путь до конца.

Уильямс Джей, «Герои Ниоткуда»

Вероятно, пост следовало назвать «Как нарисовать анимированное сердечко ко дню Святого Валентина, используя математику не по назначению». Я отверг это название в пользу более поэтичного: как-никак, надвигается замечательный романтический праздник, который мы, айтишники и прочие нёрды, должны встретить во всеоружии. Я сразу покажу вам результат, а под хабракатом будет много букв о том, как я этого результата достиг.

image

Дисклеймер

Я осознаю, что красивое мигающее сердечко можно сделать и без малейшего знания математики. Но разве это интересно?

Шаг 1. Параметризуем сердечко.

Для начала нам нужен математический объект, хотя бы отдалённо напоминающий сердечко. К счастью, для меня этот шаг был тривиален: ещё пару лет назад я обнаружил замечательную формулу как раз для такого случая (из эстетических соображений график на рисунке растянут по горизонтали, на самом деле он должен умещаться между -1 и 1).

image

Формула была обнаружена из следующий соображений: возьмём обыкновенную окружность (x = cos(t); y = sin(t)) и представим, что она состоит из желе, будучи при этом жёстко прикреплена к оси ординат. Теперь «подуем» на неё снизу: прибавим к координате игрек некую функцию w(x) = w(x(t)), равную нулю при x=0, монотонно возрастающую при x>0 и чётную по x. После такого «дуновения» половинки окружности сместятся вверх, образуя «выпуклости» сердечка, а благодаря жёсткому креплению к оси Y образуется нижний «хвостик» и верхняя «вмятинка». В данном случае w(x(t)) = |x|1/2 = |cos(t)|1/2. Можете самостоятельно попробовать другую «функцию дуновения» и посмотреть, что из этого выйдет.

Шаг 2. От параметрического задания к неявной функции.

Для нашего коварного плана параметрическое уравнение (x(t); y(t)) неудобно; предпочтительнее было бы неявное задание вида f(x, y) = 0. Что ж, всё в наших руках. Итак, брюки превращаются:

x = cos(t)
y = sin(t) + |cos(t)|1/2
y — |x|1/2 = sin(t)
(y — |x|1/2)2 + x2 = 1
f(x,y) = (y — |x|1/2)2 + x2 — 1 = 0

Шаг 3. От неявной функции к функции двух переменных. Функция цвета.

Имея на руках f(x,y), мы наконец можем осуществить свою мечту: нарисовать красивую цветную картинку. Для этого нам понадобится ещё одна функция: функция цвета. Она должна принимать вещественный аргумент r и возвращать целое значение от 0 до 255. Также желательно, чтобы она была монотонна на каждой полуоси и имела максимум в точке нуль. В качестве такой функции можно взять, например, эту:

c(r) = max([255 — 100*|r|], 0)

Здесь 100 — «магическое число», позднее мы его в полном соответствии с «хорошим стилем программирования» заменим параметром.
Теперь для каждой точки (x,y) мы можем задать цвет как rgb(c(f(x,y)), 0, 0). Те точки, которые раньше принадлежали непосредственно графику «сердечка», стали ярко-красными (обратите внимание на неподвижный светлый контур на гифке). По мере удаления от графика цвет будет тускнеть, пока на некотором расстоянии от него не станет чёрным.

Шаг 4. Добавляем параметр, создаём анимацию.

Теперь заменим магическое число 100 параметром k. Новая функция цвета выглядит так:

c(r, k) = max([255 — k*|r|], 0)

Пусть k — это некоторая функция времени. Тогда для каждой точки изображения в каждый момент времени мы можем вычислить её цвет (что и является, по сути, математическим определением анимации). Сначала я хотел взять что-нибудь типа k(t) = 80(sin(t)+1). Потом, однако, я понял, что при большом количестве кадров гифка будет весить более 640 килобайт. С другой стороны, при малом количестве кадров нет смысла заморачиваться с аналитическим заданием k(t). В итоге, чтобы добиться пульсирования сердца, я последовательно присвоил k значения 80, 90, 100, 110, 120, 110, 100, 90, а затем изображения, сгенерированные для этих значений, объединил в циклический GIF. В общем-то, всё.

Заключение

К сожалению, мне не удалось устроить сюрприз своей девушке: она коварно подкралась ко мне сзади как раз тогда, когда я генерировал кадры для анимации. Тем не менее, ей понравилось.
Художники, дизайнеры и прочие товарищи с обострённым чувством прекрасного наверняка скажут, что сердечко могло бы быть и покрасивее. Отчасти я с ними соглашусь: картинка не лишена недостатков. Однако её истинная красота — в математической строгости. Моя девушка это оценила. А вы?

Источник: habr.com

Реши систему уравнений: {4x−5y=5 2x+10y=25 Ответ: ( … ; … )

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.