Почему-то начал просыпаться уже даже не в 7:30, как до этого, а аж в 6 утра. =О.о=
Затарился на лето кедами, шортами и футболками. Завтра, наверное, побегаю с утра во дворе соседней школы - не за компом ж сидеть с утра.
Кстати, о компах. Недавно нашла на меня ностальгия и вместо брождения по Москве я сел покодить ту-самую-лабу по ИГС. Да-да, которую я так давно начал писать. Ну и написал процедуру, которая обходит вершины полигона на поверхностной сетке, причем параметризация алгоритма реализована через шаблоны. Метод умеет гулять как в объектном пространстве, так и в пространстве проекций (это побочное следствие получилось

), обрабатывает 4 случая замкнутости поверхности (не замкнутая, замкнута по одной оси, замкнута по второй оси, замкнута по обоим осям), а так же зохавывает выполняемую процедуру, инкапсулированную в класс (в принципе можно было передавать указатель на глобальный метод, но тогда были бы сложности с возвращаемым значением). В качестве параметров метод зохавывает указатель на начало обхода в сетке и структуру с параметрами сетки. Дешево, сердито и кавайно.
Немного кода для интересующихся// вид пространства, где выполняется обход
enum Space_Type { object, projection };
Обьявляем свойства пространств
// общий шаблон свойств - т.с. значение по-умолчанию
template <Space_Type>
struct Space_Traits;
// указываем структуру координат для объектного пространства и пространства проекций
template <>
struct Space_Traits <object>
{
typedef Coord3D::Coord_Data CoordT;
};
template <>
struct Space_Traits <projection>
{
typedef Coord2D::Coord_Data CoordT;
};
Обьявление карты поверхности
template <Space_Type E>
struct VertexMap
{
typename Space_Traits<E>::CoordT *Vertices;
unsigned int x;
unsigned int y;
VertexMap () : Vertices ( 0 ), x ( 0 ), y ( 0 ) {}
~VertexMap ()
{
if ( Vertices != 0 )
{
delete [] Vertices;
Vertices = 0;
}
}
};
// Вид полигона (в ячейке квадратной сетки сделаны 2 полигона)
enum Polygon_Type { UpperPolygon, LowerPolygon };
// вид замыкания поверхности
enum Closure_Type { Bidirect, Horizontal, Vertical, None };
Основной метод обхода
template <template <Space_Type> class, Space_Type, Polygon_Type, Closure_Type>
struct Surface_Walker;
// для каждого вида полигона указываем свой метод обхода
template <template <Space_Type> class Polygon_Function, Space_Type E, Closure_Type closure>
struct Surface_Walker <Polygon_Function, E, UpperPolygon, closure>
{
static typename Polygon_Function<E>::ReturnT Build (
typename Space_Traits<E>::CoordT* vertice,
VertexMap<E> const & map )
{
unsigned int vert_num = vertice - map.Vertices; // vertice number
__vertice<E> vert ( vertice, vert_num );
typename Space_Traits<E>::CoordT *vert1, *vert2, *vert3;
vert1 = vert.ptr;
vert2 = MoveRight<E, closure> ( vert, map );
vert3 = MoveDown<E, closure> ( vert, map );
return Polygon_Function<E>::execute ( vert1, vert2, vert3 );
}
};
template <template <Space_Type> class Polygon_Function, Space_Type E, Closure_Type closure>
struct Surface_Walker <Polygon_Function, E, LowerPolygon, closure>
{
static typename Polygon_Function<E>::ReturnT Build (
typename Space_Traits<E>::CoordT* vertice,
VertexMap<E> const & map )
{
Polygon<E> res;
unsigned int vert_num = vertice - map.Vertices; // vertice number
__vertice<E> vert ( vertice, vert_num );
typename Space_Traits<E>::CoordT *vert1, *vert2, *vert3;
vert1 = vert.ptr;
MoveRight<E, closure> ( vert, map );
vert2 = MoveDown<E, closure> ( vert, map );
vert3 = MoveLeft<E, closure> ( vert, map );
return Polygon_Function<E>::execute ( vert1, vert2, vert3 );
}
};
Вызываемые в обходе функции должны иметь определение возвращаемого типа, а также статический метод execute ( ... )
// метод построения полигона
template <Space_Type E>
struct BuildPolygon
{
typedef Polygon<E> ReturnT;
static Polygon<E> execute (
typename Space_Traits<E>::CoordT* &vertice1,
typename Space_Traits<E>::CoordT* &vertice2,
typename Space_Traits<E>::CoordT* &vertice3 )
{
return Polygon<E> ( vertice1, vertice2, vertice3 );
}
};
Если надо, подробнее опишу, как это все работает. Но, думаю, можно разобраться уже и сейчас.ЗЫ: Хочу велик... я очень хочу велик!..
Нельзя мне в МТГ играть. Как и в любые другие игры. Я - персона легко увлекающаяся и в увлечении легко забываю обо всем. А мне кроме игры нужно о многом думать. :/
А вот на велике никакие пробки не страшны. Плюс, это таки спорт.