Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

opengl и динамические массивы   Найти похожие ветки 

 
zvb   (2005-06-28 07:42) [0]

требуется сваять нечто вроде 3d-редактора :)
как мне это видится: неограниченный массив точек в пространстве (x, y, z), массив треугольников, хранящий ссылки на эти точки (a1, b1, c1)
а теперь, внимание, вопрос(ы) :)
1) есть ли способ лучше?
2) читал о glnewlist(), можно/нужно ли привязать это?
3) можно пример грамотной работы с динамическими массивами? :)


 
XProger ©   (2005-06-28 09:08) [1]

1) есть. Хранить списки вершин списком.
2) зачем?
3)

var
Vertex : array of TVector;
...
function AddVertex(v: TVector): integer;
begin
SetLength(Vertex, Length(Vertex) + 1);
Result := Length(Vertex) - 1;
Vertex[Result] := v;
end;

function DelVertex(idx: integer): boolean;
var
i : integer;
begin
Result := false;
if (idx < 0) or (idx > High(Vertex)) then
Exit;
for i := idx to High(Vertex) - 1 do
Vertex[i] := Vertex[i + 1];
SetLength(Vertex, Length(Vertex) - 1);
Result := true;
end;

P.S. код не проверял


 
Sapersky   (2005-06-28 10:51) [2]

SetLength(Vertex, Length(Vertex) + 1);

В принципе правильно, но лучше перевыделять блоками, например, так:

// Arr is Delphi dymamic array (array of ...)
// array elements MUST NOT contain elements with automatic memory management,
// i.e. long strings, variants etc.
// this proc may not work in future Delphi versions
// (if dymamic array format will change)
procedure GrowArray(Var Arr; NewCount, ElSize : Integer; GrowKoeff : Single = 2);
Type
 TByteArr = array of Byte;
Var
 Capacity : Integer;
 PLength : PInteger;
begin
PLength := PInteger(Arr);
If (PLength <> nil) then begin
 Dec(PLength);
 If (NewCount <= PLength^) then Exit; // we fit to existing capacity, no need to grow

 Capacity := Round(PLength^ * GrowKoeff);
 If Capacity < NewCount then Capacity := NewCount;

 PLength^ := PLength^ * ElSize;
   // as we cast array to byte array, we need to temporarily convert
   // its length in bytes for correct reallocation
end else
 Capacity := NewCount; // was no array - just allocate NewCount elements

SetLength(TByteArr(Arr), Capacity * ElSize);

PLength := PInteger(Arr); Dec(PLength);
PLength^ := Capacity; // set length in elements
end;

Назвать это "грамотной" работой с массивами я бы не рискнул  - сплошное хакерство :) Зато работает с любыми (почти - см. комментарий в начале!) массивами.

Length(Vertex) в данном случае играет роль Capacity, так что реально используемую длину нужно хранить в отдельной переменной:

function AddVertex(v: TVector): integer;  
begin
Result := FVertexCount;
Inc(FVertexCount);
GrowArray(FVertices, FVertexCount, SizeOf(TVector));
FVertices[Result] := v;
end;


 
zvb   (2005-06-28 11:54) [3]

спасибо, попробую ;)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.04 c
4-1126174606
jeka_t
2005-09-08 14:16
2005.11.13
Есть ли функция, которая возвращает "Описание" в "Имени компьютер


14-1129952318
boriskb
2005-10-22 07:38
2005.11.13
Москвичи, прошу помощи.


4-1126446322
Still Swamp
2005-09-11 17:45
2005.11.13
Нужен счетчик времени... что ли?


4-1126512654
Bobby
2005-09-12 12:10
2005.11.13
Как перехватить момент отключения сетевого кабеля. WM_?????


11-1111562044
Uli
2005-03-23 10:14
2005.11.13
Обход компонент???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский