![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
var
VertexCount: Integer; Vertex: array of TVector; procedure LoadWorld(Filename: String); var F: TextFile; begin AssignFile(F, Filename); Reset(F); while not Eof(F) do begin SetLength(Vertex, VertexCount+1); ReadLn(F, Vertex[VertexCount].X, Vertex[VertexCount].Y, Vertex[VertexCount].Z); Inc(VertexCount); end; CloseFile(F); end; Как её изметить, чтобы можно было загружать файл типа... a.k.a по три триагла в строчку! ..... -4.270096 -2.520900 -6.080324 4.475884 2.932476 -6.080324 4.475884 -2.520900 -6.080324 ..... -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Конкретизируй вопрос для таких недоумков, как я. А то ничего непонятно.
И в твоем случае надо однозначно пользоваться связными списками, а не массивом, которому в каждой итерации надо реаллокацию делать. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Смотри: функция выше читает файл типа
..... -4.270096 -2.520900 -6.080324 4.475884 2.932476 -6.080324 4.475884 -2.520900 -6.080324 ..... А мне нужно, чтобы читала ..... -4.270096 -2.520900 -6.080324 4.475884 2.932476 -6.080324 4.475884 -2.520900 -6.080324 ..... где .... - это тоже числа p.s не связанные списки и прочее не надо... у меня всё держится на дин массивах! А то прикручу и нифига работать не будет! %-) -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| stron |
|
|||
![]() Консультант ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1654 Регистрация: 17.7.2003 Где: Питер Репутация: нет Всего: 36 |
Либо я чего-то не понял, либо поменяй readln на read (хотя я наверное не понял!!)
А ещё в начале я бы обнулил VertexCount -------------------- подписи нет |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
А лучше было бы если бы файл был бы типизорованным: var F: File of TVector
-> читать в цикле таким образом : Read(f, Vertex[VertexCount]) Можно будет переделать и по 3 вертекса за 1 read, только тогда файл надо делать нетипизированным - но зачем тебе это, объясни? -------------------- С уважением, г-н Посол. |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Я согласен с господином :p0s0l. В типизированном файле все твои вертексы будут занимать одно и то же количество байт (32 бит с одинарной точностью и 64 с двойной). Так намного удобнее будет с ними работать. Тем блолее, что чтение и запись будет происxодить на порядок быстрее.
На счет массивов: если ты пользуешься функциями :OpenGL (как я понял) для построения "мира", которые как параметр получают массив вертексов, то даже в таком случае быстрее будет считать в список и по нему сделать массив и переписать туда вертексы. Дело в том, что когда ты делаешь каждый раз выделение памяти с сохранением предыдущих данных, то сначала выделяется новый кусок памяти, потом туда переписываются данные из старого массива, и старый массив уничтожается. Ты прикинь сколько раз он обращается к памяти! Это получится (n^2)/2, где n - количество записей. А если ты сделаешь, как я сказал - сначала запишешь в список, а потом в массив - то получится 2n. Конечно, если решить неравенство: n*n/2<2n |*2 n*n-4n<0 n(n-4)<0 4>n>0 Вот так, значит когда количество вертексов (0~4), то твой способ более эффективен, в остальных случаях - мой. Я думаю, что количество вертексов у тебя, ну никак не меньше 20. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
На счет SetLength - можно где-нибудь хранить кол-во вертексов, и сделать один раз перед циклом setlength, а в цикле убрать...
-------------------- С уважением, г-н Посол. |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Точно! Например, если фаил типизированный, то (скажем по 32 бит на вертекс) делим его размер на 4 и получаем кол-во вертексов. Тогда это решит проблему. Но опять же файл должен быть типизированный...
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Вернее лучше делить надо на SizeOf(TVertex):
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Хорошо, а как теперь это изьять из vertex? У меня это было так
var Triangle: array [0..2] of TVector; for i := 0 to (VertexCount - 1) div 3 do begin Triangle[0] := Vertex[i * 3]; Triangle[1] := Vertex[i * 3 + 1]; Triangle[2] := Vertex[i * 3 + 2]; end; нужно, чтобы так оно и было как сдесь представлено, а то мне придётся очень много кода заново переписывать!!!! %-( -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Чтo-то тут не то... У тебя что массив треугольника (Triangle) все время перезаписывался? Как-то странно у тебя логика построена...
Да и вообще твой цикл можно записать так: for i := 0 to VertexCount-1 do Triangle[i mod 3] := Vertex[i]; Но смысла в этом цикле мало. Скажи, что ты пытаешься сделать и в чем твои затруднения. Не боись твой код никому не продадим. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
И вообще, если будешь делать типизированный файл, и если у тебя мир и модели представлены только треугольниками, то можно писать/читать сразу треугольниками за один Read/Write - тогда var F : File of TTriangle...
А цикл-то и вправду интересный... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
Ребята! Вы можете просто ответить на вопрос?
Оптимизировать будем позже! %-) >>А цикл-то и вправду интересный... потом выводятся треугольники glBegin(GL_TRIANGLES); gltexcoord2d(0,0); glVertex3fv(@Triangle[0]); gltexcoord2d(2,0); glVertex3fv(@Triangle[1]); gltexcoord2d(0,2); glVertex3fv(@Triangle[2]); glEnd; -------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Цикл можно оставить без изменений.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| Sniper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 511 Регистрация: 8.5.2002 Репутация: нет Всего: 2 |
neutrino Наконецто вы меня поняли! %-))))
-------------------- "Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный". Кен Томпсон, создатель Unix |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |