Вход

Просмотр полной версии : Дискретная математика



Destr
17.01.2015, 11:29
Компьютерная графика – дело непростое. А уж векторная – вообще жесть. Тут математику и всякие вычисления знать надо ой как! Но мы ведь ничерта не знаем, мы начинающие, поэтому давайте разбиратся вместе. Самое злое в этом деле – то что экран компа состоит из пикселей, и даже если их очень много (высокое разрешение) – всё равно число их конечно. Это означает что ни идеальной линии, ни идеальной окружности нарисовать не получится. А это в свою очередь означает что все формулы которым нас учили в школе почти неприемлемы. Нет, они конечно работают, но блин чуток по-другому, и вот это «другое» создаёт кучу головной боли. А если учесть что комп по своей конструкции вообще умеет только складывать бит к биту (всё остальное – это разнообразные извраты со сложением, где-то на аппаратном уровне, а где-то и программно) – то становится ясно что надо готовится к разным сюрпризам (иначе шансов написать что-либо сложней тетриса почти нет).
Начнём с теории:
1. Боянистое доказательство что Pi = 4. (взято из http://gadaika.ru/geometry/chislo-pi-ravno-4)
Начертим окружность с диаметром, равным единице:
http://gadaika.ru/sites/gadaika.ru/files/att/731/pi4-1.png
Теперь опишем квадрат вокруг этой окружности. Периметр этого квадрата будет равен четырём, ведь каждая сторона равна единице.
http://gadaika.ru/sites/gadaika.ru/files/att/731/pi4-2.png
Теперь "отрежем" углы у квадрата, чтобы получившаяся фигура более точно повторяла окружность. Отрезать будем прямоугольные кусочки, поэтому периметр фигуры, которая раньше была квадратом, не изменится.
http://gadaika.ru/sites/gadaika.ru/files/att/731/pi4-3.png
Повторяем "отрезание", чтобы оставшаяся от квадрата часть была похожа на круг. Кое-где можно не отрезать, а наоборот, "добавлять" прямоугольные кусочки, чтобы максимально приблизить фигуру к окружности. Периметр при этом, опять же, не меняется.
http://gadaika.ru/sites/gadaika.ru/files/att/731/pi4-4.png
Проделав это бесконечное число раз (с каждым разом фигура приближается к окружности), получим точный контур окружности. А ведь фигура, которую мы "превратили" в круг, имеет всё тот же периметр, равный четырём! Этот периметр теперь - длина окружности, получившейся из квадрата. Диаметр этой окружности равен единице. Найдём теперь число Пи из определения: Pi = 4 / D = 4.
http://gadaika.ru/sites/gadaika.ru/files/att/731/pi4-5.png
Итак, доказано: число Пи равно четырём.

Не знаю кто как, а я сперва удивился – как так?
Но довольно быстро стало понятно – что даже если разбивать квадрат бесконечное количество раз, он всё равно будет многоугольником с бесконечным количеством ПРЯМОУГОЛЬНЫХ граней. Т.е. состоять из малюсеньких таких квадратиков. Но тем не менее не кругом! И вот эти уголки от квадратиков будут «набирать» лишнее значение. И станет PI для такой фигуры = 4. А вот если разбивать не на прямоугольники а на треугольники (т.е. «срезая» ещё и диагонали) – то периметр приблизится к настоящему значению PI (хотя и не до конца).
Пока всё понятно?
Погнали далее:

2. Формула Пифагора:
Та самая для прямоугольного треугольника:
https://dl.dropboxusercontent.com/u/54641374/Speccy/Math/1.PNG
На бумаге или например на земле это всё правильно.
Но если изобразить такой треугольник на экране, особенно в маленьком масштабе – то начинается чертовщина. Вот небольшой равносторонний треугольник с катетами 5х5:
https://dl.dropboxusercontent.com/u/54641374/Speccy/Math/2.PNG
Во первых нет чёткого разделения где кончается один катет и начинается другой (или гипотенуза)
Всё как-бы «перетекает» одно в другое, но это ещё полбеды. Посчитаем длину гипотенузы. По Пифагору она равна SQR(5*5 + 5*5) – примерно 7 с копейками. А если вручную? 5 пикселей!
И это тоже ещё не предел шизе!
Посчитаем квадраты:
https://dl.dropboxusercontent.com/u/54641374/Speccy/Math/3.PNG
Для катетов – всё правильно – по 25 пикселей на рыло. А гипотенуза? 41 пиксель вручную и 50 по Пифагору.
Весь этот бред опять-же из-за тех заплётов из-за которых в первом пункте PI равнялось 4.
Как с этим боротся? Как вычислять всякие пути-длины правильно?
Да очень просто, повышать точность. Т.е. считать не просто байтами (8бит), а словами (16бит), или даже удвоеными словами (32бита). Но для Спека это гроб. Если для какого-нибудь построения графика – ещё куда ни шло, то для динамичных сцен – совсем не подходяще.
Ладно. Допустим мы вычислим таблички всякие заранее, где-то округлим, что-то отбросим и даже не будем обращать внимание на биения (дёрганье линий из-за округлений).
Вернёмся к теории, бог с ними (пока) с битами, худо-бедно умеем их складывать и даже выражать дробную часть.

3. Ещё бредовей.
Классическая формула длины окружности:
L=Pi*D
Где L – длина, D – диаметр, ну и Pi. (длина окружности равна произведению диаметра на Pi)
Вроде всё просто.
Ан нет. Это самое пи есть иррациональное число, т.е. его хрен выразишь конечным числом знаков после запятой. Казалось-бы плюнуть и растереть! Но вылезает интересная тема: если число пи имеет бесконечное количество знаков после запятой, то как тогда длина (которая есть произведение этого пи на диаметр) может быть целым? Ну ладно, если диаметр целое число, то длина – с «дофигазнаковпослезапятой » (т.е. тоже иррациональное число) получается. Хорошо. А если взять прямую единичной длины? И свернуть её в окружность? Длина получается целым (та самая единичка), а диаметр получившейся окружности – нецелым. Выходит что иррациональное число может быть будучи помноженым на что-то там нецелое даст на выходе целое? Но это вроде противоречит самой природе иррациональных чисел!
В общем у меня ум за разум заходит от размышлений над этими вещами!
Пробовал «учить матан» - но всё что нагуглил оказалось написано так невразумительно что я ничерта и не понял. То-ли от природы дурак, то-ли доходчиво объясняющего препода не встретил – загадка сие есть…

Вот и просьба Алонекодерам и другим товарищам которые всякие интегральные исчисления на завтрак кушают и тензорным анализом закусывают – просветите плиз, что-же происходит в мире чисел и особенно как ловчей с ними обращатся в ограниченной разрядной сетке? А мы послушаем, думаю это многим будет на пользу.

(P.S. На всяк случай док со статьей во вложении)

shurik-ua
17.01.2015, 11:58
почитайте "Мир математики. Deagostini" том 4
http://natafriends.org/252-zhuan-gomes-kogda-pryamye-iskrivlyayutsya-neevklidovy-geometrii.html

SoftLight
17.01.2015, 12:27
А дену похоже по сути нечего ответить... Короче я так скажу- геометрию никто не отменял я только не понимаю ты почему когда у тругольника считаешь катеты вычисляешь их в пикселах а когда гипотенузу считаешь в штуках? Ты ее тоже в пикселах тогда считай иу тебя будет неровное число как и по пифагору просто пикселы у тебя квадратные и их собственная гипотенуза собственно больше катета вот и выходит в штуках 5 а не 7. А по катетам как если пиксел развернуть на 45 градусов бутет именно 7. Еслибы пикселы были круглыми проблем бы не было.

Destr
17.01.2015, 12:32
Ты ее тоже в пикселах тогда считай иу тебя будет неровное число как и по пифагору просто пикселы у тебя квадратные и их собственная гипотенуза собственно больше катета вот и выходит в штуках 5 а не 7. А по катетам как если пиксел развернуть на 45 градусов бутет именно 7. Еслибы пикселы были круглыми проблем бы не было.
Да, я это понимаю.
Всё написаное демонстрирует именно то что пиксели могут "надуть".
Например пересечение линий может "промахнутся" если они "между" пикселей друг у друга проскочат.
Типа такого: http://a.disquscdn.com/uploads/mediaembed/images/433/7481/original.jpg?w=800&h
Вот и получается что имея дело с растром нужно учитывать и все эти финты.

perestoronin
17.01.2015, 12:36
Метод вычислений "цифра за цифрой" (https://www.google.ru/?gfe_rd=cr&q=метод+вычислений+"цифра+за+цифрой"), можно применить и для Z80

https://ru.wikipedia.org/wiki/CORDIC

Kakos_nonos
17.01.2015, 12:52
Просьба не холиварить. Человек просит чтобы ему помогли разобраться а не чтобы его троллили.

denpopov
17.01.2015, 13:04
Человек просит чтобы ему помогли разобраться а не чтобы его троллили.
имхо ни к чему изобретать велосипед и засирать моск чушью.

SAM style
17.01.2015, 13:09
1. неправильное толкование интеграла. квадраты остаются "лесенкой", поэтому к окружности никогда не приблизятся настолько, что можно их уравнять. правильное приближение к окружности осуществляется треугольниками-секторами.
2. расстояние между центрами пикселей по диагонали и по вертикали/горизонтали разное - SQR(2) и 1, поэтому считать, что гипотенуза - тоже 5 пикселей ошибочно.
3. диаметр тоже получается иррациональным. так что никакого противоречия. представить пи как n/m, где n и m целые, по прежнему нельзя.

вообще, дискретизировать непрерывное пространство и ожидать, что сохранятся все законы и правила - как-то наивно.

Destr
17.01.2015, 13:41
вообще, дискретизировать непрерывное пространство и ожидать, что сохранятся все законы и правила - как-то наивно.
Ну да, потому и написал что "они конечно работают, но блин чуток по-другому".

Вот только как это учитывать - не совсем понятно.
Точней - как это учитывать в реалиях спека и без головоломных формул.
Т.е. чтоб быстродействие было приемлемым.

Reobne
17.01.2015, 17:08
Destr, Всё что ты написал - правильно. Мир пикселей и целых чисел, он такой. Можно повысить точность увеличением числа разрядов, можно исхитрится и считать по другому пути, можно просто терпеть. :)

denpopov
17.01.2015, 17:46
Destr, Всё что ты написал - правильно. Мир пикселей и целых чисел, он такой.

шо, даже pi=4?oO

shurik-ua
17.01.2015, 18:57
шо, даже pi=4?oO
прикинь )

denpopov
17.01.2015, 19:06
Сбилась гармония мира...

Arigato
23.04.2015, 20:16
Компьютерная графика – дело непростое. А уж векторная – вообще жесть.
Если абстрагироваться от ZX, то векторная графика ни разу не оперирует пикселями, потому указанные проблемы ее обходят стороной. Всю геометрию надо считать в вещественных значениях, а уже при визуализации переводить их в систему координат экрана, принтера и прочих устройств, которые способны что-то отображать.

Но с вещественной арифметикой возникают другие проблемы - пределы точности и погрешности вычислений. Тут тоже бывают весьма неожиданные вещи, которые идут вразрез с привычной нам математикой. Например, если взять прямую, свернуть ее в окружность, а затем найти длину полученной окружности, то не факт, что она будет равна длине исходной прямой :)

Lion17
24.04.2015, 11:30
Например, если взять прямую, свернуть ее в окружность, а затем найти длину полученной окружности, то не факт, что она будет равна длине исходной прямой

У прямой не может быть длины. Длина бывает у отрезков.

Arigato
24.04.2015, 21:36
Ну ладно, подловил.