Маурер Роуз - Maurer rose

В геометрия, концепция Маурер Роуз был представлен Питером М. Маурером в его статье под названием Роза есть роза ...[1]. Роза Маурера состоит из нескольких линий, соединяющих некоторые точки на кривая розы.


Маурер вырос с п = 7 и d = 29

Определение

Позволять р = грех () быть Роза в полярная система координат, куда п положительное целое число. Роза имеет п лепестки, если п нечетное, а 2п лепестки, если п даже.

Затем мы берем 361 балл за розу:

(грех (нк), k) (k = 0, d, 2d, 3d, ..., 360d),

куда d положительное целое число, а углы лежат в градусы, нет радианы.

Объяснение

А Маурер Роуз розы р = грех () состоит из 360 линий, последовательно соединяющих указанные выше 361 точку. Таким образом, роза Маурера - это ломаная кривая с вершины на розе.

Розу Маурера можно охарактеризовать как закрытый путь в полярная плоскость. Путешественник начинает путешествие от начала координат (0, 0) и идет по линии до точки (sin (nd), d). Затем, во втором отрезке пути, пешеход идет по линии к следующей точке (sin (п·2d), 2d), и так далее. Наконец, на последнем этапе пути пешеход идет по линии от (sin (п·359d), 359d) до конечной точки, (sin (п·360d), 360d). Весь маршрут - это роза Маурера из розы р = грех (). Роза Маурера - это замкнутая кривая с начальной точки (0, 0) и конечной точки (sin (п·360d), 360d), совпадают.

На следующем рисунке показана эволюция розы Маурера (п = 2, d = 29°).

Эволюция Maurer Rose.svg

Изображений

Ниже приведены некоторые розы Маурера, нарисованные с некоторыми значениями n и d:

Maurer roses.svg

Примеры синтаксиса

Код JavaScript

// Шаблон, должно быть где-то, верно?документ.тело.innerHTML = ''; // Удаляет содержимое страницы на случай, если вы просто хотите вставить это в консоль на новой вкладке или где угодно.const холст = документ.createElement('холст');холст.ширина = 800;холст.высота = 800;документ.тело.appendChild(холст);const ctx = холст.getContext('2d');// Хорошо, пора подняться.позволять п = 6, d = 71; // Это может быть любая комбинация, но эта хорошая.ctx.переведите(холст.ширина / 2, холст.высота / 2);ctx.beginPath();ctx.ширина линии = 0.5;ctx.strokeStyle = 'синий';за (позволять тета = 0; тета <= 360 / * мы работаем с градусами, помните? * /; тета++){    позволять k = тета * d * Математика.ЧИСЛО ПИ / 180;    позволять р = 300 * Математика.грех(п * k);    позволять Икс = -р * Математика.потому что(k);    позволять у = -р * Математика.грех(k);    ctx.lineTo(Икс, у);    ctx.moveTo(Икс, у);}ctx.Инсульт();ctx.beginPath();ctx.ширина линии = 4;ctx.strokeStyle = 'красный';за (позволять тета = 0; тета <= 360; тета++){    позволять k = тета * Математика.ЧИСЛО ПИ / 180;    позволять р = 300 * Математика.грех(п * k);    позволять Икс = р * Математика.потому что(k);    позволять у = -р * Математика.грех(k);    ctx.lineTo(Икс, у);    ctx.moveTo(Икс, у);}ctx.Инсульт();

Код Java

Есть способ лучше сделать это. Но это целый Java-файл, который рисует розу Маурера.

