decl Float:point[2][3]; //0 - предыдущая позиция, 1 - текущая позиция decl direction[2][4] = {{1, -1, -1, 1}, {-1, -1, 1, 1}}; //Векторы направления (для прохождения по часовой стрелке)
point[0][0] = center[0]+size[0]/2; //Ставим предыдущую позицию point[0][1] = center[1]+size[1]/2; //в правый верхний угол нижнего основания point[0][2] = center[2];
for (new i=0;i<4;i++) { point[1][0] = center[0]+(direction[0][i]*size[0]/2); //С помощью векторов направления point[1][1] = center[1]+(direction[1][i]*size[1]/2); //Находим следующую позицию по часовой стрелке point[1][2] = center[2];
CreateBeam(point[0], point[1]); //Чертим линию (две соседние точки нижнего основания)
point[0][2] += size[2]; //Поднимаем текущие две точки point[1][2] += size[2]; //На высоту параллелепипеда
CreateBeam(point[0], point[1]); //Чертим линию (две соседние точки верхнего основания)
point[0][0] = point[1][0];//Предыдущую позицию переставляем point[0][1] = point[1][1];//под текущую, чтобы найти следующую позицию point[0][2] = point[1][2] - size[2];//с новой итерацией цикла
CreateBeam(point[0], point[1]); //Чертим линию (вертикальная) }
На рисунке обозначены точки вершин и их координаты относительно центра. Если приглядеться, можно заметить, что знаки чередуются (По часовой стрелке: ++, -+, --, +-). На основании этого был составлен массив направлений для вычисления следующей позиции в зависимости от итерации цикла. После вычисления новой точки, предыдущая соединяется с новой, потом их позиции поднимаются на высоту верхнего основания и соединяются там. Таким образом мы экономим итерацию цикла, чтобы не пробегать еще и по верхнему основанию. Далее "предыдущая" точка (та, что не новая) смещается под новую для последующего соединения и образования вертикального ребра. Итерация завершается, и в начале следующей итерации выбирается новая точка. Цикл повторяется 4 раза и полностью обрисовывает параллелепипед.
Гости не могут скачивать файлы
Сообщение отредактировал BarD - Воскресенье, 12.06.2016, 12:16:38