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

Статус
Закрыто для дальнейших ответов.

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Само собой есть. Мы же пользуемся обычной плоской кривой Безье, а не пространственной. Просто чем больше сегментов, тем погрешность меньше будет. Но вцелом ей обычно пренебрегают.
 

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

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

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

Вложения

  • graph.png
    graph.png
    45.1 КБ · Просм.: 1 053
  • corel-measure.gif
    corel-measure.gif
    19.7 КБ · Просм.: 1 080

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 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)
Что и требовалось доказать.
 

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

В кореле погрешность нулевая?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

С чего это? Там такие же сплайны третьего порядка
 

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Именно об этом написано в вики. Как просто взять и проверить, правда? :)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

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

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

JAW

15 лет на форуме
Сообщения
15 797
Реакции
3 454
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

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

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

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

Проверил и на иллюстраторе - то же самое что и в кореле, окружность отрисовывается и записывается в постскрипт четырьмя сегментами кривой Безье. :(
 

JAW

15 лет на форуме
Сообщения
15 797
Реакции
3 454
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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

А так... Окружность 4 опорных точки на кривой на контуре. 8 опорных вне окружности.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ответ: Как отрисовать фигуру "бесконечность" (повернутая 8), зная ее математическое уравнение?

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