Помощь - Поиск - Пользователи - Календарь
Полная версия: Графика в делфи
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
cooler
Вот нужно переделать код из паскаля в делфи, но проблема возникла с цветами, помогите пожалуйста

Код паскаля:

Program N3;
Uses Graph, Crt;
Type
   TComplex = Record
	 X : Real;
	 Y : Real;
   End;
Const
   iter = 50;
   max  = 1e+6;
   min  = 1e-6;
Var
   z, t, d : TComplex;
   p	   :  Real;
   x, y, n : Integer;
   Cancel  : Boolean;
   gd, gm  : Integer;
   mx, my  : Integer;
Begin
   Cancel := False;
   Randomize;
   gd := Detect;
   InitGraph(gd,gm,'c:\bp\bgi');
   Mx := GetMaxX div 2;
   My := GetMaxY div 2;
   For y := -my to my do
	  For x := -mx to mx do Begin
		 n := 0;
		 z.x := X * 0.005;
		 z.y := Y * 0.005;
		 d := z;
		 While (sqr(z.x)+sqr(z.y) < max) and (sqr(d.x)+sqr(d.y) > min)
			  and (n < iter) do Begin
			t := z;
			{z^3 - 1}
			p := sqr(sqr(t.x)+sqr(t.y));
			z.x := 2/3*t.x + (sqr(t.x)-sqr(t.y))/(3*p);
			z.y := 2/3*t.y*(1-t.x/p);{}
			d.x := abs(t.x - z.x);
			d.y := abs(t.y - z.y);
			Inc(n);
			If keypressed then cancel := true;
		 End;
			PutPixel(mx + x,my + y,16 - (n mod 16));
		 If cancel then exit;
	  End;
   Readkey;
   CloseGraph;
end.



И то, что я пробовал в делфи, но выводит просто черный экран, подозреваю, что с цветами что-то не так сделал
Там фрактал должен получиться





Const
   iter = 50;
   max  = 1e+6;
   min  = 1e-6;


 Type
   TComplex = Record
	 X : Real;
	 Y : Real;
   End;


procedure TForm1.Button1Click(Sender: TObject);


Var
   z, t, d : TComplex;
   p	   :  Real;
   x, y, n : Integer;
   mx, my  : Integer;
Begin

   Randomize;
   Mx := 320;
   My := 240;
   For y := -my to my do
	  For x := -mx to mx do Begin
		 n := 0;
		 z.x := X * 0.005;
		 z.y := Y * 0.005;
		 d := z;
		 While (sqr(z.x)+sqr(z.y) < max) and (sqr(d.x)+sqr(d.y) > min)
			  and (n < iter) do Begin
			t := z;
			p := sqr(sqr(t.x)+sqr(t.y));
			z.x := 2/3*t.x + (sqr(t.x)-sqr(t.y))/(3*p);
			z.y := 2/3*t.y*(1-t.x/p);{}
			d.x := abs(t.x - z.x);
			d.y := abs(t.y - z.y);
			Inc(n);
		   End;
		   image1.canvas.Pixels[mx + x,my + y]:=round(16 - (n div 16));

			End;
	   end;
volvo
Цитата
что с цветами что-то не так сделал
Угу... Canvas.Pixels подразумевает RGB-цвета, а не то, что ты передаешь smile.gif

Сделай простую таблицу замены:
const
colors: array[0 .. 16] of TColor = (
  clBlack,
  $0000A0 {dk blue},
  $254117 {dk green},
  $307D7E {cyan},
  $FF0000 {Red},
  $C031C7 {dk magenta},
  $B38481 {brown},
  $C0C0C0 {lt grey},

  $808080 {dk grey},
  $0000FF {lt blue},
  $00FF00 {lt green},
  $E0FFFF {lt cyan},
  $FF8040 {lt red},
  $FF00FF {lt magenta},
  $FFFF00 {yellow},
  $FFFFFF {white},

  clblack
);
// и измени строку присвоения цвета вот так:
image1.canvas.Pixels[mx + x,my + y]:=colors[16 - (n mod 16)];

, тогда должно отработать... Цвета, которые в массиве - стандартные HTML цвета, брал вот отсюда: HTML color codes and names
cooler
Спасибо!
TarasBer
> image1.canvas.Pixels[mx + x,my + y]:=colors[16 - (n mod 16)];

Извините, не удержался. Но... на будущее - вместо "mod 16" лучше "and $0F"
Я конечно понимаю, что компьютеры сейчас двух-ядерные и им это неважно и компиляторы нынче умные, но всё равно культуру программирования соблюдать стоит. А то так и будете дополнительные ядра к процессорам припаивать, чтобы очередную Висту запустить...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.