![]() |
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:
Hoffe ihr versteht mich.
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. Gruß Daniel |
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 |
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. |
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