![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм молнии...
[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]Сомневаюсь я, что в варике молния есть прямоугольник с текстурой.