Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Алгоритм молнии...


Страницы:   1 2

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

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


OSokin   (2004-07-02 18:46:00) [1]

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


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

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

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


OSokin   (2004-07-02 17:18:00) [3]

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


GrayFace   (2004-06-27 03:20:00) [4]

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


OSokin   (2004-06-25 20:52:00) [5]

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


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

OFFTOPIC:

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

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


GrayFace   (2004-06-24 19:06:00) [7]

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


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

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


MeF88   (2004-04-27 16:27:00) [9]

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

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


Leon   (2004-04-06 15:39:00) [10]

Вот так криво я делал молнию на канвасе (правда это статическая молния)
 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;


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

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

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.


TButton   (2004-04-05 23:56:00) [12]

re 13
это что?

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


OSokin   (2004-04-05 19:50:00) [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;


MeF88   (2003-11-21 11:55:00) [14]


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

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


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

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

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


cyborg   (2003-11-20 17:37:00) [16]

Кидай.


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


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

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


cyborg   (2003-11-20 17:27:00) [18]

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


MeF88   (2003-11-20 17:25:00) [19]


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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо