Narysowanie żółtego kółka na canvasie nie stanowi żadnego prolemu.
Ale jak narysować takie kółko, które jest wypukłe, lub wklęsłe?
(rysowanie coraz ciemniejszych/jaśniejszych kółek o coraz to mniejszym promieniu jedno na drugim raczej odpada, nie?)
Narysowanie żółtego kółka na canvasie nie stanowi żadnego prolemu.
Ale jak narysować takie kółko, które jest wypukłe, lub wklęsłe?
(rysowanie coraz ciemniejszych/jaśniejszych kółek o coraz to mniejszym promieniu jedno na drugim raczej odpada, nie?)
Użyj jakiejś biblioteki graficznej i wyrenderuj sferę, albo przechodząc przez wszystkie x oraz wszystkie y kwadratu, w który ma być ta grafika wpisana, wyliczaj kolor na podstawie odległości od środka (większa niż promień, nie rysuj; mniejsza stopniuj kolor).
Dopisane: Przykład - tylko przedstawia ideę, jak chcesz by był jeszcze szybki, użyj Scanline.
var x,y:integer;
i:integer;
const
//kolo
r = 50;
xr = 200;
yr = 200;
//swiatlo
xc = 30;
yc = 30;
lc = 2.0;
begin
for x:=-r to r do
for y:=-r to r do
begin
if sqrt(sqr(x)+sqr(y))<r then
begin
i:=round(sqrt(sqr(x+xc)+sqr(y+yc))*lc);
if i<0 then i:=0;
if i>255 then i:=255;
Canvas.Pixels[x+xr, y+yr]:=RGB(i,i,i);
end;
end;
end;
Dobra, a teraz inna kwestia, bo tworzę sobie taki komponent. Dziedziczę po TShape, no i daję ten kod do Paint, ale w ogóle nie bierze tego pod uwagę
A zadbałeś o to, by Canvas dotyczył twojego Shape'a? (Shape ma w ogóle Canvas?)
Szczawik napisał(a)
A zadbałeś o to, by Canvas dotyczył twojego Shape'a? (Shape ma w ogóle Canvas?)
Ma, musi mieć(pochodzi od TGraphicControl).
Zreszta sprawdzałem asekuracyjnie i ma.
Zrób taki test - stwórz pustą, nową aplikację, a jej kod zastąp tym:
unit Unit1;
interface
uses Windows, Forms, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
public
end;
TMyShape = class(TShape)
procedure Paint(); override;
end;
var Form1 :TForm1;
MyShape1 :TMyShape;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
MyShape1:=TMyShape.Create(self);
MyShape1.Parent:=self;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyShape1.Free;
end;
{ TMyShape }
procedure TMyShape.Paint;
var x,y:integer;
i:integer;
const r = 25;
xr = 25;
yr = 25;
xc = 30;
yc = 30;
lc = 3.0;
begin
for x:=-r to r do
for y:=-r to r do
begin
if sqrt(sqr(x)+sqr(y))<r then
begin
i:=round(sqrt(sqr(x+xc)+sqr(y+yc))*lc);
if i<0 then i:=0;
if i>255 then i:=255;
Canvas.Pixels[x+xr, y+yr]:=RGB(i,i,i);
end;
end;
end;
end.
Tak na prawdę masz tu minimalną definicję nowego komponentu TMyShape z tą funkcjonalnością. Zgaduję po prostu, że nie zmieniłeś współczynników xr oraz yr w funkcji rysującej i koło pojawia się, ale poza obszarem widocznym komponentu.
Dopisane: Nie zapomnij podpiąć do zdarzeń funkcji FormCreate oraz FormDestroy.