Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Алгоритм молнии...   Найти похожие ветки 

 
[dRake]   (2003-11-18 17:39) [0]

Кто нибудь делал молнию в игрушках? Поделитесь plz алгоритмом, а то что-то ничего путного придумать не могу ;) Варианты типа "рандомные точки и линии между ними" и "сходи на DELPHIGFX" н предлагать т.к. в первом случае получается довольно тупо >:), а на GFX"e в примере используется куча треугольников, что слишком тормознуто...  З.Ы. Юзаю PowerDraw, так что с различными эффектами вывода no problem ;)


 
miek ©   (2003-11-18 19:01) [1]

В известном примере Яна Хорна (ссылку не помню, но на его сайте должно быть) молнии это просто размытые линии более-менее случайного синего цвета. Скорее всего, ничего заковыристого в молнии нет. Ну, если не считать вспышки на заднем плане сцены.


 
miek ©   (2003-11-18 19:05) [2]

Если в 2D, то алгоритм такой может быть:
взять отрезок, мысленно разбить на X равных (для простоты) частей, запомнить точки разбиения, затем к каждой из них добавить рандомное смещение по обеим координатам. Начертить полупрозрачную ломаную через них.
Потом добавить еще меньший рандом ко всем координатам и начертить еще одну ломаную (более прозрачную) поверх старой. И так далее.


 
Mihey ©   (2003-11-18 22:39) [3]

miek всё верно говорит. В Ulead PhotoImpact есть эффект молнии, который имеет такие параметры, как ветвистость, толщина, величина свечения, изломанность. Так что ты на верном пути.


 
NailMan ©   (2003-11-20 11:48) [4]

Это делается через фракталы, типа как в Максе(по крайней маре в 2.0) был такой эффект.


 
MeF88 ©   (2003-11-20 14:11) [5]


> Это делается через фракталы, типа как в Максе(по крайней
> маре в 2.0) был такой эффект.

У мя статья есть, правда написана она Juster~-ом и будет размещена на моём сайте. Рассматривается два метода - фрактальный и один Rect с alpha-blend текстурой молнии, как это делалось в Warcraft3. Второй метод проще и эффективнее.
> З.Ы. Юзаю PowerDraw, так что с различными эффектами вывода
> no problem ;)

На самом деле там столько проблем...


 
cyborg ©   (2003-11-20 17:01) [6]

Сомневаюсь я, что в варике молния есть прямоугольник с текстурой.


 
MeF88 ©   (2003-11-20 17:25) [7]


> Сомневаюсь я, что в варике молния есть прямоугольник с текстурой.

Есть даже скрин, доказывающий это - там четко видно перекрытие этого recta с поверхностью land-а.


 
cyborg ©   (2003-11-20 17:27) [8]

Не понял, какое перекрытие там видно? Есественно молния на треугольниках основана, поэтому может утопать в земле, но это не значит, что молния есть прамоугольник (два треугольника).


 
MeF88 ©   (2003-11-20 17:32) [9]


> Не понял, какое перекрытие там видно? Есественно молния
> на треугольниках основана, поэтому может утопать в земле,
> но это не значит, что молния есть прамоугольник (два треугольника).

Я бы скрин привел - тогда бы ты понял, но здесь фотки выкладывать нельзя. Давай на мыло скину?


 
cyborg ©   (2003-11-20 17:37) [10]

Кидай.


 
[dRake]   (2003-11-21 04:18) [11]

>размещена на моём сайте.

Кинь ссылочку plz


 
MeF88 ©   (2003-11-21 11:55) [12]


> Кинь ссылочку plz

> будет размещена
Он у меня на стадии заполнения щас. Вот заполню и выложу на хостинге...


 
OSokin   (2004-04-05 19:50) [13]

Люди, я делаю проще - по двум осям. Привожу для полноэкранной программы.

var
 x,y:integer;
begin
 x:=random(Screen.Width+1);
 for y:=0 to Screeen.Height do begin
   Form1.Canvas.Pixels[x,y]:=clWhite;
   x:=x+((random(15) div 5)-1);
 end;
end;


 
TButton ©   (2004-04-05 23:56) [14]

re 13
это что?

