Эпициклоида является кривой точка на окружности , как это делает катается еще один круг. Cyclogon это форма точка на правильный многоугольник делает , как она катится по плоскости. Epicyclogon это кривая , описываемая точкой на одном правильного многоугольника , как она катится вокруг другого.
Написать программу , которая рисует epicyclogon данное r
, r1
, r2
, n1
, n2
:
r = number of clockwise revolutions rolling polygon makes around stationary polygon (any real number as limited by float values)
r1 = distance from center of stationary polygon to each of its vertices (positive real number)
r2 = distance from center of rolling polygon to each of its vertices (positive real number)
n1 = number of sides stationary polygon has (integer greater than 2)
n2 = number of sides rolling polygon has (integer greater than 2)
Заметки
- При
r
отрицательном положении ролик должен идти против часовой стрелки . - Ибо
r
один оборот происходит, когда линия, соединяющая центроиды двух фигур, выметает все 360 градусов. Это понятие расширено, чтобы включить все значенияr
. (Таким образом, за четверть оборота линия, соединяющая центроиды, выметается на 90 градусов.) - Эти аргументы должны исходить из командной строки или ваша программа должна запрашивать их (например, с помощью Python
input()
). r1
иr2
относятся друг к другу, а не размеры изображения. Таким образом, вы можете установить одну «единицу измерения» на любое количество реальных пикселей.
Точка, которую вы должны отследить, является одной из вершин формы вращения. Формы должны начинаться с этой вершины, касающейся стационарной вершины и двух соседних сторон:
Точные начальные вершины и угол неподвижного многоугольника не имеют значения.
Выход
Вывод должен идти к изображению размером не менее 600x600 пикселей (или с некоторым изменяемым размером, который может быть установлен на 600). Он должен показывать всю кривую эпициклона, заданную параметрами, хорошо оформленными на изображении.
Скользящие и стационарные многоугольники также должны быть нарисованы (с валиком в его окончательном состоянии). Две фигуры и эпициклон должны быть трех заметно разных цветов.
Там также должен быть простой способ не рисовать многоугольники (смена true
на false
в коде хватает).
Пожалуйста, покажите нам как минимум 2 выходных изображения. Это нормально, чтобы уменьшить их, если это необходимо.
счет
Самый короткий код, который производит действительные выходные изображения, побеждает.
Бонусы
- Минус 50 байтов, если выводом является анимированный GIF (или аналогичный) нарисованной кривой.
- Минус 150 байт, если вы позволите
n1
иn2
примете значение 2, чтобы фигуры стали отрезками длины2 * r1
(илиr2
), «катаясь» друг вокруг друга. Как вы справляетесь,r
когдаn1
и когдаn2
2, зависит от вас, поскольку центроиды не вращаются вокруг друг друга, как в других случаях. (Не «катиться» вообще не считается обработкой.)
Так как мне не терпится увидеть, как эта новая идея выполнена хорошо (и это не совсем легкая прогулка), я собираюсь наградить победителя 150 наградами . Конкурс завершится в тот же день, когда заканчивается награда.
Награда не будет присуждена победителю, если станет ясно, что они просто переписали большую часть кода из другой заявки.
Библиотечные функции, которые уже делают это (если они есть), не допускаются.
Примечание. Это связано с моими оставшимися вопросами, которые каждый может свободно публиковать. Но если никто не публикует их, есть хороший шанс, что я вовремя. :П
источник
Ответы:
MATLAB: 735 байт - бонус 200 = 535
Моя программа обрабатывает случай n = 2 и рисует анимацию в реальном времени. Есть несколько различий между версиями для гольфа и без игры в гольф:
В версии без игры есть возможность сохранить анимацию в файл «g.gif», установив
savegif = 1
в коде. По умолчанию он отключен, так как это может раздражать по нескольким причинам:отображается правильно, возникает ошибка ... Сохранение картинки в отбрасываемой версии необходимо было сбросить, поскольку оно занимало около 100 байт, что превышало размер бонуса.Версия без гольфа рисует круг на вершине трассера. Он также производит больше кадров и движется быстрее (хотя это можно изменить в версии для гольфа, изменив числа).
Образцы:
f(11,5,90,2,99,0)
после завершения программыepic(1.3,4,2,6,6,1)
с выходом GIFКод без правил
Гольф-код
Инструкции:
Сохраните функцию в файл с тем же именем, т.е.
epic.m
илиf.m
. Запустите его, вызвав функцию из консоли Matlab.Использование:
epic(r, r1, r2, n1, n2, dispPoly)
гдеdispPoly
- логическая переменная (ноль, если ложь, ненулевое число, если истина), определяющая, следует ли рисовать многоугольники.Изменить: Добавлен бонус 50 за анимированные изображения.
источник
Java -
27262634 - 200 = 2434 символаУлучшено с 3800 байтов
Спасибо всем за ваши предложения (особенно псевдоним117), вот новая версия.
Я добавил класс P, который является точечным классом, и класс L, который расширяет ArrayList
Я также добавил некоторые незначительные логические изменения.
Вот основной класс (не гольф):
И версия для гольфа:
Как и классы P:
И я:
Измените int d на 0 или 1, чтобы показать полигоны
аргументы - 1 100 50 5 2
args - 1,5 100 100 7 3
args - 2 40 100 3 7
источник
r
ли 50 во всех ваших примерах? Это означало бы, что ролик проходит около 50 раз.RotatingPolygonsGolfed
в «гольфовом» коде, а простоRotatingPolygons
в обычном коде. ;)Javascript, 1284 символа (-200 = 1084 символа)
Минимизированный код
Полный код
Скрипка, чтобы увидеть рутину во всей ее красоте (и продемонстрировать анимацию), найдена на
http://jsfiddle.net/7rv751jy/2/embedded/result/
Сценарий определяет вызываемую функцию,
epi
которая принимает пять перечисленных параметров в OP.epi
возвращает функцию с подписью,(e,t,isCCW,flags)
которая принимает аргументы:e
- ссылка на элемент HTML5 Canvas размером 600x600, на котором выполняется рендеринг.t
- общий угол (в радианах), который центроид второго многоугольника должен охватывать вокруг центроида первого. Передаваемый аргумент не должен превышать в 2 раза числа оборотов, переданныхepi
.isCCW
- логическое значение, указывающее, должна ли трассировка идти в направлении против часовой стрелки (в отличие от часовой стрелки)flags
- набор битовых флагов, указывающих, какие элементы должны быть отображеныФункция может быть вызвана любое количество раз с различными наборами аргументов.
Некоторые заметки:
Подпрограмма обрабатывает вырожденные случаи, когда
n1 = 2
и / илиn2 = 2
. При анимации определенные комбинации длин могут привести к внезапному быстрому продвижению по трассе. Это связано с тем, что кадры анимации индексируются под углом к центроиду второго многоугольника, и d theta poly2 / d тета-центроид становится единичным в тех случаях, когда центроид 2-стороннего poly 2 находится вблизи вершины 2-стороннего poly 1. Однако это не влияет на след.Имена параметров в
epi
будут казаться запутанными, так как на протяжении всей разработки я упоминал полигон 1 как «2», а полигон 2 как «1». Когда я понял несоответствие между моим соглашением и соглашением OP, вместо того, чтобы поменять местами все индексы в коде, я просто поменял местами порядок аргументовepi
.Скрипка выше импортирует jQuery, но это для обработки пользовательского интерфейса.
epi
Функция не имеет библиотечных зависимостей.Код обрабатывает следы CCW, просто инвертируя ось Y. Это несколько не элегантно, так как полигон 2 начинается в позиции Y-инвертированной во время следов CCW, но никто не сказал, что рутина должна быть элегантной. ;)
источник
nt = ~~(t*(r_>rC?r_:rC)+1)
на,nt = ~~(t*(r_>rC?r_:rC)/10+1)
и это должно немного ускорить процесс.