|
Основной форум Сюда все проблемы связанные с программированием. |
21.06.2012, 23:02
|
#1
|
Нуждающийся
Регистрация: 24.04.2012
Сообщений: 57
Написано 7 полезных сообщений (для 10 пользователей)
|
Анимация "салют"
Помогите запрограммировать салют, вот как на картинке:
|
(Offline)
|
|
21.06.2012, 23:05
|
#2
|
Нуждающийся
Регистрация: 24.04.2012
Сообщений: 57
Написано 7 полезных сообщений (для 10 пользователей)
|
Ответ: Анимация "салют"
Попробывал переписать готовый код с байсика, но устественно ничего не из этого не вышло:
Program cube; var i,dir1,ix,iy,vel,rnd:integer; x: array[0..50] of integer; y: array[0..50] of integer; xv: array[0..50] of integer; yv: array[0..50] of integer; ox: array[0..50] of integer; oy: array[0..50] of integer; procedure main; Begin For i:= 0 to 50 do begin x[i]:= 0; y[i]:= 0; dir1:=trunc(Rnd * 6.28); vel:=trunc(Rnd * 5 + 1); xv[i]:= trunc(Sin(dir1) * vel); yv[i]:= trunc(Cos(dir1) * vel); end; ix:=Rnd * 320; iy:=Rnd * 200; For i:= 0 to 50 do begin drawLine(ox[i] + ix, oy[i] + iy,x[i] + ix, y[i] + iy); ox[i]:= x[i]; oy[i]:= y[i]; x[i]:= x[i] + xv[i]; y[i]:= y[i] + yv[i]; drawLine(x[i] + ix, y[i] + iy,x[i] + ix, y[i] + iy); repaint; delay(100); end; end; begin repeat SetColor(0, 0, 0); FillRect(0, 0, GetWidth, GetHeight); setcolor(255,255,255); main; repaint; delay(100); until keyToAction(getKeyClicked) <> GA_NONE; End.
|
(Offline)
|
|
25.06.2012, 01:02
|
#3
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Анимация "салют"
Ну а что тут создавать?
Делаешь массив точек, у каждой из которых есть параметры x, y и угол поворота.
Затем создаешь в случайно выбранной точке экрана штук эдак 50 точек, и даешь каждой случайный угол поворота.
Затем вспоминаешь алгебру, и двигаешь циклически точки.
???
PROFIT!!!
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
|
(Offline)
|
|
25.06.2012, 20:25
|
#4
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Анимация "салют"
да это же... вектора!
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
26.06.2012, 00:53
|
#5
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Анимация "салют"
потом разрезаем нашую прямую на кусочки по 10 и решаем систему уравнений, где первое - уравнение нашей прямой, а второе
sqr(x)+sqr(y)=sqr(m)
|
wtffff
достаточно сделать массив "частиц", где у каждой имеем позицию/скорость, позицию задаём в одной точке, скорость рандомную (в адекватных пределах), дальше обрабатываем массив - меняем позицию по имеющейся скорости+гравитации, затухаем скорость.
это подходит для точек, чтобы сделать салют из линий, можно хранить предыдущую позицию каждой частицы и тупо рисовать линию из предыдущей в новую.
если необходима одинаковая длина линий, то имея эти же две позиции, можно найти нормализованный вектор от одной к другой, через atan2 вычислить угол, повернуть точки линии через sin/cos им.
|
(Offline)
|
|
26.06.2012, 01:44
|
#6
|
Оператор ЭВМ
Регистрация: 23.06.2012
Сообщений: 31
Написано 9 полезных сообщений (для 9 пользователей)
|
Ответ: Анимация "салют"
Эмм все так описывают как будто это дважды два... ну так что код-то не покажете как составить?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.06.2012, 00:56
|
#7
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Анимация "салют"
А для чего голова нужна? Чтобы думать!
Голова+MidletPascalHelp+разжеванный алгоритм+руки=счастие.
Если Вас будут вести за ручку, Вы ничему не научитесь. Знать<>уметь.
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
Последний раз редактировалось PassCall, 27.06.2012 в 00:58.
Причина: Орфографический шайтан
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо PassCall за это полезное сообщение:
|
|
27.06.2012, 09:23
|
#8
|
Оператор ЭВМ
Регистрация: 23.06.2012
Сообщений: 31
Написано 9 полезных сообщений (для 9 пользователей)
|
Ответ: Анимация "салют"
Сообщение от Yadro
Попробывал переписать готовый код с байсика, но устественно ничего не из этого не вышло
|
Кинь сюда исходник этого "фейерверка", попробую передедать под MP.
Я с basic`ом более менее лучше дружу, чем с тем же MP...
|
(Offline)
|
|
27.06.2012, 10:19
|
#9
|
Оператор ЭВМ
Регистрация: 23.06.2012
Сообщений: 31
Написано 9 полезных сообщений (для 9 пользователей)
|
Ответ: Анимация "салют"
Кстати нашел код под FreeBasic
Dim As Short x(50), y(50), xv(50), yv(50), ox(50), oy(50)
Dim As Short dir1,vel,tx,ty,c,done
For t As Integer = 0 To 50
x(t) = 0
y(t) = 0
dir1 = Rnd * 6.28: vel = Int(Rnd * 5) + 1
xv(t) = Sin(dir1) * vel
yv(t) = Cos(dir1) * vel
Next
'
tx = Int(Rnd * 320)
ty = Int(Rnd * 200)
c = 31: done = 0
Locate 1, 6: Print "Explosions by Andrew L. Ayers"
Locate 23, 8: Print "Press any key to exit demo"
Do
For t As Integer = 0 To 50
Line (ox(t) + tx, oy(t) + ty)-(x(t) + tx, y(t) + ty), 0
ox(t) = x(t): oy(t) = y(t)
x(t) = x(t) + xv(t)
y(t) = y(t) + yv(t)
Line -(x(t) + tx, y(t) + ty), Int(Rnd*15)
Next
c = c - 1: If c < 16 Then done = 1
If Inkey <> "" Then done = 2
Sleep 25
Loop Until done
Loop Until done = 2
Начал переделывать под MP, дописал до середины и решил проверить - вышла фигня. Цикл for что ли не заканчивается? VB полегче этого mobilepascalя будет по мне...
Program explosions;
var vel,tx,ty,c,done,i,dir1:integer;
var x:array[0..49] of integer;
var y:array[0..49] of integer;
var xv:array[0..49] of integer;
var yv:array[0..49] of integer;
var ox:array[0..49] of integer;
var oy:array[0..49] of integer;
begin
for i:= 1 to 50 do
begin
x[i]:=0;
y[i]:=0;
dir1:=trunc(random(1)*628);
vel:=trunc(random(1)*5)+1;
xv[i]:=trunc(sin(trunc(dir1))*vel);
yv[i]:=trunc(cos(trunc(dir1))*vel);
end;
tx:=trunc(random(1)*320);
ty:=trunc(random(1)*200);
c:=31;
done:=0;
drawtext('Explosions by Andrew L. Ayers',5,5);
drawtext('Press any key to exit demo',5,25);
repaint;
delay(5000);
end.
Цикл почему то не заканчивается, добавляю в него тогда такую строку "if i:=50 then break;" мпаскаль ругается и пишет, что это нелогично. Подскажите куда копать-то.
|
(Offline)
|
|
27.06.2012, 10:49
|
#10
|
Нуждающийся
Регистрация: 24.04.2012
Сообщений: 57
Написано 7 полезных сообщений (для 10 пользователей)
|
Ответ: Анимация "салют"
Antirock, Да я этот код и переделывал, а ошибка в том, что цикл должен начинаться с 0 до 49, как и массив.
|
(Offline)
|
|
27.06.2012, 11:31
|
#11
|
Оператор ЭВМ
Регистрация: 23.06.2012
Сообщений: 31
Написано 9 полезных сообщений (для 9 пользователей)
|
Ответ: Анимация "салют"
Надо бы сам оригинальный код затестить, может он нерабочий
Опять не пашет, полностью переписал под MP.
Program explosions;
var vel,tx,ty,c,done,i,dir1:integer;
var x:array[0..50] of integer;
var y:array[0..50] of integer;
var x2:array[0..50] of integer;
var y2:array[0..50] of integer;
var xv:array[0..50] of integer;
var yv:array[0..50] of integer;
var ox:array[0..50] of integer;
var oy:array[0..50] of integer;
begin
for i:= 0 to 50 do
begin
x[i]:=0;
y[i]:=0;
dir1:=trunc(random(1)*628);
vel:=trunc(random(1)*5)+1;
xv[i]:=trunc(sin(trunc(dir1))*vel);
yv[i]:=trunc(cos(trunc(dir1))*vel);
end;
tx:=trunc(random(1)*160);
ty:=trunc(random(1)*180);
c:=31;
done:=0;
drawtext('Explosions by Andrew L. Ayers',5,5);
drawtext('Press any key to exit demo',5,25);
for i:= 0 to 50 do
begin
drawline(ox[i]+tx,oy[i]+ty,x[i]+tx,y[i]+ty);
repaint;
x[i]:=x[i]+xv[i];
y[i]:=y[i]+yv[i];
x2[i]:=x[i]+tx;
y2[i]:=y[i]+ty;
drawline(x2[i],y2[i],x[i]+tx,y[i]+ty);
repaint;
c:=c-1;
end;
repeat
delay(100)
until (c<16);
end.
Ввел новые переменные-массивы x2 и y2 для хранения координат точек, так как в оригинальном коде идет такая схема где "-" означает, что первая точка имеет координаты(x,y), а вторая точка будет последняя отрисованая, в нашем случае это x[i]+tx и y[i]+ty. Ну так где господа PassCall и Mr_F_, долго будете "включать умняка"? Может подскажете?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.06.2012, 11:45
|
#12
|
Нуждающийся
Регистрация: 24.04.2012
Сообщений: 57
Написано 7 полезных сообщений (для 10 пользователей)
|
Ответ: Анимация "салют"
Надо бы ещё randomize перед каждым random.
Как доберусь до компа попробую запилить этот код.
"Ввел новые переменные-массивы x2 и y2 " получается, что рисуется точка:
drawline(x2[i],y2[i],x[i]+tx,y[i]+ty);
Последний раз редактировалось Yadro, 27.06.2012 в 15:50.
|
(Offline)
|
|
27.06.2012, 13:12
|
#13
|
Оператор ЭВМ
Регистрация: 23.06.2012
Сообщений: 31
Написано 9 полезных сообщений (для 9 пользователей)
|
Ответ: Анимация "салют"
Держи =) Дальше сам, а то мозги поплыли уже. Вроде легкий код, но эти массивы... Написал с нуля, сам.
Program explosions;
Var
xc,yc,ugol,dlina,i:integer;
x2:array[0..50] of integer;
y2:array[0..50] of integer;
begin
dlina:=30; ///устанавлием длину отрезков, которые будут отрисовываться и составлять наш вейерверк
xc:=getwidth/2; ///устанавливаем "фейерверк" в центр экрана
yc:=getheight/2; ///предыдущий комментарий
for i:= 0 to 50 do
begin
x2[i]:=xc+trunc(sin(random(360))*dlina); \\\придумываем угол, находим син\кос и находим координаты точек
y2[i]:=yc+trunc(cos(random(360))*dlina); \\\придумываем угол, находим син\кос и находим координаты точек
drawline(xc,yc,x2[i],y2[i]); \\\выводим в буфер
end;
repaint; \\\выводим на экран
delay(5000); \\\ждем
end.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.06.2012, 14:38
|
#14
|
Оператор ЭВМ
Регистрация: 23.06.2012
Сообщений: 31
Написано 9 полезных сообщений (для 9 пользователей)
|
Ответ: Анимация "салют"
Собрался с мозгами доделал код:
Program explosions;
Var
dlina,i,skorost:integer;
x2:array[0..50] of integer;
y2:array[0..50] of integer;
x:array[0..50] of integer;
y:array[0..50] of integer;
begin
dlina:=10;
skorost:=5;
for i:= 0 to 50 do
begin
x[i]:=getwidth/2;
y[i]:=getheight/2;
end;
for i:= 0 to 50 do
begin
x2[i]:=x[1]+trunc(sin(random(360))*dlina);
y2[i]:=y[1]+trunc(cos(random(360))*dlina);
drawline(x[i],y[i],x2[i],y2[i]);
end;
repeat
repaint;
delay(skorost);
for i:= 0 to 50 do
begin
setcolor(255,255,255);
drawline(x[i],y[i],x2[i],y2[i]);
setcolor(0,0,0);
x[i]:=2*x2[i]-x[i];
y[i]:=2*y2[i]-y[i];
drawline(x[i],y[i],x2[i],y2[i]);
end;
repaint;
delay(skorost);
for i:= 0 to 50 do
begin
setcolor(255,255,255);
drawline(x[i],y[i],x2[i],y2[i]);
setcolor(0,0,0);
x2[i]:=2*x[i]-x2[i];
y2[i]:=2*y[i]-y2[i];
drawline(x[i],y[i],x2[i],y2[i]);
end;
repaint;
until (false);
end.
Немного подправить код, как нужно и все.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.06.2012, 14:40
|
#15
|
Нуждающийся
Регистрация: 24.04.2012
Сообщений: 57
Написано 7 полезных сообщений (для 10 пользователей)
|
Ответ: Анимация "салют"
ОГРОМНОЕ СПАСИБО!!!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:41.
|