вообще, miek сразу правильный ответ дал. я в свое время такую беду делал. разбиваем отрезок на n равных частей, придумываем рэндомное смещение (+-20% общей длины) и перпедикулярно отрезку смещаем точку. и т.д. и т.п.


 
Кулясов ©   (2004-04-06 00:41) [15]

Вот на Паскале, суть ясна:

Uses graph,crt;
Var gd,gm,mx,my,s,ugol,ougol,i:integer;

procedure flash(num,siz,x,y,x1,y1:integer);
var
numsiz,px,py:integer;
mnk,xoffs,yoffs,nx,ny,ugol,ugolw,i,o:integer;
begin
px:=x;
py:=y;
mnk:=1;
numsiz:=round(sqrt(sqr(x1 - x) + (y1 - y)) / num);
xoffs:=round((x1-x)/num);
yoffs:=round((y1-y)/num);
for i:=1 to num - 1 do
begin
 nx:=px+xoffs+(random(siz)*mnk);
 ny:=py+yoffs+(random(siz)*mnk*-1);
 setcolor(white);
 line(px,py,nx,ny);
 setcolor(lightblue);
 line(px+1,py+1,nx+1,ny+1);
 line(px-1,py-1,nx-1,ny-1);
 px:=nx;py:=ny;
 if mnk=1 then mnk:=-1 else mnk:=1;
end;
end;

Begin
gd:=detect;
InitGraph(gd,gm,"");
setcolor(1);
ugol:=1;
randomize;
for i:=1 to 1100 do
begin
 for s:=1 to 9 do
 begin
  mx:=round(cos((s*40)*pi/180)*150)+300;
  my:=round(sin((s*40)*pi/180)*150)+200;
  flash(39,10,mx,my,300,200);
 end;
cleardevice;
if keypressed then break;
end;
CloseGraph;
readkey;
End.


 
Leon ©   (2004-04-06 15:39) [16]

Вот так криво я делал молнию на канвасе (правда это статическая молния)
 TMol = record
   Pokolenie: Word;
   x0, y0, x,y      : integer;
   child1,
   child2   : PMol;
 end;

 TMolnia = class (TObject)
   Source: pMol;
   limit, minl, maxl, phi1, phi2, PrOfDie: integer;
   function CreateSegment(Parent: pMol): pMol;
 public
   constructor Create(x0, y0: integer;  {начало молнии}
                      _limit: byte = 5; {max число поколений}
                      _minl: byte = 35; _maxl: byte = 35; {l=lenght}
                      _phi1: integer = 45; _phi2: integer = 135;  {phi=phi}
                      _PrOfDie: byte = 20); {живучесть ветвей}
   destructor Destroy; override;

   procedure Draw(C: TCanvas; color: TColor; speed: integer);
 end;

implementation

{ TMolnia }

constructor TMolnia.Create(x0, y0: integer; _limit, _minl, _maxl: byte; _phi1,
 _phi2: integer; _PrOfDie: byte);
begin
 limit   := _limit;
 minl    := _minl;
 maxl    := _maxl;    {l=длина}
 phi1    := _phi1;
 phi2    := _phi2;    {phi=угол}
 PrOfDie := _PrOfDie; {антиживучесть ветвей}

 new(Source);
 Source^.x0        := x0;
 Source^.y0        := y0;
 Source^.x         := x0;
 Source^.y         := y0;
 Source^.Pokolenie := 0;
 Source^.child2    := nil;
 new(Source^.child1);
 Source^.child1    := CreateSegment(Source);
 {усё!}
end;

function TMolnia.CreateSegment(Parent: pMol): pMol;
var phi, l: real;
begin
 new(Result);
 Result^.x0 := Parent^.x;
 Result^.y0 := Parent^.y;
 phi := phi1 + Random((phi2-phi1)+1);
 l := minl + Random((maxl-minl)+1);
 Result^.x := Parent^.x + Round(l*cos(phi*Pi/180));
 Result^.y := Parent^.y + Round(l*sin(phi*Pi/180));
 Result^.Pokolenie := Parent^.Pokolenie + 1;

 if (Result^).Pokolenie >= limit then
   begin
     Result^.Child1 := nil;
     Result^.Child2 := nil;
     Exit; {конец}
   end;

 if((Result^).Pokolenie>2)and(Random(100)<PrOfDie)then
   result^.Child1 := nil
 else
   begin
     new(result^.child1);
     Result^.Child1 := CreateSegment(Result);{рекурсия!!!!}
   end;

 if{((Result^).Pokolenie>1)and}(Random(100)<PrOfDie)then
   result^.Child2 := nil
 else begin
   new(Result^.Child2);
   Result^.Child2 := CreateSegment(Result);{рекурсия!!!!}
 end;
end;

destructor TMolnia.Destroy;
 procedure KillSegment(Mol: pMol);
 begin
   if Mol.child1 <> nil then
     KillSegment(Mol.child1);
   if Mol.child2 <> nil then
     KillSegment(Mol.child2);
   dispose(Mol);
 end;
begin
 KillSegment(Source);
end;

procedure TMolnia.Draw(C: TCanvas; color: TColor; speed: integer);
 procedure DrawMol(Mol: pMol);
 var x, y: integer;
 begin
   if Mol = nil then
     Exit;
//    Sleep(Speed);
   x := Mol^.x0;//Mol^.Parent^.x;
   y := Mol^.y0;//.Parent^.y;
   C.MoveTo(x, y);
   x := Mol^.x;
   y := Mol^.y;
   if Mol.Pokolenie = 1 then
     C.Pen.Width := 4
   else if Mol.Pokolenie = 2 then
     C.Pen.Width := 2
   else
     C.Pen.Width := 1;
   C.LineTo(x, y);
   if Mol.child1<>nil then
     DrawMol(Mol.child1);
   if Mol.child2<>nil then
     DrawMol(Mol.child2);
 end;
begin
 C.Pen.Color := color;
 DrawMol(Source.child1);
end;


 
MeF88 ©   (2004-04-27 16:27) [17]

http://www.mirgames.ru/ - Статья "Фрактальные молнии"...

P.S
Сайт заполняю, но жутко медленно...


 
OSokin ©   (2004-06-24 18:21) [18]

TButton, а что ты еще хочешь с ученика, перешедшего этим летом в 9 класс???


 
GrayFace ©   (2004-06-24 19:06) [19]

OSokin   (05.04.04 19:50) [13]
>random(15) div 5
А чем random(3) не устраивает?
>TButton, а что ты еще хочешь с ученика, перешедшего этим летом в 9 класс???
Молнию.


 
ПсихЪ_клон   (2004-06-25 00:27) [20]

OFFTOPIC:

> MeF88 ©   (27.04.04 16:27) [17]

Только вчера читал, хотел ссылкой поделиться, но ты меня опередил... (:


 
OSokin ©   (2004-06-25 20:52) [21]

Вот я и выложил такой пример, какой мог. Извини, GrayFace, но я не знаю никаких фрактало и тому подобного.


 
GrayFace ©   (2004-06-27 03:20) [22]

Извини, OSokin, я тоже. Зато я знаю, что Random(3)=random(15) div 5.


 
OSokin ©   (2004-07-02 17:18) [23]

Просто число получается более случайным.


 
TButton   (2004-07-02 17:30) [24]

re 18
я ничего не хочу, когда я чего-то хочу я обращаюсь с просьбой.

re 23
случайность приблизительно одинаковая, неча выпендериваться 8)


 
OSokin ©   (2004-07-02 18:46) [25]

Ну, по привычке, еще с тех пор, когда начал писать на паскале и бейсике...
А так - дал что мог. Смотри [21]



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

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
3-1096739539
Сергей Бастрыгин
2004-10-02 21:52
2004.10.31
Сменить тип поля вместо CHAR на VARCHAR


14-1097644935
Демидович
2004-10-13 09:22
2004.10.31
Первообразная


1-1097675832
Неуловимый Джо
2004-10-13 17:57
2004.10.31
перевод Integer в 4-ре char`а


1-1097530297
Ezhik
2004-10-12 01:31
2004.10.31
Ход конём


1-1098102176
MikePol
2004-10-18 16:22
2004.10.31
Возвращаемое значение