PDA

Ver la Versión Completa : Pintar una elipte dada dos coordenadas, sin utilizar la funcion que viene en delphi


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;

roman
07-05-2004, 22:27:46
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.


No he leído el código pues me cuesta trabajo leer código sin indentar. Por favor usa las etiquetas [ code ] o [ delphi ] para dar un formato adecuado a tu código.

Ahora bien, sólo de ver la cabecera del procedimiento


procedure TFormDibujo.initSnakeEllipse(a,b: punto);


y tu pregunta de arriba, algo me llama la atención. Dados dos puntos en el plano hay una infinidad de elipses que pasan por ellos. De manera que, ¿cuál de todas estas elipses quieres dibujar?

// Saludos

Amilius
07-05-2004, 23:05:39
Dados dos puntos en el plano hay una infinidad de elipses que pasan por ellos. De manera que, ¿cuál de todas estas elipses quieres dibujar?Totalmente de acuerdo.

Creo que esa es precisamente la razón de implementar OTRO algoritmo para dibujar elipses: que pase por 2 puntos CONOCIDOS relativos a la elipse ¿cuales son?. Aunque se sabe que el GDI de windows no es precisamente de lo mejor que existe, usar otro algoritmo para dibujar una elipse sólo puede tener fines educativos o que se desee usar otro sistema de par de puntos para dibujar la elipse:
1.- Una elipse contenida por un rectángulo definido por los puntos a,b (si mal no recuerdo esta función viene con el GDI)
Adicionales:
2.- Una elipse definida por un centro "punto a" y otro "punto b" que junto con el "punto a" definen el ancho y alto de la elipse.
3.- Igual que la anterior sólo que el punto b, de hecho contiene el alto y el ancho de la famosa elipse.
4.- La elipse pasa por los puntos a y b, en posiciones determinadas, ej: a, el punto extremo inferior/superior y b el punto extremo derecho/izquierdo.
5.- Los puntos son los focos de la elipse.
Creo que es bastante fácil definir las 3 primeras funciones adicionales de forma que usen la función que viene con el GDI, la última necesita algo más de matemáticas, pero tampoco es imposible.

roman
07-05-2004, 23:25:17
Entiendo los puntos 1 a 4, en todos hay una condición extra que permite fijar la elipse. En el punto cinco no concuerdo: siendo que una elipse es el lugar geométrico formado por los puntos cuya suma de distancias a dos puntos fijos (los focos) es una constante, variando dicha constante se sigue obteniendo una infinidad de elipses.

De cualquier forma el punto es precisamente que hay muchas formas de dar condiciones extra para fijar una elipse dados dos puntos. Siendo que no sabemos cuál de éstas requiere Richard es un poco más dificil saber en qué falla el código; y si éste no está indentado, pues peor.

// Saludos

Amilius
09-05-2004, 19:35:51
En el punto cinco no concuerdo: siendo que una elipse es el lugar geométrico formado por los puntos cuya suma de distancias a dos puntos fijos (los focos) es una constante, variando dicha constante se sigue obteniendo una infinidad de elipses.

Sin duda, un error mio. Tienes toda la razón olvidé que se necesita la distancia extra. A parte de eso me di cuenta que el algoritmo que dibuja elipses contenidas por un rectángulo no considera el caso que quieras dibujar una elipse "girada", es decir que no esté alineada a los ejes. En ese caso el punto 5, agragando la distancia, si permite dibujar dichas elipses.