Ver Mensaje Individual
  #1  
Antiguo 03-01-2009
Avatar de aeff
aeff aeff is offline
Miembro
 
Registrado: oct 2006
Ubicación: Cuba, Guantánamo
Posts: 348
Reputación: 18
aeff Va camino a la fama
¿Cómo pintar un círculo matemáticamente?

saludos!

miren colegas, el problema es que necesito pintar un círculo matemáticamente, sin usar el método Ellipse del Canvas ya que con este método si el Pen.Width = 1 e intento ir "cerrando el radio" y repintar un nuevo círculo quedan pixeles sin pintar, mi objetivo es lograr un Degradado Radial parecido al de PhotoShop, pero lo que necesito primeramente es logarar que no ocurra lo que acabo de explicar, si uso la fórmula matemática del círculo: R^2 = (X - H)^2 + (Y - K)^2, y despejo para halla a que valor de X le corresponde en Y según el radio, me sucede lo siguiente:

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  R: Real;
implementation
{$R *.DFM}
uses Math;
  function GetY(R, X: Real ): Real;
  var
    H, K, solve1, solve2: real;
  begin
    // R^2 = (X - H)^2 + (Y - K)^2
    H := R;
    K := R;
    solve1 := sqr(R) - sqr ( X - H );
    solve2 := (sqrt( abs(solve1) )) + k;
    Result := solve2;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  X: Real;
  Y: Integer;
  Value: Byte;
begin
  X := 0.000;
  Screen.Cursor := crHourGlass;
  while X <= R * 2 do
    begin
      Y := Round(GetY(R, X)) ;
      Value := 255 * Round(Y * (sin(DegToRad(Y))));
      Canvas.Pixels[ 200  - Round(R) + Round(X), 200 - round(R) + Y ] := RGB(Value, Value, Value);
      Canvas.Pixels[ 200  - Round(R) + Round(X), 200 + round(R) - Y  ] := RGB(Value, Value, Value);
      X := X + 0.1;
    end;
  Screen.Cursor := crDefault
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  R := 100;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 1 to 100 do
    begin
      R := I;
      Button1Click(self);
    end;
end;

nuevamente existen pixeles que no lograr cerrar el arco completamente,

espero que me hallan entendido y que me puedan responder.

mil gracias de antemano,
saludos!
aeff!
Responder Con Cita