forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Загрузка картинок (http://forum.boolean.name/showthread.php?t=16480)

m_512 12.03.2012 20:35

Загрузка картинок
 
Помогите с кодом.

Для дипломной работы нужно сделать мелкую вещь на блице.
А точнее, маленькую комнату с картинами на стене.
Картины должны грузиться из папки.

В общем, как сделать?
Есть папка, в нее нужно кидать JPG'и
Есть 15 loadmesh (модели картин)

Нужно сделать так, что бы из папки брались картинки и рандомно применялись к моделям картин, причем если картинок больше чем нужно, брались наугад из них 15 без повторений, а если меньше, в случайном порядке повторялись.
Причем файлы картинок могут называться как угодно.

impersonalis 12.03.2012 22:48

Ответ: Загрузка картинок
 
Надеюсь, не опоздал!
Простыня та-ды-дыщь:

Функция загрузки (она только составляет список имеющихся картинок в директории):
InputFolder имя директории
del_prev флаг - удалить ли уже прочитанную ранее инфу
возвращаемое значение - кол-во найденных (за этот вызов функции) файлов
Код:

Function InputDirRead%(InputFolder$,del_prev%=True)
        If del_prev Then Delete Each tFILE
        Local D%=ReadDir(InputFolder)
        Local FileName$
        Local FullFileName$
        Local TotalC%=0
        While True
                FileName=NextFile(D)
                If FileName="" Exit
                FullFileName=InputFolder+"\"+FileName
                If FileType(FullFileName)=1
                        Local EXT3$,EXT4$
                        ;будем рассматривать лишь файлы с расширением длиной 3 и 4 символа
                        EXT4=Upper(Right(FileName,4))
                        EXT3=Upper(Right(FileName,3))
                        Local EXT$=""
;туто можно настроить поддеркжу форматов - сделано топорно, ибо под жёсткое ТЗ
                        If EXT3="BMP" Or EXT3="JPG" Or EXT3="PNG" Or EXT3="GIF"
                                EXT=EXT3
                        ElseIf EXT4="JPEG"
;меня бесит расширение JPEG, потому в информацию о файле пропишу его как JPG
                                EXT="JPG"
                        EndIf
;если расширение определено - информация о файле будет добавлена
                        If EXT<>""
                                Local F.tFILE=New tFILE
                                F\FullFileName=FullFileName
                                F\FileUEXT=EXT
                                F\FileShortName=FileName
                                F\ID=TotalC+1
                                TotalC=TotalC+1
                        EndIf
                EndIf
        Wend
        CloseDir(D)
        Return TotalC
End Function

Собственно экземпляр инфы о файле:
Код:

Type tFILE
        Field FullFileName$;абсолютное (с именем папки, переданной в функцию загрузки) имя файла
        Field FileUEXT$;расширение файла (в верхнем регистре)
        Field FileShortName$;имя файла (с расширением)
        Field ID%;индекс файла при чтении (после перемешивания первый прочитанный файл может оказаться в конце)
End Type

это тоже понадобиться (сюда мы потом переместим структуры для более удобной работы)
Код:

Dim LIST.tFILE(0)
После работы - очищаем информацию
Код:

Function InputDirDeRead()
        For f.tFILE=Each tFILE
                Delete f
        Next
        Dim LIST(0)
End Function

Функция выгрузки считанной инфы в массив, для работы (перемешивание)
cnt -кол-во объектов (чтобы их не пересчитывать)
Код:

Function tFILE2LIST(cnt%)
        Dim LIST(cnt)
        Local i=1
        For f.tFILE=Each tFILE
                LIST(i)=f
                i=i+1
        Next
End Function

После выгрузки в массив, вызываем эту функцию для перемешивания содержимого
cnt -кол-во объектов
Код:

Function LISTrandomize(cnt%)
        If cnt<2 Return
        Local tmp.tFILE
        Local factor%=cnt*2.0;количество перестановок - побирается на вкус; у меня - кол-во файлов х 2
       
        Local A%=1;первый файл будет гарантировано участвовать в перемешивании
        Local B%=Rand(1,cnt);практика показала, что 1-ый файл слишком часто оставался нетронутым
        For i=1 To factor
;такая модель перестановок может (с уменьшающейся вероятностью вообще ничего не переставить)
; см подробнее: http://forum.boolean.name/showthread.php?t=15658

                tmp=LIST(A)
                LIST(A)=LIST(B)
                LIST(B)=tmp
                A%=Rand(1,cnt)
                B%=Rand(1,cnt)
        Next
End Function

Получить файл
I -индекс текущего файла
Код:

Function GetNextFile.tFILE(I%)
;думаешь: чо за тупая функция? просто у меня файл перед взятием его получал дополнительную информацию в свои поля
        Return LIST(I)
End Function

Демо:
Код:

Dim LIST.tFILE(0)
Global TCnt=InputDirRead("Pic");загрузим информацию о файла в папке Pic
TCnt=TCnt+InputDirRead("Pic2",False);догрузим информацию из папки Pic2
;...

Global ReadIndx%=TCnt+1;текущий читаемый индекс
tFILE2LIST(TCnt);выгружаем информацию в массив (вернее - указатели* сохраняются в массив для удобства: удалять экземпляры нельзя пока)
;...

While True;некоторый цикл получения случайных картинок
        If ReadIndx>TCnt;если уже перебрали весь список - перемешаем его заново и начнём сначала
                LISTrandomize(TCnt)
                ReadIndx=1
        EndIf
        Local file.tFILE=GetNextFile(ReadIndx);получить указатель* на структуру, содержащую информацию о файле
ReadIndx=ReadIndx+1
;...
Wend
InputDirDeRead();очистим

Собственно, выполнишь 15 итераций цикла из демки. На каждой итерации грузишь файл
Код:

Loadtexture(file\FullFileName)
и накладываешь на N-ый меш.
И да:
Цитата:

Нужно сделать так, что бы из папки брались картинки и рандомно применялись к моделям картин, причем если картинок больше чем нужно, брались наугад из них 15 без повторений, а если меньше, в случайном порядке повторялись.
Причем файлы картинок могут называться как угодно.
Причём повторяться (в случае "а если меньше") они будут минимальное число раз. Т.е. если у тебя 14 картинок (а мешей - 15), то повторений будет 2 (на двух мешах одна и та же текстура).

Ну - а у меша, сделать именованный полигон, с корректно выставленными uv координатами. Загрузить меш, раскопировать его на 15 объектов - всё очевидно.

m_512 12.03.2012 23:23

Ответ: Загрузка картинок
 
Супер! Огромное спасибо!

impersonalis 12.03.2012 23:28

Ответ: Загрузка картинок
 
Цитата:

Сообщение от m_512 (Сообщение 222602)
Супер! Огромное спасибо!

Код:

ReadIndx=ReadIndx+1
в демо забыл дописать. теперь (обновил пост) должно работать

Harter 13.03.2012 00:37

Ответ: Загрузка картинок
 
impersonalis, респект!

Алекс_Нос 08.05.2012 11:23

Ответ: Загрузка картинок
 
А можно ли еще и узнать размер картинки прежде чем она загрузится? Если кто знает подскажите, буду благодарен.:)

