Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Farbe beim Apfelmännchen verändern (https://www.delphipraxis.net/45949-farbe-beim-apfelmaennchen-veraendern.html)

Daniel07A 15. Mai 2005 12:05


Farbe beim Apfelmännchen verändern
 
Hi,

Ich habe ein Programm über das Apfelmännchen. Wie kann ich die Farbe des Apfelmännchens ändern, bzw. verschiedene Fabrarten zur auswahl stellen ?


Die entsprechende Zeilen im Quellcode:
Delphi-Quellcode:
if k >= kmax then k:=0;    
  FRM_Main.IMG_Apfelmann.canvas.pixels[x_bild+1,y_bild+1] := 16000000div(k+1);

Der gesamte Quellcode:
Delphi-Quellcode:
t UNT_AM_Main;    

interface    

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

type    
  TFRM_Main = class(TForm)    
    BTN_Options: TBitBtn;    
    BTN_Zeichnen: TBitBtn;    
    IMG_Apfelmann: TImage;    
    SHP_Unterteilung: TShape;    
    procedure BTN_OptionsClick(Sender: TObject);    
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;    
      Shift: TShiftState; X, Y: Integer);    
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;    
      Shift: TShiftState; X, Y: Integer);    
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,    
      Y: Integer);    
    procedure FormCreate(Sender: TObject);    
    procedure BTN_ZeichnenClick(Sender: TObject);    
  private    
    { Private-Deklarationen }    
  public    
    { Public-Deklarationen }    
  end;    

var    
  FRM_Main: TFRM_Main;    

implementation    

uses UNT_AM_Options;    

{$R *.dfm}    

var x_bild,y_bild,kmax,k,rmax,xo,xu,yl,yr : integer;    
    x,xalt,y,dx,dy,creal,cimag : real;    
    xmax,xmin,ymax,ymin : real;    
    md : boolean;    

procedure iteration(x_bild,y_bild: integer);    
begin    
  x := xmin + x_bild*dx;    
  y := ymax - y_bild*dy;    
  creal := (x_bild) *dx+xmin;    
  cimag := (400-y_bild) *dy+ymin;    
  k := 0;    
  repeat    
    xalt := x;    
    x := sqr(x) - sqr(y) + creal;    
    y := 2*xalt*y + cimag;    
    inc(k);    
  until (sqr(x)+sqr(y)>rmax) or (k>kmax);    
  if k >= kmax then k:=0;    
  FRM_Main.IMG_Apfelmann.canvas.pixels[x_bild+1,y_bild+1] := 16000000div(k+1);    
end;    

procedure TFRM_Main.BTN_OptionsClick(Sender: TObject);    
begin    
FRM_Options.show;    
end;    

procedure TFRM_Main.FormMouseDown(Sender: TObject; Button: TMouseButton;    
  Shift: TShiftState; X, Y: Integer);    
var a,b : real;    
begin    
  a := xmin + (x-152)*(xmax-xmin)/500;    
  b := ymax - (y-8)*(ymax-ymin)/400;    
  FRM_Options.EDT_xmin.Text := floattostrf(a,fffixed,10,8);    
  FRM_Options.EDT_ymax.Text := floattostrf(b,fffixed,10,8);    
  xo := x; yl := y; xu := x; yr := y;    
  md := true;    
end;    

procedure TFRM_Main.FormMouseUp(Sender: TObject; Button: TMouseButton;    
  Shift: TShiftState; X, Y: Integer);    
begin    
  md := false;    
end;    

procedure TFRM_Main.FormMouseMove(Sender: TObject; Shift: TShiftState; X,    
  Y: Integer);    
var a,b : real;    
begin    
  if md then    
   begin    
     a := xmin + (x-152)*(xmax-xmin)/500;    
     b := ymax - (y-8)*(ymax-ymin)/400;    
     FRM_Options.EDT_xmax.Text := floattostrf(a,fffixed,10,8);    
     FRM_Options.EDT_ymin.Text := floattostrf(b,fffixed,10,8);    
     IMG_Apfelmann.canvas.Pen.Mode := pmnotxor;    
     IMG_Apfelmann.canvas.Rectangle(xo,yl,xu,yr);    
     IMG_Apfelmann.canvas.Rectangle(xo,yl,x,y);    
     IMG_Apfelmann.canvas.Pen.Mode := pmcopy;    
     xu := x; yr := y;    
   end;    
end;    

procedure TFRM_Main.FormCreate(Sender: TObject);    
begin    
 md := false;    
end;    

procedure TFRM_Main.BTN_ZeichnenClick(Sender: TObject);    
begin    
xmax := strtofloat(FRM_Options.EDT_xmax.text);    
xmin := strtofloat(FRM_Options.EDT_xmin.text);    
ymax := strtofloat(FRM_Options.EDT_ymax.text);    
ymin := strtofloat(FRM_Options.EDT_ymin.text);    
kmax := strtoint(FRM_Options.EDT_kmax.text);    
rmax := strtoint(FRM_Options.EDT_rmax.Text);    
creal := strtofloat(FRM_Options.EDT_creal.text);    
cimag := strtofloat(FRM_Options.EDT_cimag.text);    
dx := (xmax-xmin)/500;    
dy := (ymax-ymin)/400;    
for x_bild := 0 to 500 do    
   for y_bild := 0 to 400 do iteration (x_bild,y_bild);    
end;    

end.
Hoffe ihr versteht mich.

Gruß Daniel

dizzy 15. Mai 2005 15:51

Re: Farbe beim Apfelmännchen verändern
 
Die gebräuchlichste Art ein Mandelbrot/Julia-Fraktal einzufärben ist eine Palette. Angenommen du hast 20 Iterationen als Abbruchkriterium, so benötigst du eine Palette von 20 Farben. Dann zählst du in deiner Iterationsschleife mit, nach wie vielen Iterationen abgebrochen wurde (in deinem Source ist dass das k), und nimmst dieses als Palettenindex her.
Es gibt allerdings noch massig weitere Verfahren zur Einfärbung, wovon mir prinzipiell noch das Orbit-Vervahren bekannt ist. Dabei nimmt man nicht die tatsächlichen Iterationen als Palettenindex, sondern den Betrag der komplexen Zahl (gerundet) nach der n-ten Iteration (n wählbar). Ob das aber für 2D-Fraktale auch taugt weiss ich nicht genau - bei Quaternion-Fraktalen siehts sehr hübsch aus :) (dazu wird in naher Zukunft was hier erscheinen).

Gruss,
Fabian

Daniel07A 15. Mai 2005 18:27

Re: Farbe beim Apfelmännchen verändern
 
Danke für die Infos, aber ich weiß nicht wie man eine solche Farbpalette hier einbaut. Ich muss es auch so einbauen können das ich es verstehe und dem Lehrer erklären kann. Aber wenn du meinst das du noch was posten willst, bin ich mal gespannt:)

Gruß Daniel

Ps.: Hab es jetzt hingekriegt die die Farbe zu ändern. Aber über eine Lösung wie man eine Farbpalette einbaut wäre ich trotzdem dankbar. Kann auch ein Tuturial sein.

dizzy 15. Mai 2005 22:35

Re: Farbe beim Apfelmännchen verändern
 
Eine Palette ließe sich z.B. ganz banal als "array of TColor" machen. Einfach eine Aneinanderreihung von Farbwerten auf die über einen Index zugegriffen werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz