Richard
07-05-2004, 10:16:01
Hola, ¿Alguien sabe un algorimo para dibujar una elipse de puntos dada dos coordenadas?. He estado probando con este algortimo pero tengo problemas porque la elipse no pasa por las coordenadas indicadas en a y b.
Punto es un registro que contiene la coordenada x e y.
procedure TFormDibujo.initSnakeEllipse(a,b: punto);
var
i,semiaxis_a,semiaxis_b,center_x,center_y,x,y:integer;
ang:real;
begin
semiaxis_a := round((b.x - a.x) / 2);
semiaxis_b := round((b.y - a.y) / 2);
center_x := a.x + semiaxis_a;
center_y := a.y + semiaxis_b;
ang := 2*PI / numPoints;
for i:= 0 to numPoints-1 do begin
x := round(semiaxis_a * cos (ang * i));
y := round(semiaxis_b * sin (ang * i));
ListaP[i].x:=center_x + x;
ListaP[i].y:=center_y + y;
ListaP[i].alpha:=Alfa;//DEFAULT_ALPHA;
ListaP[i].beta:=Beta;//DEFAULT_BETA;
ListaP[i].gamma:=Gamma;//DEFAULT_GAMMA;
end;
end;
Por ultimo dibujo con el algoritmo
i:integer;
for i:= 0 to numPoints-1 do begin
BitmapTrab.Canvas.pen.Color := clGreen;
BitmapTrab.Canvas.Ellipse(ListaP[i].X-3,ListaP[i].Y-3,ListaP[i].X+3,ListaP[i].Y+3);
BitmapTrab.Canvas.Pixels[ListaP[i].X,ListaP[i].Y]:=clYellow;
BitmapTrab.Canvas.MoveTo(ListaP[i].X,ListaP[i].Y);
if (i=numPoints-1) then
BitmapTrab.Canvas.LineTo(ListaP[0].X,ListaP[0].Y)
else BitmapTrab.Canvas.LineTo(ListaP[i+1].X,ListaP[i+1].Y);
end;
Punto es un registro que contiene la coordenada x e y.
procedure TFormDibujo.initSnakeEllipse(a,b: punto);
var
i,semiaxis_a,semiaxis_b,center_x,center_y,x,y:integer;
ang:real;
begin
semiaxis_a := round((b.x - a.x) / 2);
semiaxis_b := round((b.y - a.y) / 2);
center_x := a.x + semiaxis_a;
center_y := a.y + semiaxis_b;
ang := 2*PI / numPoints;
for i:= 0 to numPoints-1 do begin
x := round(semiaxis_a * cos (ang * i));
y := round(semiaxis_b * sin (ang * i));
ListaP[i].x:=center_x + x;
ListaP[i].y:=center_y + y;
ListaP[i].alpha:=Alfa;//DEFAULT_ALPHA;
ListaP[i].beta:=Beta;//DEFAULT_BETA;
ListaP[i].gamma:=Gamma;//DEFAULT_GAMMA;
end;
end;
Por ultimo dibujo con el algoritmo
i:integer;
for i:= 0 to numPoints-1 do begin
BitmapTrab.Canvas.pen.Color := clGreen;
BitmapTrab.Canvas.Ellipse(ListaP[i].X-3,ListaP[i].Y-3,ListaP[i].X+3,ListaP[i].Y+3);
BitmapTrab.Canvas.Pixels[ListaP[i].X,ListaP[i].Y]:=clYellow;
BitmapTrab.Canvas.MoveTo(ListaP[i].X,ListaP[i].Y);
if (i=numPoints-1) then
BitmapTrab.Canvas.LineTo(ListaP[0].X,ListaP[0].Y)
else BitmapTrab.Canvas.LineTo(ListaP[i+1].X,ListaP[i+1].Y);
end;