Как нарисовать трехмерную сеть из кубиков с векторными ребрами
Как нарисовать трехмерную сеть из кубиков с векторными ребрами??? На каждую вершину 3 вектора направляеются, а 2 отправляются.
Как рисовать? Под winapi? OpenGL? DirectX?
Если рисовать под winapi, то придется узнать об операторах проецирования (об этом почти в любом учебнике по аналитической геометрии). DirectX и OpenGL отгородят от математики, но придется либо вручную разбираться с инициализацией, либо использовать готовые проекты (OpenGL могу посоветовать уроки от NeHe).
С векторами потом разберемся.
А в чем проблема? В заполнении координат вершин? Если так, то нужно 3 цикла по каждой компоненте. Как хранятся данные? В виде одномерного массива? В виде трехмерного массива?
Как понять 3 цикла по каждой компоненте? Если можно код приведите плиз, на любом языке...желательно на Си.
Хранить буду в базе данных, но это не важно.мне главное иметь большую сетку из, скажем, 1000 вершин.
функция создает одномерный массив вершин, с координатами в узлах сетки. Сетка заключена в кубике со сторонами равными 1. Индекс вершины в узле, характеризуемом параметрами i, j, k вычисляется по формуле index = i + j*xDiv + k*xDiv*yDiv.
void razbienie(int nn, int kk, int mm)
{[INDENT]
int xDiv = nn; // |__|__|__| nn = 3
int yDiv = kk; // разбиение
int zDiv = mm;//
int N = xDiv*yDiv*zDiv; // количество вершин
vertex* VMassiv = new vertex[N]; // vertex имеет координаты
int k;
int j;
int i;
for(k = 0; k < zDiv; k++)
{
[INDENT]for(j = 0; j < yDiv; j++)
{
[INDENT]for(i = 0; i < xDiv; i++)
{
int index;
index = i + j*xDiv + k*xDiv*yDiv;
VMassiv[index].x = (float)i/(xDiv-1);
VMassiv[index].y = (float)j/(yDiv-1);//нормировка на 1
VMassiv[index].z = (float)k/(zDiv-1);
}[/INDENT] }[/INDENT] }[/INDENT]}
[/FONT]
Там могут быть некоторые неточности, потому что код пришлось кастрировать.
Но проще сделать трехмерный массив и аналогичным образом, но без вычисления индекса, а напрямую вроде VMassiv[j][k].x = ...
Для формирования ребер, нужно лишь понять какие вершины (с какими индексами) соединены и в каком направлении.
Можно, например создать структуру
struct edge
{
vertex* v1;
vertex* v2;
edge* next;
};
И сформировать список, каждый элемент которого будет представлять направленное соединение.
Цитата:
VMassiv[index].x = (float)i/(xDiv-1);
VMassiv[index].y = (float)j/(yDiv-1);//нормировка на 1
VMassiv[index].z = (float)k/(zDiv-1);
VMassiv[index].y = (float)j/(yDiv-1);//нормировка на 1
VMassiv[index].z = (float)k/(zDiv-1);
вместо этого я написал
VMassiv[index].x = i;
VMassiv[index].y = j;
VMassiv[index].z = k;
Так как при нормировке на 1, при количестве вершин в 1000, координаты получаются не совсем правильные...
А от куда формула индекса???
Ну если подумать, как заполняется большой куб вершинами, то так и должно получиться. Сначала представляешь, как заполнить двухмерный массив, а потом этими "слоями" заполняешь трехмерный. Но я эту формулу где-то еще видел, на форуме на каком-то, тема была что-то вроде представление многомерных массивов в виде одномерного
Sashok123, тебе огромное спасибо!!!