|
|||
|
Форумы на X3DGames.NET.Ru: Обсуждение и обмен информацией.
Справка по использованию форума.
Вы не зашли.
Что имеется в виду под реальными формулами? учет всех сил действующих на тело? а зачем их создавать - есть newton. Все равно быстрее и правильнее не не напишешь. Или есть другие варианты?
Неактивен
к примеру есть расчёты пули с учётом ветра (отклонение) дальности - убойная сила , рекошет и т.д.
Конечно приятно когда всё сводится к реальной физике , а то в некоторых играх снайпера бъют с 5 км дальности и поподают прямо в точку и пуля снимает жизни с выстрела в упор.
Неактивен
Всем Привет! Зашёл по прикладному вопросу, побудило то, что программирование идёт на Basic, который существенно облегчает жизнь, т.к. все мнемоники команд говорящие сами за себя и не надо натужно вспоминать чего же делает та или иная команда...))) Ну это я по старой памяти, ещё от QBasic, но главное, что у Basic появились возможности 3D, 2D и прочие полезности. Вот эти полезности и понадобились, хотелось бы спросить имеются ли в языке следующие возможности... Вообще моя задача из плоскости физического динамического моделирования, всё уже есть кроме наглядного вывода результата на экран. Вывести надо последовательность кадров (1000*1000) пикселов, ну просто фильм короче показать, для этого имеется трёхмерный массив точек соответственно во высоте (y), ширине (x) экрана и по каждому конкретному кадру (t). Вариантов решения я вижу два:
1) Запихнуть этот массив точек в видеофайл по точкам, там avi например, а потом воспроизвести соответственно на любом плеере.
2) Запихнуть этот массив в память (жёсткий диск), а из него через буфер в оперативке, т.е. некоторое количество значений массива постоянно подкачивать в оперативку, чтобы из неё без задержек можно было бы с заданным fps выводить видеопоток через ту же видеокарту посредствам DirectX того же, который в DarkBasic есть.
Вот и хочу спросить у знающих язык, есть ли такие возможности, оформленные как-нить по простенькому, в виде функций там или команд специально для этого созданных? Или простыми методами эти вопросы в DarkBasic тоже нельзя решить и надо опять копаться в литреатуре, этот вариант конечно тогда не подходит, т.к. я лишь инженер-исследователь, да ещё и не программист, по ночам мрзилок на 1000 страниц на английском языке (вроде ActivX) не читаю...
Вот... ![]()
Отредактированно bugfly (18-03-2011 17:47:51)
Неактивен
Если речь идет именно о видеопотоке, а не о слайдшоу, то только 1-й вариант здесь сработает.
Что касается массива точек, то при попытке создать видеоролик, он окажется невероятно гигантским по объему хранения на жестком диске, и очень медленно будет воспроизводиться примитивными командами, которые отрисовывали бы каждую точку.
Тем не менее, теоретически можно создать такое слайд-шоу, отрисовывая каждую точку командой dot, считывая данные из массива, обрабатываемого в цикле. на DarkBasic, я считаю, это сделать несложно. Скорость вывода целого кадра размером 1000 на 1000 точек будет весьма не быстрой.
Если пренебречь временем загрузки массива из файла, то на построение массива точек может уйти до нескольких секунд на среднего уровня Code 2 Duo процессоре, что демонстрирует нижеприведенный пример кода:
sync on
set window layout 0,0,0
set window position 1,1
maximize window
set display mode 1024,768,32
t=timer()
for x=1 to 1024
for y=1 to 768
dot x, y, RGB(x/5,y/3,y/3)
next y
next x
t=timer()-t
sync
Print "time taken: ", t
sync
wait keyПодходит такой вариант только для загрузки статических картинок.
Неактивен
Alecx, К сожалению отрисовка функцией рисования точки на экране не помогает, ни на одном языке, которые я с ходу пробовал. Получается жутко медленно, видимо эта команда отрисовки точки не оптимизированна для выдачи видео ни в одном языке, получается единственный выход - воспользоваться уже оптимизированными фишками, например записать по точкам фильм в avi (кодек скажем XVid или ещё какой), а потом воспроизвести. Благо фильмы 1000*1000 пикселей спокойно воспроизводятся. Вот и хотел узнать нет ли функции записи информации именно в аvi файл.
Ну а если нет, то есть ли возможность функционального общения с DirectX, т.е. возможность задать ему функцию по которой он будет в 3D строить изображение.
Дело в том, что только форматы видео (типа avi) и DirectX (но для этого нужен непосредственный доступ к отрисовке по функциям, зависимостям) могут вывести графику быстро, т.к. над ними мучалось целое поколение прграммистов, насоздавали всяких ускорителей вывода в видеокартах, самому конечно такое не поднять, проще найти среду где уже организован доступ к этим возможностям (желательно функциональный или командный...))) Вот это собственно и ищу...
Неактивен
Функции записи в AVI-файл нет. Что имеется в виду под построением изображения в 3D не очень понял. DarkBasic умеет загрузить 3D модели из X, 3DS и других форматов файлов, а также создавать трехмерные примитивы - кубы, сферы, конусы и т.п., текстурировать их, применять различные эффекты, манипулировать ими в пространстве. Чего-либо похожего на построение объектов посредством указания отдельных вершин в дарке нет (для этого есть 3D модели).
Кстати, о массиве точек - если он трехмерный, то получается в нем не хранится информация о цвете? А если хранится, то массив еще мощнее, и уж точно какими-то точками рисовать такое изображение невозможно.
Думаю, что надо просто изучить формат BMP и сделать программу, которая запишет данные в статические картинки. После чего в каком-нибудь видеоредакторе соединить все эти картинки пследовательно и закодировать подходящим видеокодеком, чтобы видеоролик не занимал столь огромное место на жестком диске. Для этого потребуется немало вычислительных ресурсов и времени.
В целом весьма странная задача с записью точек в AVI (в том смысле, что надо еще откуда-то взять эти самые точки)...![]()
Неактивен
Alecx написал:
Думаю, что надо просто изучить формат BMP и сделать программу, которая запишет данные в статические картинки.
Хотя нет, на DarkBasic изучать формат BMP не придется. Здесь есть команды get image и save image, а также набор команд для обработки битмапов, загруженных на экран.
Неактивен
Alecx, Ок, поясню почему по точкам. Вообще задача построить интерференционную картину наложения волн от нескольких источников. Вот есть такая формула:
Эта формула показывает какая амплитуда сигнала будет на некоем расстоянии x от источника сигнала в некий момент времени t, т.е. значение амплитуды зависит от двух переменных.
Во внешнем цикле перебирается переменная времени от 0 до t с шагом моделирования dt.
Во внутренних циклах при уже обозначенном времени отрисовываются все точки экрана, просто просчитывается расстояние от источника сигнала в пикселе (x,y) до всех пикселей экрана по теореме пифагора, подставляется соответственно в формулу вместо x, а t у нас уже задана во внешнем цикле и получаем амплитуды распространяющихся волн от источника сигнала во всех точках экрана (данная задача похожа вот на эту http://komp-model.narod.ru/gl-8.htm см. задачу 8.3) делается это для нескольких источников, т.е. для заданного во внешнем цикле времени t отрисовывается по нескольким формулам, ну разные источники ведь будут в разных местах, более того у них параметры будут другие (там длина волны, начальная фаза и т.д.), короче вот мы имеем несколько кадров распределения амлитуд по экрану от нескольких источников волн, потом их надо соответственно сложить, каждый соответствующий пиксель картины распределения волн с каждым другим пикселем другой картины волн от другого источника и т.д., чтобы получить общую картину наложения волн от всех источников. И это будет первый кадр, потом во внешнем цикле время сдвигается на dt и мы считаем второй кадр и т.д. пока весь фильм не сделаем. Программа должна быть вроде вот этой: http://paralostrov.rx22.ru/download/file.php?id=62
Но будет не два источника, а 33, тут не то что показать, такие чумовые расчёты нужно ещё провести. Ну это ладно, подождём часок-другой, посчитается, а вот как вывести, чтобы посмотреть нормально, без тормозов так и не придумывается пока. Вот...
Мдя неужто придётся мозг вскрывать вот этим http://www.paraview.org/
Там ведь учитаться...
Отредактированно bugfly (20-03-2011 06:15:44)
Неактивен
Видео файлы и файлы изображений отличаются не только тем что картинка одна, а видео - это последовательность этих картинок. Самое главное это то что видео закодировано так что например короткометражный ролик из последовательности картинок весит не несколько гигов, как это было бы без компрессии, а 10-15 мегов, в зависимости от степени сжатия.
Видео файлы использую сжатие, а не просто набор картинок.
Неактивен
Miha, Да и неважно, пусть будет большой, это же моделирование, главное чтобы он потом никуда не терялся на винчестере, чтобы стереть можно было... А так посмотрел моделирование и всё... А если чего понравится можно и MovAvi каким-нить дожать...
Неактивен
!!!!!Если интересна вся история вопроса, то вот тут всё с самого начала http://area.mediahouse.ru/index.php?sho … 4&st=0 В первом посте там вся суть, ну из дальнейших подвижек можно назвать вроде как рабочую dll (http://forum.thegamecreators.com/?m=for … 27&b=5), которая сможет записать Avi, но с этим ещё надо разбираться, ещё даже не смотрел...
А вот собственно формула http://area.mediahouse.ru/index.php?act … amp;id=131
А вот код к ней:
sync on
A0#=10
Beta#=0.01
Lambda#=2
Fi#=0
V#=10
Xposition=10
Yposition=10
CvetPix=0
EstGeomZatuh=0
EstZatuhVsrede=0
Amplituda#=0
Rasstoyanie#=0
GeomZatuh#=0
ZatuhVsrede#=1
Currenttime#=1
Steptime#=1
Allframe=1
set window layout 0,0,0
set window position 1,1
maximize window
set display mode 1024,768,32
t=timer()
FOR I=0 TO Allframe
Currenttime#=I*Steptime#
for x=1 to 1024
for y=1 to 768
Rasstoyanie#=SQRT ((Xposition-x)^2+(Yposition-y)^2)
if EstGeomZatuh=0 THEN GeomZatuh#=1
if EstGeomZatuh=1 THEN GeomZatuh#= (1/(4*3.14*(Rasstoyanie#)^2))
if EstZatuhVsrede=0 THEN ZatuhVsrede#=1
if EstZatuhVsrede=1 THEN ZatuhVsrede#=EXP (-Beta#*Currenttime#)
Amplituda#=A0#*ZatuhVsrede#*GeomZatuh#*sin ((2*3.14/Lambda#)*(Rasstoyanie#-(Lambda#*Fi#/360)-V#*Currenttime#))
if Amplituda#>=0 Then CvetPix= (155 + INT (Amplituda#*100/A0#))
if Amplituda#<0 Then CvetPix= (100 + INT (Amplituda#*100/A0#))
dot x, y, RGB(CvetPix,CvetPix,CvetPix)
next y
next x
t=timer()-t
sync
Print "time taken: ", t
sync
wait key
NEXT IЭто распределение амплитуд пока только для одного источника, там все параметры в начале задаются и потом отрисовывается распределение амплитуд вокруг точки источника колебаний. По кадрам, там можно много кадров задать через Allframe и через пробел смотреть новые кадры, ну т.е. ждать пока отрисуется...)))
Да! Очень хотелось бы узнать как в DarkBasic-е оформляются подпрограммы, собственные функции, как они же вызываются, как в них передавать переменные, т.е. всё по подпрограммам и собственным функциям, а то когда надо будет отрисовать несколько источников проще это через подпрограмму или собственную функцию реализовать, чем писать сто раз одинаковый код для всех источников.
Это первое! И второе! Как осуществляется работа с массивами, тут опять же прикладной аспект, параметры разных источников проще забить в массив, а потом из массива постепенно скармливать в подпрограмму, кроме того отрисовку одного кадра очень просто положить в массив (1024, 768), чтобы в этот массив сначала положить амплитудв кадра для первого источника, потом в этот же массив к каждому элементу добавлять уже амплитуды распределения от второго источника, для третьего и т.д. для всех источников, что есть в наличии...
Отредактированно bugfly (29-03-2011 14:49:12)
Неактивен
В DarkBasic'е есть и подпрограммы, и массивы, и пользовательские функции.
Массив создается командой dim, функция - командами function() - endfunction, подпрограммы - gosub с последующим указанием меток.
Командой function() можно указать параметры (переменные, которые будут передаваться в функцию). Endfunction умеет возвращать переменную после обработки функцией.
Еще есть пользовательские типы в DBPro (type). Очень удобны в сочетании с массивами.
Массивы обрабатываются функциями как глобальные переменные. Т.е. их не требуется передавать в функцию. Функция и программа обращаясь к массиву имеют дело с одним и тем же набором данных. Обычные же переменные функция "не знает", кроме как если задать их с помощью ключевого слова global.
Неактивен
Спасибо, Alecx!!! Буду разбираться...
Особенно многообещающими выглядят пользовательские типы в DBPro (type), если разберу, будет круто, тогда всё проще будет писать через массивы... ![]()
Отредактированно bugfly (30-03-2011 00:21:53)
Неактивен
Во, ещё насущная проблема возникла! Есть ли в DarkBasic'е функция, возвращающая значение максимальной из нескольких переменных?
Неактивен
Мдя, ну вот примерно так...
sync on
DIM kadr(1024, 768)
DIM ParamIstoch#(9,33)
rem Parametrs
rem A0 - max amplituda
ParamIstoch#(1,1)=10
ParamIstoch#(1,2)=10
ParamIstoch#(1,3)=10
ParamIstoch#(1,4)=10
ParamIstoch#(1,5)=10
ParamIstoch#(1,6)=10
rem Beta - koefficient zatuh v srede
ParamIstoch#(2,1)=0.01
ParamIstoch#(2,2)=0.01
ParamIstoch#(2,3)=0.01
ParamIstoch#(2,4)=0.01
ParamIstoch#(2,5)=0.01
ParamIstoch#(2,6)=0.01
rem Lambda - dlina volni
ParamIstoch#(3,1)=0.1
ParamIstoch#(3,2)=0.2
ParamIstoch#(3,3)=0.3
ParamIstoch#(3,4)=0.1
ParamIstoch#(3,5)=0.2
ParamIstoch#(3,6)=0.3
rem Fi - nachalniy sdvig fazi
ParamIstoch#(4,1)=0
ParamIstoch#(4,2)=0
ParamIstoch#(4,3)=0
ParamIstoch#(4,4)=0
ParamIstoch#(4,5)=0
ParamIstoch#(4,6)=0
rem V - skorost rasprostraneniya volni
ParamIstoch#(5,1)=10
ParamIstoch#(5,2)=10
ParamIstoch#(5,3)=10
ParamIstoch#(5,4)=10
ParamIstoch#(5,5)=10
ParamIstoch#(5,6)=10
rem X position istochnika kolebaniy
ParamIstoch#(6,1)=13
ParamIstoch#(6,2)=50
ParamIstoch#(6,3)=86
ParamIstoch#(6,4)=86
ParamIstoch#(6,5)=50
ParamIstoch#(6,6)=13
rem Y position istochnika kolebaniy
ParamIstoch#(7,1)=29
ParamIstoch#(7,2)=92
ParamIstoch#(7,3)=29
ParamIstoch#(7,4)=71
ParamIstoch#(7,5)=8
ParamIstoch#(7,6)=71
rem Est(1)/Net(0) Geometricheskoe Zatuhanie
ParamIstoch#(8,1)=0
ParamIstoch#(8,2)=0
ParamIstoch#(8,3)=0
ParamIstoch#(8,4)=0
ParamIstoch#(8,5)=0
ParamIstoch#(8,6)=0
rem Est(1)/Net(0) Zatuhanie V srede
ParamIstoch#(9,1)=0
ParamIstoch#(9,2)=0
ParamIstoch#(9,3)=0
ParamIstoch#(9,4)=0
ParamIstoch#(9,5)=0
ParamIstoch#(9,6)=0
rem Variables
rem Tekushaya rasschetnaya Amplituda modelirovaniya
Amplituda#=0
rem Rasstoyanie ot Istochnika kolebaniy do Tekushego Pixelya v Kotorom Rasschitivaetsya Amplituda
Rasstoyanie#=0
rem Vspomogatelnaya perevrnnaya dlya rasscheta Geometricheskogo Zatuhaniya
GeomZatuh#=0
rem Vspomogatelnaya perevrnnaya dlya rasscheta Zatuhaniya V srede
ZatuhVsrede#=0
rem Tekushee vremya modelirovaniya (podstavlyaetsya v formulu)
Currenttime#=0
rem shag modelirovaniya
Steptime#=0.1
rem kolichestvo risuemih kadrov
Allframe=100
rem Risuem(1)/NeRisuem(0) rasprostranenie fronta
RisuemFront=1
rem Cvet Pixelya, nuzgen dlya Zadachi gradaciy serogo
CvetPix=0
rem kolichestvo zadeistvovannih v modelirovanii Istochnikov
NumberOfIstochnikov=6
rem Summarnoe Znachenie Amplitudi v odnom Pixele odnogo kadra ot vseh Istochnikov
SUM#=0
rem Eto Flag, nuzgen dlya otrisovki fronta volni (iznachalno = 0)
ZahodNaProschetAmplitudi=0
rem Maximalno vozmzgnaya Avplituda
MAMP#=0
rem Razmer otrisovivaemogo pri modelirovanii ekrana
RazreshenieEkranaPoX=100
RazreshenieEkranaPoY=100
FOR G=1 TO NumberOfIstochnikov
MAMP#=MAMP#+ParamIstoch#(1,G)
NEXT G
set window layout 0,0,0
set window position 1,1
maximize window
set display mode 1024,768,32
FOR I=1 TO Allframe
Currenttime#=I*Steptime#
for x=1 to RazreshenieEkranaPoX
for y=1 to RazreshenieEkranaPoY
SUM#=0
ZahodNaProschetAmplitudi=0
FOR Q=1 TO NumberOfIstochnikov
Rasstoyanie#=SQRT ((ParamIstoch#(6,Q)-x)^2+(ParamIstoch#(7,Q)-y)^2)
if RisuemFront=1 Then GOTO FRONT ELSE GOTO NOFRONT
FRONT:
if ParamIstoch#(5,Q)*Currenttime#<=Rasstoyanie# Then GoTO PROLONG
NOFRONT:
if ParamIstoch#(8,Q)=0 THEN GeomZatuh#=1
if ParamIstoch#(8,Q)=1 THEN GeomZatuh#= (1/(4*3.14*(Rasstoyanie#)^2))
if ParamIstoch#(9,Q)=0 THEN ZatuhVsrede#=1
if ParamIstoch#(9,Q)=1 THEN ZatuhVsrede#=EXP (-ParamIstoch#(2,Q)*Currenttime#)
Amplituda#=ParamIstoch#(1,Q)*ZatuhVsrede#*GeomZatuh#*sin ((2*3.14/ParamIstoch#(3,Q))*(Rasstoyanie#-(ParamIstoch#(3,Q)*ParamIstoch#(4,Q)/360)-ParamIstoch#(5,Q)*Currenttime#))
SUM#=SUM#+Amplituda#
ZahodNaProschetAmplitudi=1
PROLONG:
NEXT Q
if ZahodNaProschetAmplitudi=1 Then GoTO AMP Else GoTO TFRONT
AMP:
if SUM#>=0 Then CvetPix= (155 + INT (SUM#*100/MAMP#))
if SUM#<0 Then CvetPix= (100 + INT (SUM#*100/MAMP#))
kadr(x, y)=CvetPix
GoTO VIHOD
TFRONT:
kadr(x, y)=1000
VIHOD:
next y
next x
sync
for x=1 to RazreshenieEkranaPoX
for y=1 to RazreshenieEkranaPoY
if kadr(x, y)=1000 Then dot x, y, RGB(200,0,0)
if kadr(x, y)<1000 Then dot x, y, RGB(kadr(x, y),kadr(x, y),kadr(x, y))
next y
next x
sync
NEXT I
wait keyТолько отрисовывает так чтобы смотреть можно было только 100*100, если подправить 1024*768, то можно годами сидеть...
Теперь бы с запихиванием в avi разобраться, которое вот здесь (http://forum.thegamecreators.com/?m=for … 27&b=5)...
Хотябы bmp-шку как сделать по точкам, минуя её прорисовку на экране, чтоб сразу в файл из массива писать никто не знает?
Отредактированно bugfly (03-04-2011 20:14:24)
Неактивен
Итак, запостил проблему вот тут: http://forum.thegamecreators.com/?m=for … 0&pd=y
Поступило предложение использовать следующее:
LOCK PIXELS
FirstPixel = GET PIXELS POINTER()
...
...
...
UNLOCK PIXELS
SYNC
Но я не знаю как этим пользоваться, помогите если кто знает как!
Вот смотрите я так понял что команда LOCK PIXELS переводит память всех точек экрана, которая в графической карте, в режим непосредственного доступа... Так?
Командой A = GET PIXELS POINTER() мы записываем в переменную A указатель на первый пиксель экрана, вернее указатель на ячейку памяти где хранится информация о том какой цвет выводит первый пиксель экрана. Ну это я предполагаю что всё так происходит по аналогии с указателями в других языках программирования. Теперь как мне посредством этого указателя обратиться к этой ячейке памяти и записать в неё другой цвет? unsure.gif
И ещё, как структурируются адреса указателей по остальным пикселям? Например если у нас экран 1024*768 то всего пикселов 786432 и вот если на первый пиксель указатель А, то на второй A+1, на третий A+2, на последний A+786432 или как-то иначе?
Вот такие пироги...
Отредактированно bugfly (08-04-2011 04:51:00)
Неактивен
Короче сделал прорисовку через указатели и обращение к памяти...
Получился вот такой способ заполнения экрана по точкам:
sync on set window layout 0,0,0 set window position 1,1 maximize window set display mode 1024,768,32 sync LOCK PIXELS pitch=get pixels pitch() FirstPixelPointer = GET PIXELS POINTER() for x=1 to 1024 for y=1 to 768 Addres = FirstPixelPointer + ((y-1) * pitch) + ((x-1) * 4) *Addres=RGB(x+y,x+y,x+y) next y next x UNLOCK PIXELS sync wait key
Применил его в своём коде... Да не забудьте скачать и установить DBProAVI.dll Так же можно не рисовать фронт, т.е. поставить DrawFront=0 это 120-я строка кода...
sync on
DIM frame(1024, 768)
DIM SourceParameters#(9,7)
Global Var AviW, AviH
`setup for *avi file
AviW=1024 : AviH=768 : ` set size video in pxl
make memblock 1,10 : delete memblock 1 : ` DBPorAvi plug-in work with memblocks
if file exist("test.avi") then delete file "test.avi" : ` delete old file
make avi "test.avi",25,AviW,AviH : ` create empty avi-file in same dir
rem Parametrs
rem A0 - max Source Amplitude
SourceParameters#(1,1)=10
SourceParameters#(1,2)=10
SourceParameters#(1,3)=10
SourceParameters#(1,4)=10
SourceParameters#(1,5)=10
SourceParameters#(1,6)=10
SourceParameters#(1,7)=10
rem Beta - coefficient of Environmental Attenuation
SourceParameters#(2,1)=0.01
SourceParameters#(2,2)=0.01
SourceParameters#(2,3)=0.01
SourceParameters#(2,4)=0.01
SourceParameters#(2,5)=0.01
SourceParameters#(2,6)=0.01
SourceParameters#(2,7)=0.01
rem Lambda - Wave length
SourceParameters#(3,1)=1
SourceParameters#(3,2)=2
SourceParameters#(3,3)=3
SourceParameters#(3,4)=1
SourceParameters#(3,5)=2
SourceParameters#(3,6)=3
SourceParameters#(3,7)=4
rem Fi - Phase shift
SourceParameters#(4,1)=0
SourceParameters#(4,2)=0
SourceParameters#(4,3)=0
SourceParameters#(4,4)=0
SourceParameters#(4,5)=0
SourceParameters#(4,6)=0
SourceParameters#(4,7)=0
rem V - Wave Velocity
SourceParameters#(5,1)=10
SourceParameters#(5,2)=10
SourceParameters#(5,3)=10
SourceParameters#(5,4)=10
SourceParameters#(5,5)=10
SourceParameters#(5,6)=10
SourceParameters#(5,7)=10
rem X position of Source
SourceParameters#(6,1)=231
SourceParameters#(6,2)=512
SourceParameters#(6,3)=792
SourceParameters#(6,4)=792
SourceParameters#(6,5)=512
SourceParameters#(6,6)=231
SourceParameters#(6,7)=512
rem Y position of Source
SourceParameters#(7,1)=222
SourceParameters#(7,2)=708
SourceParameters#(7,3)=222
SourceParameters#(7,4)=546
SourceParameters#(7,5)=60
SourceParameters#(7,6)=546
SourceParameters#(7,7)=384
rem Yes(1)/No(0) Geometric Attenuation
SourceParameters#(8,1)=0
SourceParameters#(8,2)=0
SourceParameters#(8,3)=0
SourceParameters#(8,4)=0
SourceParameters#(8,5)=0
SourceParameters#(8,6)=0
SourceParameters#(8,7)=0
rem Yes(1)/No(0) Environmental Attenuation
SourceParameters#(9,1)=0
SourceParameters#(9,2)=0
SourceParameters#(9,3)=0
SourceParameters#(9,4)=0
SourceParameters#(9,5)=0
SourceParameters#(9,6)=0
SourceParameters#(9,7)=0
rem Variables
rem calc amplitude
Amplitude#=0
rem distance from source to current pixel
Distance#=0
rem Attenuation in space because of spherical propagation of waves
GeometricAttenuation#=0
rem Attenuation because of Environment resistance
EnvironmentalAttenuation#=0
rem Calc Current time
Currenttime#=0
rem step of Current time
Steptime#=0.1
rem Number of All frames
Allframe=100
rem Draw(1)/NotDraw(0) Front
DrawFront=1
rem Pixel Color
PixColor=0
rem Number Of Sources
NumberOfSource=7
rem Sum of Amplitude from all sources in one pixel
SUM#=0
rem Flag Of Calc Front(1)/Not Calc Front(0)
FlagOfCalcFront=0
rem Max possible value of Amplitude
MAMP#=0
rem frame size
rem AviW=1024 - width (X)
rem AviH=768 - height (Y)
FOR G=1 TO NumberOfSource
MAMP#=MAMP#+SourceParameters#(1,G)
NEXT G
set window layout 0,0,0
set window position 1,1
maximize window
set display mode 1024,768,32
FOR I=1 TO Allframe
Currenttime#=I*Steptime#
for x=1 to AviW
for y=1 to AviH
SUM#=0
FlagOfCalcFront=0
FOR Q=1 TO NumberOfSource
Distance#=SQRT ((SourceParameters#(6,Q)-x)^2+(SourceParameters#(7,Q)-y)^2)
if DrawFront=1 Then GOTO FRONT ELSE GOTO NOFRONT
FRONT:
if SourceParameters#(5,Q)*Currenttime#<=Distance# Then GoTO PROLONG
NOFRONT:
if SourceParameters#(8,Q)=0 THEN GeometricAttenuation#=1
if SourceParameters#(8,Q)=1 THEN GeometricAttenuation#= (1/(4*3.14*(Distance#)^2))
if SourceParameters#(9,Q)=0 THEN EnvironmentalAttenuation#=1
if SourceParameters#(9,Q)=1 THEN EnvironmentalAttenuation#=EXP(-SourceParameters#(2,Q)*Currenttime#)
Amplitude#=SourceParameters#(1,Q)*EnvironmentalAttenuation#*GeometricAttenuation#*sin((2*3.14/SourceParameters#(3,Q))*(Distance#-(SourceParameters#(3,Q)*SourceParameters#(4,Q)/360)-SourceParameters#(5,Q)*Currenttime#))
SUM#=SUM#+Amplitude#
FlagOfCalcFront=1
PROLONG:
NEXT Q
if FlagOfCalcFront=1 Then GoTO AMP Else GoTO TFRONT
AMP:
if SUM#>=0 Then PixColor= (155 + INT (SUM#*100/MAMP#))
if SUM#<0 Then PixColor= (100 + INT (SUM#*100/MAMP#))
frame(x, y)=PixColor
GoTO EXITT
TFRONT:
frame(x, y)=1000
EXITT:
next y
next x
sync
LOCK PIXELS
pitch=get pixels pitch()
FirstPixelPointer = GET PIXELS POINTER()
for x=1 to AviW
for y=1 to AviH
Addres = FirstPixelPointer + ((y-1) * pitch) + ((x-1) * 4)
if frame(x, y)=1000 Then *Addres=RGB(200,0,0)
if frame(x, y)<1000 Then *Addres=RGB(frame(x, y),frame(x, y),frame(x, y))
next y
next x
UNLOCK PIXELS
sync
`get evry frame to *avi
get image 1,0,0,AviW,AviH,1
add image to avi 1
NEXT I
`Stop record and close *avi
close avi
wait keyИ опять медленно!!! Хммм... Но уже прогресс с каждым новым подходом скорость возрастает в разы... ![]()
Мож ещё кто чего-нить посоветует?
Отредактированно bugfly (11-04-2011 01:46:14)
Неактивен
А если разобраться как работает видео? И почему оно занимает к примеру 700 мб. продолжительностью в час с половиной?
Это ведь не реально... Если чередовать сжатые картинки пусть 800 х 600...
Специально только что сжал обоину в 75% в формате jpg у меня получился файл 114,804 кб.
В одной секунде 25 кадров.
114,804 * 25 = 3 620,1 и того почти 4 мегабайта в секунду... круто... умножив это на 90 минут... )))
А как же работают кодеки типа Mpeg,DivX или XviD?
Мы знаем что за одну секунду кадр особо не меняется и используя кодировщики Mpeg,DivX или XviD второй кадр несёт в себе лишь информацию изменения от первого кадра... Если делать видео в постоянном соотношении кадра от предыдущего, то появляются погрешности, мелкие сбои программы ... и иногда наблюдаются цветные кубы и наложение. Поэтому есть такое понятие как ключевые кадры, это тот самый оригинал картинки который обновляет видео поток.
И по теме немного...
Вывод пикселов в dot это зло ![]()
Я когда то писал прогу, экран состоял из пикселов которые состояли из имиджей размером 1х1 разного цвета. При помощи массива я выводил эти пикселы. И тем не менее для быстрой работы размер экрана пришлось уменьшить 300х200 (с учётом того что программа просчитывала по формуле)
Формула делала песок... пикселы сыпались в горки, некоторые были статические... было прикольно, но проц на все 100% выкладывался.
Неактивен
Я прочитала всю тему и мало что поняла ![]()
Неактивен