импорт javax.swing. *;импорт java.awt. *;импорт java.awt.event. *;учебный класс Рендерер расширяет JPanel {    защищенный пустота paintComponent(Графика грамм) {        Маурер.Maurer.рисовать((Графика2D) грамм);    }}общественный учебный класс Маурер орудия ActionListener {    статический Маурер Maurer;    статический окончательный int ширина = 800, высота = 800;    Рендерер рендерер = новый Рендерер();    статический двойной п = 6, d = 71;    общественный Маурер() {        JFrame Рамка = новый JFrame("maurer rose");        Рамка.setSize(ширина, высота);        Рамка.Добавить(рендерер);        Рамка.setDefaultCloseOperation(3);        Рамка.setResizable(ложный);        Рамка.setVisible(истинный);        Таймер таймер = новый Таймер(0, это);        таймер.Начните();    }    общественный пустота действие выполнено(ActionEvent evt) {        рендерер.перекрашивать();    }    общественный пустота рисовать(Графика2D грамм) {        грамм.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        грамм.setColor(Цвет.белый);        грамм.fillRect(0, 0, ширина, высота);        грамм.setColor(новый Цвет(0, 0, 255, 100));        грамм.переведите(ширина / 2, высота / 2);        двойной Икс = 0, у = 0;        за (int тета = 0; тета <= 360; тета++) {            двойной k = тета * d * Математика.ЧИСЛО ПИ / 180;            двойной р = 300 * Математика.грех(п * k);            двойной newX = р * Математика.потому что(k);            двойной новыйY = р * Математика.грех(k);            грамм.drawLine((int)Икс, (int)у, (int)newX, (int)новыйY);            Икс = newX;            у = новыйY;        }        грамм.setColor(Цвет.красный);        грамм.setStroke(новый BasicStroke(4));        за (int тета = 0; тета <= 360; тета++) {            двойной k = тета * Математика.ЧИСЛО ПИ / 180;            двойной р = 300 * Математика.грех(п * k);            двойной newX = р * Математика.потому что(k);            двойной новыйY = р * Математика.грех(k);            грамм.drawLine((int)Икс, (int)у, (int)newX, (int)новыйY);            Икс = newX;            у = новыйY;        }    }    общественный статический пустота главный(Нить[] аргументы) {        Maurer = новый Маурер();    }}

Код Visual Basic 6

 n = 7; d = 29 Xo = 400 'Начало Yo = 350 pi = 22/7 DrawWidth = 1 Для theta = 0 До 360 k = theta * d * pi / 180 r = 300 * Sin (n * k) x = Xo - r * Cos (k) y = Yo - r * Sin (k) Line - (x, y), QBColor (9) Next DrawWidth = 2 Для theta = 0 До 360 k = theta * pi / 180 r = 300 * Sin (n * k) x = Xo + r * Cos (k) y = Yo - r * Sin (k) Line - (x, y), QBColor (12) Далее

Код обработки

плавать п = 6;плавать d = 71;размер(800, 800);noFill();фон(255);beginShape();Инсульт(0, 0, 255);ход Вес(0.5);за(int тета = 0; тета <= 360; тета++){  плавать k = тета * d * ЧИСЛО ПИ / 180;  плавать р = 300 * грех(п * k);  плавать Икс = р * потому что(k) + ширина/2;  плавать у = р * грех(k) + высота/2;  вершина(Икс, у);}endShape();beginShape();Инсульт(255, 0, 0);ходВес(4);за(int тета = 0; тета <= 360; тета++){  плавать k = тета * ЧИСЛО ПИ / 180;  плавать р = 300 * грех(п * k);  плавать Икс = р * потому что(k) + ширина/2;  плавать у = р * грех(k) + высота/2;  вершина(Икс, у);}endShape();

Код p5.js

/*p5.js - это порт обработки, который можно запустить в браузере. Перейдя на editor.p5js.org, очистив там код, вставив его и нажав кнопку Play, вы можете запустить его. Был добавлен пользовательский интерфейс, чтобы они могли выбирать значения «n» и «d», а также изменять формулу с sin на любую из 6 основных триггерных функций (Примечание: только синусоидальная функция является допустимой функцией Maurer Rose) * /позволять п;позволять d;функция настраивать() {  createCanvas(400, 400);  // устанавливает ползунок для n  слайдерЛепестки = createSlider(1,100,6);  слайдерЛепестки.стиль('ширина', '300px');  слайдерЛепестки.позиция(30,высота+5);    // устанавливает ползунок для d  слайдерD = createSlider(1,360,71);  слайдерD.стиль('ширина', '300px');  слайдерD.позиция(30,высота+30);    // настраиваем параметры радио для формулы угла  angleOptions = createRadio();  angleOptions.позиция(10, 460);  angleOptions.вариант('грех');  angleOptions.вариант('cos');  angleOptions.вариант('загар');  angleOptions.вариант('сек');  angleOptions.вариант('csc');  angleOptions.вариант('детская кроватка');  angleOptions.стиль('ширина', '60px');    // уменьшает количество вычислений, которые должен выполнять ваш браузер  частота кадров(3);}функция рисовать() {  п = слайдерЛепестки.ценить();  d = слайдерD.ценить();  фон(255);  толкать();  noFill();  beginShape();  Инсульт(0, 0, 255);  ходВес(0.5);  angleMode(ГРАДУСЫ);  переведите(ширина/2, высота/2);  за(позволять тета = 0; тета <= 360; тета++){    позволять k = тета * d;    позволять р = ширина/2 * angleFormula(п,k);    позволять  Икс = р * потому что(k);    позволять у = р * грех(k);    вершина(Икс, у);  }  endShape();  beginShape();  Инсульт(255, 0, 0);  ходВес(2);  за(позволять тета = 0; тета <= 360; тета++){    позволять k = тета;    позволять р = ширина/2 * angleFormula(п,k);    позволять Икс = р * потому что(k);    позволять у = р * грех(k);    вершина(Икс, у);  }  endShape();  поп();  Инсульт(255);  textFont('Грузия', 20);  текст('N (# Лепестки):' + ул(п), 10,20);  текст('D:' + ул(d), 10, 50);}функция angleFormula(п,k) {  выключатель(angleOptions.ценить()) {    дело "грех":       возвращаться грех(k*п);    дело "cos":       возвращаться потому что(k*п);    дело "загар":       возвращаться загар(k*п);    дело "csc":       возвращаться (1/грех(k*п));    дело "сек":       возвращаться (1/потому что(k*п));    дело "детская кроватка":       возвращаться (1/загар(k*п));    дефолт:      возвращаться грех(k*п);  }}

Код Python

Python не очень эффективен, когда дело доходит до рисования, поэтому на это требуется время. Но роза не будет перевернутой, как на большинстве других языков, благодаря способам Turtle Graphics.

импорт математика, черепахаэкран = черепаха.Экран()экран.настраивать(ширина=800, высота=800, startx=0, начальный=0)экран.bgcolor('чернить')ручка = черепаха.Черепаха()ручка.скорость(20)п = 5d = 97ручка.цвет('синий')ручка.размер(0.5)за тета в классифицировать(361):    k = тета * d * математика.число Пи / 180    р = 300 * математика.грех(п * k)    Икс = р * математика.потому что(k)    у = р * математика.грех(k)    ручка.идти к(Икс, у)ручка.цвет('красный')ручка.размер(4)за тета в классифицировать(361):    k = тета * математика.число Пи / 180    р = 300 * математика.грех(п * k)    Икс = р * математика.потому что(k)    у = р * математика.грех(k)    ручка.идти к(Икс, у)

Код C ++

Требуется SFML

#включают "SFML / System.hpp"#включают "SFML / Graphics.hpp"#включают "SFML / Audio.hpp"#включают "SFML / Window.hpp"#включают <iostream>#включают <math.h># определить M_PI 3.14159265358979323846int главный() {	int п = 6;	int d = 71;	нф::RenderWindow Окно(нф::Видео режим(800, 800), "Тест роз", нф::Стиль::Закрывать );	нф::VertexArray Роза(нф::PrimitiveType::Линии);	нф::VertexArray Контур(нф::PrimitiveType::Линии);	Окно.setFramerateLimit(30);	пока (Окно.открыт()) {		нф::Мероприятие мероприятие;		пока (Окно.pollEvent(мероприятие))		{			выключатель (мероприятие.тип)			{			дело нф::Мероприятие::Закрыто:				Окно.Закрыть();				перемена;			}		}		за (int я = 0; я <= 360; я++)		{			двойной k = я * d * M_PI / 180;			двойной р = 300 * грех(п * k);			двойной Икс = -р * потому что(k);			двойной у = -р * грех(k);			Роза.добавить(нф::Вершина(нф::Vector2f(Икс + Окно.getSize().Икс / 2, у + Окно.getSize().у / 2), нф::Цвет::Синий));		}		за (int я = 0; я <= 360; я++)		{			двойной k = я * M_PI / 180;			двойной р = 300 * грех(п * k);			двойной Икс = р * потому что(k);			двойной у = -р * грех(k);			Контур.добавить(нф::Вершина(нф::Vector2f(Икс + Окно.getSize().Икс / 2, у + Окно.getSize().у / 2), нф::Цвет::красный));		}		Окно.Чисто(нф::Цвет::белый);		Окно.рисовать(Роза);		Окно.рисовать(Контур);		Окно.отображать();	}	возвращаться 0;}

Рекомендации

  • Маурер, Питер М. (август – сентябрь 1987 г.). "Роза есть роза ..." Американский математический ежемесячник. 94 (7): 631–645. Дои:10.2307/2322215. JSTOR  2322215.
  • Вайсштейн, Эрик В. "Мауреровые розы". MathWorld. (Интерактивные демонстрации)


Внешняя ссылка

Интерактивная демонстрация: https://codepen.io/Igor_Konovalov/full/ZJwPQv/ Музыкальный проигрыватель : https://labo86.fr/