Шаг 134 - Графика, функции GDI и реальные данные - Первый взгляд на проблему

Все функции GDI в качестве параметров используют тип данных INT, но если Вы работаете с данными других типов а это вполне реально так как данные для программ типа САПР или ГИС могут оперировать данными отличными от INT то возникает интересная ситуация. Нам нужно как то приводить эти данные к INT. Давайте посмотрим на рисунок ниже:

134_1.gif (3745 b)

Итак, область экрана и функции рисования на нем использую INT. Наши данные DOUBLE. Плюс к этому есть масштаб просмотра векторных данных. Если мы захотим выводить подобные данные, то мы должны использовать какой то переводной коофициент для того что бы область значений попала в область INT. Предположим, что есть данные:

0.02 
0.03

Это линия. При конвертации в INT это число будeт 0 и так до тех пор пока коофициент не станет >100, только с этого момент мы линию как то сможет увидеть на экране. Если мы захоти что то нарисовать то после рисования нам нужно будет реальные полученные цифры в INT поделить на этот коофициент. Тогда мы получим тип данных DOUBLE и сможем эти данные отразить:

134_2.gif (3351 b)

В координаты экрана и назад коэффициент совершенно одинаковый, но противоположный при противоположных операциях. Если бы данные были очень большие, то пришлось бы сначала делить, а потом умножать. Одна из идей здесь заключается в этом коэффициенте. Но он имеет один эффект, точность ввода новых данным будет прямо соответствовать этому коэффициенту. Но это еще не все. Можно применять и другой коэффициент:

134_3.gif (2345 b)

Представим данные типа:

600.23456767434544
600.23544534656326

Есть шанс, что мы никогда не достигнем нужной точности до последнего знака. Так как размер INT ограничен. Но саму эту точность можно увеличить просто отняв у этих чисeл 600 и тогда они превратятся в:

0.23456767434544
0.23544534656326

И мы сможем, как минимум на 3 знака эту точность поднять при вводе своих данных. Соответственно есть второй тип коэффициента, который не изменять область значений, а просто ее смещает. И все равно есть возможность потери точности при таких преобразованиях. Если число очень большое до запятой и после запятой типа

2343251536244373577635738.3676538754687549337939737

То обеспечить точность ввода соответственно точности этого числа мы не сможем, по крайней мере, такими методами.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 04.11.2001