Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

  • Автор темы Автор темы Dmitriy74
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

А если нарисовать круг, - это будет не настоящий круг

Не по теме:
Тото и оно что настоящий.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?


Не по теме:
Тото и оно что настоящий.
Перевод из en-википедии:
Некоторые кривые, которые кажутся простыми, такие как круг, не могут быть точно описаны с помощью Безье или кусочно-заданной функции Безье; хотя кубическая кривая Bézier с четырьмя частями может приблизиться к кругу (см. сплайн Bézier), с максимальной радиальной ошибкой меньше чем одной тысячной [...] :)
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Я вообще-то имел в виду окружность, нарисованную через родную функцию Arc и не переведенную в кривые. Она рисуется совершенно другими алгоритмами, не через кривые Безье.
Хотя, насколько я понимаю, окружность является кривой 2го порядка, кривая Безье - третьего, то есть, по идее, сегмент окружности можно представить как частный случай кривой Безье? А вот с леминискатой сложнее - она является уже кривой четвертого порядка и кривыми Безье третьего порядка (которыми пользуется адоба) представлена быть не может. Или я неправ?
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?


Не знаю. Я не математик. Формулы перевода одного в другое есть. Если уж кривой безье описываем круг, то и лемнисканту опишем. ))
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?


Не по теме:
лемниската Бернулли
Интересно, какие еще будут варианты? :)

 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Дело еще осложняется тем, что идиотический редактор под названием иллюстратор имеет такой же тупорылый скриптинг, в котором умники из адобы напрочь отключили поддержку кривых Безье. Более того, даже если точке прямо назначить атрибут SMOOTH, то она все равно остается угловой. А это значит, что после запуска данного скрипта следует выделить все точки правой стрелкой и ткнуть Convert selected anchor points to smooth 'P:E'

Это утверждение рождает у меня такой вопрос: а скрипты CorelDraw поддерживают кривые Безье?

P.S.
Нарисовал несколько лемнискат при разных параметрах количества опорных точек. Здорово! Особенно приятно, что способ, если я правильно понял, универсальный. - Таким образом можно "визуализировать" любую функцию, описываемую аналилически.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

До меня, кажется, дошло: кривая, проходящяя через SMOOF-точку в AI, и есть кривая Безье. Так? :)Т.е. после команды "Convert selected anchor points to smooth" получаем результат в кривых Безье?
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

На самом деле поддерживают и кореловские и иллюстраторовские - это я ступил поначалу. ;)
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Вот вариант со встроенным сглаживанием кривыми Безье:
Код:
function prev(i,p)
{
 return i>0?i-1:p-1;

}

function nex(i,p)
{
 return i<p-1?i+1:0;

}


function smooth(pi)
{
  var pathes = [];
  var  gb, center, sign;
  var d, i, j, p, v;

   p  = pi.pathPoints;

  
    
    for(i = 0; i < p.length; i++){
      
      d0=(p[nex(i,p.length)].anchor[0]-p[prev(i,p.length)].anchor[0])/6;
      d1=(p[nex(i,p.length)].anchor[1]-p[prev(i,p.length)].anchor[1])/6;    
      p[i].leftDirection  = [p[i].anchor[0]-d0,p[i].anchor[1]-d1];
      p[i].rightDirection  = [p[i].anchor[0]+d0,p[i].anchor[1]+d1];
    }

}


var piRef = activeDocument.pathItems;
var N=10; 
var C=50;
var points = new Array(N*4+1);
var pathRef = piRef.add();

points[0]=new Array(0,0);
points[N+1]=new Array(0,0);

for ( i = 0; i != N ; i++ )
{
 p=(i+1)/(N+1);
 x=C*Math.sqrt(2)*(p+p*p*p)/(1+p*p*p*p);
 y=C*Math.sqrt(2)*(p-p*p*p)/(1+p*p*p*p);
 points[i+1]=new Array(x,y);
 points[2*N-i]=new Array(x,-y);
 points[2*N+i+1]=new Array(-x,y);
 points[4*N-i]=new Array(-x,-y);
}

pathRef.setEntirePath(points);
pathRef.closed=true;
smooth(pathRef);
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Что-то отрезками лучше получается. Этот скрипт выдает слишком плоские бока и какой-то невнятный переход с плоского бока вверх/вниз.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Если больше точек привязки задавать то глаже будет. С отрезками совсем плохо.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Понятно. Ну в целом попытка зачётная, но пока что отрезками получается красивей. ))
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

По любому лучшего алгоритма преобразования отрезков в кривые Безье я нигде не видел. Зато, в кореле, они, по-моему, автоматически сглаживаются при смене типа узла.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Corel, да, пытается влиять на кривую. Это хорошо заметно при удалении точек (например в круге). С одной стороны это полезное свойство, с другой -- не полезное.
И, кстати, скрипт Sato "Extend Handles", может округлить побольше после штатного convert to smooth
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

И, кстати, скрипт Sato "Extend Handles", может округлить побольше после штатного convert to smooth
Так я ж им и пробовал по началу - получается вся линия в завитушках - никуда не годится. :-( Посмотрел по коду - он касательные проводит относительно центра тяжести фигуры, а для лемнискаты это совсем не годится :-(
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Кстати, и мой алгоритм сглаживания очень даже неплох. На скриншоте видно, что лемниската полученная из ломанной (синяя линия), сглаженная подобным образом (зеленая линия) отличается от настоящей (красная линия) буквально на микроны с торца:
1.jpg
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Перевод из en-википедии:
Некоторые кривые, которые кажутся простыми, такие как круг, не могут быть точно описаны с помощью Безье или кусочно-заданной функции Безье
Если ограничиться четырьмя опорными точками, образованными пересечением окружности с координатными осями - нельзя. Если задать больше - можно. Вопрос в величине ошибки и в способе определения производных на границе сплайна. В принципе, если использовать раздельные функции по осям Х и Y, то вопрос описания замкнутых и петлеобразных кривых отпадает сам собой я в таком случае могу самостоятельно по каждой координате создать сплайн-функцию. Собственно, однажды я именно так и сделал в связи с выполнением спецтемы. ;)
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Если ограничиться четырьмя опорными точками, образованными пересечением окружности с координатными осями - нельзя.
Ну Иллюстратор с Корелом же нормально интерполируют именно по четырем опорным точкам. Вопрос в другом - это действительно только интерполяция или дуга окружности и есть частный случай кривой Безье? (что, по идее, должно было быть, раз окружность - кривая второго порядка) В чем я уже начинаю сомневаться, похоже, википедия в этом маленько неправа. Дуга окружности задается параметрическими уравнениями: x=sqrt(t); y=sqrt(1-t), то есть, это кривая не второго а, скорее, "1/2" порядка. Является ли это частным случаем кубического сплайна? 'hz'
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Могу только сказать, что полиномом 3-го порядка можно описать полиномиальную функцию, имеющую высшую степень 2. ;)
И мне тоже показалось, что в Википедии что-то не то. Но глубоко не копал - не до того.
 
Статус
Закрыто для дальнейших ответов.