Компьютерная графика – дело непростое. А уж векторная – вообще жесть. Тут математику и всякие вычисления знать надо ой как! Но мы ведь ничерта не знаем, мы начинающие, поэтому давайте разбиратся вместе. Самое злое в этом деле – то что экран компа состоит из пикселей, и даже если их очень много (высокое разрешение) – всё равно число их конечно. Это означает что ни идеальной линии, ни идеальной окружности нарисовать не получится. А это в свою очередь означает что все формулы которым нас учили в школе почти неприемлемы. Нет, они конечно работают, но блин чуток по-другому, и вот это «другое» создаёт кучу головной боли. А если учесть что комп по своей конструкции вообще умеет только складывать бит к биту (всё остальное – это разнообразные извраты со сложением, где-то на аппаратном уровне, а где-то и программно) – то становится ясно что надо готовится к разным сюрпризам (иначе шансов написать что-либо сложней тетриса почти нет).
Начнём с теории:
1. Боянистое доказательство что Pi = 4. (взято из http://gadaika.ru/geometry/chislo-pi-ravno-4)
Начертим окружность с диаметром, равным единице:
Теперь опишем квадрат вокруг этой окружности. Периметр этого квадрата будет равен четырём, ведь каждая сторона равна единице.
Теперь "отрежем" углы у квадрата, чтобы получившаяся фигура более точно повторяла окружность. Отрезать будем прямоугольные кусочки, поэтому периметр фигуры, которая раньше была квадратом, не изменится.
Повторяем "отрезание", чтобы оставшаяся от квадрата часть была похожа на круг. Кое-где можно не отрезать, а наоборот, "добавлять" прямоугольные кусочки, чтобы максимально приблизить фигуру к окружности. Периметр при этом, опять же, не меняется.
Проделав это бесконечное число раз (с каждым разом фигура приближается к окружности), получим точный контур окружности. А ведь фигура, которую мы "превратили" в круг, имеет всё тот же периметр, равный четырём! Этот периметр теперь - длина окружности, получившейся из квадрата. Диаметр этой окружности равен единице. Найдём теперь число Пи из определения: Pi = 4 / D = 4.
Итак, доказано: число Пи равно четырём.
Не знаю кто как, а я сперва удивился – как так?
Но довольно быстро стало понятно – что даже если разбивать квадрат бесконечное количество раз, он всё равно будет многоугольником с бесконечным количеством ПРЯМОУГОЛЬНЫХ граней. Т.е. состоять из малюсеньких таких квадратиков. Но тем не менее не кругом! И вот эти уголки от квадратиков будут «набирать» лишнее значение. И станет PI для такой фигуры = 4. А вот если разбивать не на прямоугольники а на треугольники (т.е. «срезая» ещё и диагонали) – то периметр приблизится к настоящему значению PI (хотя и не до конца).
Пока всё понятно?
Погнали далее:
2. Формула Пифагора:
Та самая для прямоугольного треугольника:
На бумаге или например на земле это всё правильно.
Но если изобразить такой треугольник на экране, особенно в маленьком масштабе – то начинается чертовщина. Вот небольшой равносторонний треугольник с катетами 5х5:
Во первых нет чёткого разделения где кончается один катет и начинается другой (или гипотенуза)
Всё как-бы «перетекает» одно в другое, но это ещё полбеды. Посчитаем длину гипотенузы. По Пифагору она равна SQR(5*5 + 5*5) – примерно 7 с копейками. А если вручную? 5 пикселей!
И это тоже ещё не предел шизе!
Посчитаем квадраты:
Для катетов – всё правильно – по 25 пикселей на рыло. А гипотенуза? 41 пиксель вручную и 50 по Пифагору.
Весь этот бред опять-же из-за тех заплётов из-за которых в первом пункте PI равнялось 4.
Как с этим боротся? Как вычислять всякие пути-длины правильно?
Да очень просто, повышать точность. Т.е. считать не просто байтами (8бит), а словами (16бит), или даже удвоеными словами (32бита). Но для Спека это гроб. Если для какого-нибудь построения графика – ещё куда ни шло, то для динамичных сцен – совсем не подходяще.
Ладно. Допустим мы вычислим таблички всякие заранее, где-то округлим, что-то отбросим и даже не будем обращать внимание на биения (дёрганье линий из-за округлений).
Вернёмся к теории, бог с ними (пока) с битами, худо-бедно умеем их складывать и даже выражать дробную часть.
3. Ещё бредовей.
Классическая формула длины окружности:
L=Pi*D
Где L – длина, D – диаметр, ну и Pi. (длина окружности равна произведению диаметра на Pi)
Вроде всё просто.
Ан нет. Это самое пи есть иррациональное число, т.е. его хрен выразишь конечным числом знаков после запятой. Казалось-бы плюнуть и растереть! Но вылезает интересная тема: если число пи имеет бесконечное количество знаков после запятой, то как тогда длина (которая есть произведение этого пи на диаметр) может быть целым? Ну ладно, если диаметр целое число, то длина – с «дофигазнаковпослезапятой » (т.е. тоже иррациональное число) получается. Хорошо. А если взять прямую единичной длины? И свернуть её в окружность? Длина получается целым (та самая единичка), а диаметр получившейся окружности – нецелым. Выходит что иррациональное число может быть будучи помноженым на что-то там нецелое даст на выходе целое? Но это вроде противоречит самой природе иррациональных чисел!
В общем у меня ум за разум заходит от размышлений над этими вещами!
Пробовал «учить матан» - но всё что нагуглил оказалось написано так невразумительно что я ничерта и не понял. То-ли от природы дурак, то-ли доходчиво объясняющего препода не встретил – загадка сие есть…
Вот и просьба Алонекодерам и другим товарищам которые всякие интегральные исчисления на завтрак кушают и тензорным анализом закусывают – просветите плиз, что-же происходит в мире чисел и особенно как ловчей с ними обращатся в ограниченной разрядной сетке? А мы послушаем, думаю это многим будет на пользу.
(P.S. На всяк случай док со статьей во вложении)