Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-05-2004
Richard Richard is offline
Registrado
 
Registrado: may 2004
Posts: 1
Poder: 0
Richard Va por buen camino
Pintar una elipte dada dos coordenadas, sin utilizar la funcion que viene en delphi

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;
Responder Con Cita
  #2  
Antiguo 07-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Richard
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

Código Delphi [-]
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
Responder Con Cita
  #3  
Antiguo 07-05-2004
Amilius Amilius is offline
No confirmado
 
Registrado: ene 2004
Posts: 138
Poder: 0
Amilius Va por buen camino
Cita:
Empezado por roman
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.

Última edición por Amilius fecha: 07-05-2004 a las 23:15:42. Razón: Agregar algo adicional
Responder Con Cita
  #4  
Antiguo 07-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 09-05-2004
Amilius Amilius is offline
No confirmado
 
Registrado: ene 2004
Posts: 138
Poder: 0
Amilius Va por buen camino
Cita:
Empezado por roman
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 20:01:02.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi