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

Вниз

алгоритм "Плазма"   Найти похожие ветки 

 
miek ©   (2004-05-23 20:12) [0]

Пытаюсь реализовать алгоритм псевдофрактала "Плазма". Работает нормально, но на рисунке видны некрасивые горизонтальные и вертикальные линии. Как от них избавиться? В фотошопе и других программах ничего подобного нет.
Вот демо-программа:
http://www.miek.narod.ru/plasma.zip


 
Sapersky   (2004-05-24 13:03) [1]

Отчасти помогает замена

if (x1<=x0) or (y1<=y0) then exit;

на

if (x1-x0<=1) or (y1-y0<=1) then exit;

К тому же и быстрее работает. Но "крестообразность" всё равно видна - чтобы её убрать, нужно как-то по-другому считать i. Я пробовал вместо умножения брать геометрическое расстояние:

i:=Round( 255 * Sqrt( (Sqr(x1-x0) + Sqr(y1-y0)) / (Sqr(Width) + Sqr(Height)) ) );

Крестообразность не исчезла, но результат получился довольно интересный - что-то вроде облаков...

Ещё. Предложение по поводу SpriteUtils. Чисто софтверную версию неплохо бы выпустить в качестве дополнения к FastLIB (в виде набора процедур). Сильно повысило бы юзабилити, правда. Собственно, я и этот пример, чтобы протестировать, переводил на FastDIB - ну не хочется мне ставить 6-й Дельфи, а потом изучать очередной класс-контейнер битмапа. И ломать голову, с чем его использовать: KOL - слишком экстремально, VCL - слишком неудобно и громоздко.
А FastLIB, кстати, за исключением использования класса, написан вполне в стиле KOL, и в то же время KOL не требует.
Ну и желательно перевести весь ассемблер в форму, понятную Delphi 5. Не только MMX - он и обычный asm кое-где не понимает. Где конкретно - могу выдать список.


 
Sapersky   (2004-05-24 13:30) [2]

Опс, ошибка вышла, тестировал с картинкой бинарных размеров. Для произвольных можно делать:

xd:=x1-x0; yd:=y1-y0;
if (xd<=0) or (yd<=0) or ((xd=1) and (yd=1)) then Exit;


 
Sapersky   (2004-05-24 13:31) [3]

Опс, ошибка вышла, тестировал с картинкой бинарных размеров. Для произвольных можно делать:

xd:=x1-x0; yd:=y1-y0;
if (xd<=0) or (yd<=0) or ((xd=1) and (yd=1)) then Exit;


 
miek ©   (2004-05-24 18:40) [4]

Кресты удалось победить, в осноном - с помощью большей примеси случайной величины:
_i:= plasmarandomness+(255-plasmarandomness)*( x1-x0)*(y1-y0) div (screen.Width*screen.height);
Вычислять расстояние по SQRT мне не хотелось, т.к. хотел встроить "Плазму" в Graffiti, а там каждая микросекунда на счету.

По SpriteUtils:
1) Использовать SU совместно с FastLib - нет проблем. Давай напишу версию NewDirectDrawRegion, только регион будет создаваться не над поверхностью, а над спрайтом TFastDIB. И овцы целы, и волки сыты. Переделывать саму библиотеку считаю неразумным, потому что мой подход к растру проще, быстрее и ресурсы кушает не так жадно.

>не хочется...изучать очередной класс-контейнер битмапа

Ничем не могу помочь. В отличие от фастлиба, SU несколько лучше документирована. Если уж и так не хочется, умываю руки.

>Ну и желательно перевести весь ассемблер в форму, понятную Delphi 5... Где конкретно - могу выдать список
2) Я не против. Давай список - сделаю. Только тестировать мне негде - нет у меня 5-й версии.


 
Sapersky   (2004-05-25 13:34) [5]

Давай напишу версию NewDirectDrawRegion, только регион будет создаваться не над поверхностью, а над спрайтом TFastDIB

Хм... была обертка одинарная, стала двойная... так? :) Ну попробуй, напиши, посмотрю, что получится.
А FastDIB можно приспособить к любому растру (в т.ч. поверхности DDraw) с помощью SetInterface без написания дополнительного кода.
И спецэффектов у него больше, пусть не супер-быстрых, но всё-таки :)
Всё-всё, молчу :)

Относительно ассемблера для D5... вот что ему не нравится:

1) Инструкции вида mul al,bl. Может быть, он считает, что mul можно делать только с eax, так что al нужно просто убрать? Аналогично - imul eax, op и т.п.
2) Несовпадение размеров типов, например, cmp  ax, transcolor, или cmp eax, word ptr transcolor
3) Возможно, и то, и другое: mul   al, [edi]
4) and   [edi], $FF000000 - не понял :(

Полный список - то есть, ещё не полный, судя по завершающему комментарию - в следующем сообщении.


 
Sapersky   (2004-05-25 13:38) [6]

[Error] SU2_alpha.inc(51): Invalid combination of opcode and operands
[Error] SU2_alpha.inc(54): Invalid combination of opcode and operands
[Error] SU2_alpha.inc(59): Invalid combination of opcode and operands
[Error] SU2_alpha.inc(62): Invalid combination of opcode and operands
[Error] SU2_alpha.inc(67): Invalid combination of opcode and operands
[Error] SU2_alpha.inc(70): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(266): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(269): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(274): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(277): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(285): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(330): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(334): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(339): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(343): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(348): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(352): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(402): Operand size mismatch
[Error] su2_spriteput.inc(407): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(409): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(415): Invalid combination of opcode and operands
[Error] su2_spriteput.inc(419): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(707): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(710): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(715): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(718): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(733): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(765): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(768): Invalid combination of opcode and operands
[Error] SU2_gamma.inc(773): Invalid combination of opcode and operands
[Error] SU2_scroll.inc(68): Invalid combination of opcode and operands
[Error] SU2_scroll.inc(338): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(72): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(74): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(80): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(84): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(108): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(110): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(116): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(120): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(160): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(163): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(168): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(171): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(176): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(179): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(219): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(222): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(227): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(230): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(235): Invalid combination of opcode and operands
[Error] su2_transpaint.inc(238): Invalid combination of opcode and operands


 
Sapersky   (2004-05-25 13:40) [7]

[Error] su2_resize.inc(414): Invalid combination of opcode and operands
[Error] su2_resize.inc(463): Invalid combination of opcode and operands
[Error] su2_resize.inc(473): Invalid combination of opcode and operands
[Error] su2_resize.inc(519): Invalid combination of opcode and operands
[Error] su2_resize.inc(570): Invalid combination of opcode and operands
[Error] su2_resize.inc(580): Invalid combination of opcode and operands
[Error] su2_resize.inc(1211): Operand size mismatch
[Error] su2_resize.inc(1213): Invalid combination of opcode and operands
[Error] su2_resize.inc(1263): Operand size mismatch
[Error] su2_resize.inc(1265): Invalid combination of opcode and operands
[Error] su2_resize.inc(1276): Invalid combination of opcode and operands
[Error] su2_resize.inc(1322): Operand size mismatch
[Error] su2_resize.inc(1324): Invalid combination of opcode and operands
[Error] su2_resize.inc(1376): Operand size mismatch
[Error] su2_resize.inc(1378): Invalid combination of opcode and operands
[Error] su2_resize.inc(1389): Operand size mismatch
[Error] su2_resize.inc(1391): Invalid combination of opcode and operands
[Error] su2_rotate.inc(504): Invalid combination of opcode and operands
[Error] su2_rotate.inc(506): Invalid combination of opcode and operands
[Error] su2_rotate.inc(512): Invalid combination of opcode and operands
[Error] su2_rotate.inc(516): Invalid combination of opcode and operands
[Error] su2_rotate.inc(567): Invalid combination of opcode and operands
[Error] su2_rotate.inc(570): Invalid combination of opcode and operands
[Error] su2_rotate.inc(575): Invalid combination of opcode and operands
[Error] su2_rotate.inc(578): Invalid combination of opcode and operands
[Error] su2_rotate.inc(583): Invalid combination of opcode and operands
[Error] su2_rotate.inc(586): Invalid combination of opcode and operands
[Error] su2_rotate.inc(633): Invalid combination of opcode and operands
[Error] su2_rotate.inc(636): Invalid combination of opcode and operands
[Error] su2_rotate.inc(641): Invalid combination of opcode and operands
[Error] su2_rotate.inc(644): Invalid combination of opcode and operands
[Error] su2_rotate.inc(649): Invalid combination of opcode and operands
[Error] su2_rotate.inc(652): Invalid combination of opcode and operands
[Error] su2_rotate.inc(712): Invalid combination of opcode and operands
[Error] su2_rotate.inc(714): Invalid combination of opcode and operands
[Error] su2_rotate.inc(720): Invalid combination of opcode and operands
[Error] su2_rotate.inc(724): Invalid combination of opcode and operands
[Error] su2_rotate.inc(785): Invalid combination of opcode and operands
[Error] su2_rotate.inc(788): Invalid combination of opcode and operands
[Error] su2_rotate.inc(793): Invalid combination of opcode and operands
[Error] su2_rotate.inc(796): Invalid combination of opcode and operands
[Error] su2_rotate.inc(801): Invalid combination of opcode and operands
[Error] su2_rotate.inc(804): Invalid combination of opcode and operands
[Error] su2_rotate.inc(857): Invalid combination of opcode and operands
[Error] su2_rotate.inc(860): Invalid combination of opcode and operands
[Error] su2_rotate.inc(865): Invalid combination of opcode and operands
[Error] su2_rotate.inc(868): Invalid combination of opcode and operands
[Error] su2_rotate.inc(873): Invalid combination of opcode and operands
[Fatal Error] su2_rotate.inc(876): Compilation terminated; too many errors


 
Ойёё   (2004-05-25 20:02) [8]

Сапёски, что с тобой?


 
miek ©   (2004-05-25 20:27) [9]

Я тут прикинул объем работы по адаптации к Д-5 и мне сразу поплохело. Проще написать парсер, который будет исходники переделывать. Вот, наверное, так и сделаю.


 
miek ©   (2004-05-25 20:27) [10]

Я тут прикинул объем работы по адаптации к Д-5 и мне сразу поплохело. Проще написать парсер, который будет исходники переделывать. Вот, наверное, так и сделаю.


 
Rouse_ ©   (2004-05-25 20:53) [11]

Вот у меня тут демка плазмы валяется уже не знаю с каких времен:
Автор кода неизвестен:

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,   Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Image1: TImage;
   procedure Button1Click(Sender: TObject);
 procedure makeplasma;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 plasma : array[0..768,0..768] of byte;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var  x,y:integer;
begin

makeplasma;
for x:=0 to 255 do
       begin
       for y:=0 to 255 do
               begin
               image1.canvas.pixels[x,y]:=rgb(plasma[x,y],plasma[x+256,y+256],plasma[x+512,y+512]);
               end;
       image1.update;
       end;
//

end;

procedure TForm1.makeplasma;
   procedure halfway(x1,y1,x2,y2: integer);
       procedure adjust(xa,ya,x,y,xb,yb: integer);
       var      d: integer;
                v: double;
       begin
          if plasma[x,y]<>0 then exit;
          d:=Abs(xa-xb)+Abs(ya-yb);
           v:=(plasma[xa,ya]+plasma[xb,yb])/2+(random-0.5)*d*2;
           if v<1 then v:=1;
            if v>=193 then v:=192;
             plasma[x,y]:=Trunc(v);
       end;
   var    x,y: integer;
          v: double;
   begin
       if (x2-x1<2) and (y2-y1<2) then exit;
       x:=(x1+x2) div 2;
       y:=(y1+y2) div 2;
       adjust(x1,y1,x,y1,x2,y1);
       adjust(x2,y1,x2,y,x2,y2);
       adjust(x1,y2,x,y2,x2,y2);
       adjust(x1,y1,x1,y,x1,y2);
       if plasma[x,y]=0 then
       begin
           v:=(plasma[x1,y1]+plasma[x2,y1]+plasma[x2,y2]+plasma[x1,y2])/4;
           plasma[x,y]:=Trunc(v);
       end;
       halfway(x1,y1,x,y);
       halfway(x,y1,x2,y);
       halfway(x,y,x2,y2);
       halfway(x1,y,x,y2);
   end;

var  x,y :integer ;
begin
   randomize;
   plasma[0,768]:=random(192);
   plasma[768,768]:=random(192);
   plasma[768,0]:=random(192);
   plasma[0,0]:=random(192);
   halfway(0,0,768,768);
end;

end.



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

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

Наверх




Память: 0.52 MB
Время: 0.024 c
1-1090494788
~ShamaN~
2004-07-22 15:13
2004.08.08
Quick Report


1-1091002620
Loki3D
2004-07-28 12:17
2004.08.08
как добавить данные из таблици в TComboBOx TDBComboBox


4-1088608218
Rain
2004-06-30 19:10
2004.08.08
Голосовой режим модема


1-1090925023
faost
2004-07-27 14:43
2004.08.08
Фильтрация по дате


14-1090211747
VictorT
2004-07-19 08:35
2004.08.08
И снова исчерпан лимит трафика на дремучем форуме :(