Efekt 3D na Canvasie

0

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?)

0

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;
0

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ę

0

A zadbałeś o to, by Canvas dotyczył twojego Shape'a? (Shape ma w ogóle Canvas?)

0
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.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1