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

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

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

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

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

Хм, возможно мы говорим про разные вещи. Я высчитывал точки принадлежащие кривой безье. Не какие-то там промежуточные, а именно точки самой кривой. Родные. Такие, какими оперирует операционная система и графические программы. А потом проверял их на соответствие к точкам принадлежащим идеальному кругу, с помощью теоремы Пифагора.
Идеальный круг 4-мя кривыми безье не сделать!

А теперь к практике. Я вчера добавил в программу пару функций, чтобы показывались самые проблемные места. (На рисунке два белых крестика). Можно их вычислить более точно. Координаты максимальной погрешности известны. В гипотетических единицах измерения это будет х=99,8642778032932, y=17,0226368238273. Находим арккосинус угла, переводим из радианов в градусы, получаем 19,4382189150887-гр.

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

Вложения

  • graph.png
    graph.png
    45.1 КБ · Просм.: 1 075
  • corel-measure.gif
    corel-measure.gif
    19.7 КБ · Просм.: 1 099
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Идеальный круг 4-мя кривыми безье не сделать!
С этим уже никто и не спорит. Идеальный круг нельзя получить и десятью обычными кривыми Безье. Вы просто меня не совсем поняли. Вы в своей программе строите кривую Безье по четырем точкам (R,0),(0,R),(-R,0) и (0, -R). А можно ж ее строить, скажем, по 12 - аппроксимируемые кривые Безье между этими точками будут заметно ближе к настоящей окружности.
А вообще, я не совсеем понимаю, зачем такую сложную программу делать, чтобы погрешность оценить? Она считается "на кончике пера":
Пусть у нас имеется дуга кривой Безье единичным радиусом с координатами крайних точек (0,1) и (1,0), соответственно с точками хинтов
Код:
(4*(sqrt(2)-1)/3,1),(1,4*(sqrt(2)-1)/3)
Уравнение в параметрических координатах будет:
Код:
x=(1-t)^3*0+3*t*(1-t)^2*(4*(sqrt(2)-1)/3)+3*t^2*(1-t)*1+t^3*1
y=(1-t)^3*1+3*t*(1-t)^2*1+3*t^2*(1-t)*(4*(sqrt(2)-1)/3)+t^3*0
Оценим погрешность по теореме Пифагора:
Код:
R-sqrt(x^2+y^2)=1-sqrt(((1-t)^3*0+3*t*(1-t)^2*(4*(sqrt(2)-1)/3)+3*t^2*(1-t)*1+t^3*1)^2+((1-t)^3*1+3*t*(1-t)^2*1+3*t^2*(1-t)*(4*(sqrt(2)-1)/3)+t^3*0)^2)
Попробуем минимизировать эту функцию на отрезке (0,1):
http://www.wolframalpha.com/input/?i=minimize+1-sqrt%28%28%281-t%29%5E3*0%2B3*t*%281-t%29%5E2*%284*%28sqrt%282%29-1%29%2F3%29%2B3*t%5E2*%281-t%29*1%2Bt%5E3*1%29%5E2%2B%28%281-t%29%5E3*1%2B3*t*%281-t%29%5E2*1%2B3*t%5E2*%281-t%29*%284*%28sqrt%282%29-1%29%2F3%29%2Bt%5E3*0%29%5E2%29+from+t%3D0+to+1
как видно, погрешность максимальна в двух точках: t примерно 0.211 и 0.789 (разница 0.00027253)
Что и требовалось доказать.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

А вообще, я не совсеем понимаю, зачем такую сложную программу делать, чтобы погрешность оценить? Она считается "на кончике пера":

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

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

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

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

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

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

Отлично. На удочку попались: компания Adobe, Corel. А вот Григорьев с Малозёмовым не попались. :D
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Отлично. На удочку попались: компания Adobe, Corel.
Ну почему же. Я думаю, они отлично представляют себе как обстоит на самом деле. Кстати, как я уже говорил, есть отдельный оператор, рисующий саму окружность или ее сектор - и он, скорее всего, реализован не через кривые Безье, а честно отрисовывает окружность. То есть, аппроксимация начинается при переводе окружности в кривые. Я не уверен, но проверить достаточно просто. А вообще, действительно, ошибка в четвертом знаке совершенно несерьезна. Все равно что на метровой окружности будет неточность в доли миллиметра - на такой допуск можно и сквозь пальцы посмотреть.
Теперь по поводу того, как увеличито точность приближения кривыми Безье. Из вышеизложенного понятно, что правильнее будет не тупо дробить окружность на большое количество равных дуг, а итерационно считать максимумы отклонений на каждой дуге разбиения (в случае дуги в 90 градусов это значения 0.211 и 0.789) и использовать эти значения как новые точки разбиения дуги. По логике вещей, таких точек на любой дуге должно быть две (потому как на концах и в середине дуги отклонения нулевые), соответственно, на каждом шаге каждая дуга делится на три части. При таком подходе за пару шагов погрешность снижается сразу на несколько порядков.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

То есть, аппроксимация начинается при переводе окружности в кривые. Я не уверен, но проверить достаточно просто.
А я на рисунке показал как дела обстоят с кореловским кругом. Причем до перевода. Или вы опять будете проверять на следующий день, то что уже проверено? ))

А вообще, действительно, ошибка в четвертом знаке совершенно несерьезна.
Я нарисовал круг в 60 см, а ошибка уже во втором знаке после запятой. И это радиус, т.е. диаметр будет с ошибкой в первом знаке после запятой!

Что касается дробления кривой. Ну разумеется её можно задробить и приблизить. Это я еще в школе слышал, про араба, который в пустыне треугольниками к кругу приближался, огромных размеров, чтоб пи вычислить. Только, я думаю это будет, как говорится в математике, вырождение. Кривая высшей степени будет вырождаться в кривую низшей. Смысл тогда её вообще городить? Наставил побольше точек, описал более простой кривой. Это же логичней, чем наставить побольше точек, но оставить такую же степень сложности кривой.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Вот я удивляюсь... Банальная проблема найти шрифт в котором есть это Infinity породило 2 страницы обсуждений методов интерполяции.
Да не делайте вы это в Кореле, сделайте шрифт в Фонтлабе и нарисуйте кривыми 3-го порядка.
 
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

А я на рисунке показал как дела обстоят с кореловским кругом. Причем до перевода.
Где? Я это пропустил.

Я нарисовал круг в 60 см, а ошибка уже во втором знаке после запятой. И это радиус, т.е. диаметр будет с ошибкой в первом знаке после запятой!
Вы меня не поняли. Ошибка в четвертом знаке после запятой от радиуса относительная, а вы приводите абсолютную. То есть, на 60 сантиметрах ошибка будет 60 см * 0.00027253=0.16 мм или на диаметре 0.33 мм

Кривая высшей степени будет вырождаться в кривую низшей.
Этой мысли уже не понимаю я. Окружность - кривая 2 порядка, мы ее аппроксимируем отрезками кривых Безье, то есть кривыми 3 порядка. Чем больше кривых, тем выше точность. Что не так? Сделать другую степень мы не можем ибо стеснены в средствах - нам операционная система и графические библиотеки предоставляют в качестве инструментов лишь кривые первого (отрезки) и третьего порядков, тут уж никуда не денешься. Хотя, на мой взгляд, этого вполне хватает для текущих задач. Не нравится точность в 0.3мм на 60 сантиметрах - напишите скриптик, который будет рисовать окружность на 12 дугами, там точность будет в микроны на таком же радиусе.
Да не делайте вы это в Кореле, сделайте шрифт в Фонтлабе и нарисуйте кривыми 3-го порядка.

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

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

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

Не по теме:
JAW, ваш комментарий, как всегда, самый актуальный. Мы уже сотню постов обсуждаем аппроксимацию кривыми третьего порядка, а вы так этого и не поняли. Фонтлаб использует те же средства операционной системы что и Корел и Иллюстратор, поэтому что пнем об сову что совой об пень
Так а что фигнёй то страдаете... Какие средства ОС? Я предлагаю использовать средства шрифтовой машины, а это не ОС. Windows использует максимум интерполяцию дугами окружностей, Обычно интерполяцию линиями, ну не умеет GDI другого.
Шрифтовая машина Adobe поддерживает кубическую интерполяцию.

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

Windows использует максимум интерполяцию дугами окружностей, Обычно интерполяцию линиями, ну не умеет GDI другого.
Да ну? http://alex-black.ru/article.php?content=109
Шрифтовая машина Adobe поддерживает кубическую интерполяцию.
Какая еще шрифтовая машина? Где вы ее видели отдельно?
Вы вообще, топик внимательно читали? Сказано же вам было, интерполяция задающаяся 4 опорными точками - это именно кривая Безье третьего порядка. Во всех графических программах они. А вы про какую-то мифическую шрифтовую машину.
 
Статус
Закрыто для дальнейших ответов.