impersonalis 11.06.2012 02:06

Ответ: Загрузка картинок
 
2m_512
ну и где рассказ про диплом? Оценка, демонстрация приложения?

radiobutton 11.06.2012 03:16

Ответ: Загрузка картинок
 
защиты через полторы недели.:)

ABTOMAT 11.06.2012 03:38

Ответ: Загрузка картинок
 
Цитата:

Сообщение от radiobutton (Сообщение 230049)
защиты через полторы недели.:)

Откуда информация?

radiobutton 11.06.2012 03:57

Ответ: Загрузка картинок
 
Цитата:

Сообщение от ABTOMAT (Сообщение 230050)
Откуда информация?

у меня так :)

moka 11.06.2012 14:14

Ответ: Загрузка картинок
 
[s]Значит у всех так.[/s]
Неадекватность шкалит всё выше и выше..

Gector 11.06.2012 15:00

Ответ: Загрузка картинок
 
Цитата:

Сообщение от radiobutton (Сообщение 230051)
у меня так :)

А у нас в инсте защита с прошлого месяца.

radiobutton 11.06.2012 21:41

Ответ: Загрузка картинок
 
Цитата:

Сообщение от MoKa (Сообщение 230068)
[s]Значит у всех так.[/s]

Помоему логично, что раз я написал, что "у меня так", значит имел ввиду, что у других может и не так. Даже если и не имел в виду, то не отрицал.

Пост до этого же, можно трактовать, как "Ну как бы рано еще, не у всех защиты прошли, а если и прошли, то это дело еще и отметить нада, а потом уже на форуме постить."

Цитата:

Неадекватность шкалит всё выше и выше..
Но тем не менее твои выводы основываются большей частью на субъективном мнении об авторе постов. Будь объективен. Смотри шире и глубже.

Alex__Noc 14.06.2012 20:46

Ответ: Загрузка картинок
 
Ну и ???
А можно ли узнать размер картинки прежде чем она загрузится?????????????????????????????????????

Dzirt 14.06.2012 20:51

Ответ: Загрузка картинок
 
Цитата:

Сообщение от Alex__Noc (Сообщение 230366)
Ну и ???
А можно ли узнать размер картинки прежде чем она загрузится?????????????????????????????????????

Мужик, почини клавиатуру.:)


Часовой пояс GMT +4, время: 21:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot