typedef float point3[4];
Таким образом, с помощью четырехмерного массива можно ввести в программу представление в однородных координатах. Другой тип
typedef float point2[4];
позволяет рассматривать двухмерные графические объекты как частный случай трехмерных. Стандартные операции над геометрическими примитивами можно реализовать в виде набора функций. Такой подход используется в большинстве графических систем (в частности, GKS, PHIGS и OpenGL), однако он не позволяет избежать и определенных трудностей. Рассмотрим, например, проблему инициализации точки. В стандартной программе на языке С напрашивается воспользоваться для этого таким фрагментом кода:
point3 р*{1.0,2.0,3.0};
Объекты и геометрические преобразования
Но это повлечет за собой два нежелательных следствия. Во-первых, это приведет к смешиванию конкретной реализации и абстрактного типа данных. В результате программный код не будет переносим с одной графической системы на другую, т.е. будет зависеть от конкретной реализации. Во-вторых, при такой инициализации "за кадром" остается вопрос, представление в какой системе координат или в каком фрейме формируется этим кодом.
Первую проблему можно решить, разработав спецификацию набора функций, реализующих стандартные абстрактные операции, что избавит прикладного программиста от необходимости разбираться в деталях конкретной реализации. Например, инициализация точки может выполняться вызовом функции р = new_point3(1.0, 2.0, 3.0); и все операции также выполняются через вызовы специальных функций, как в приведенном ниже фрагменте:
point3 p,q;
vector3 v;
v = point_sub(p,q);
Вторая проблема на практике решается значительно сложнее, чем в теории. Как было показано раньше, представление некоторой точки имеет смысл только в том случае, если оно привязано к спецификации фрейма. Следовательно, один из возможных подходов - создать специальный тип данных frame. Графическая система должна позволить программисту либо использовать при определении точки фрейм, специфицированный по умолчанию, либо создать свой и указать, что новая точка "привязывается" к этому фрейму. Функции выполнения стандартных операций могут включать в качестве аргумента явную ссылку на определенный фрейм: