FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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; |
#2
|
||||
|
||||
Cita:
Ahora bien, sólo de ver la cabecera del procedimiento
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 |
#3
|
|||
|
|||
Cita:
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 |
#4
|
||||
|
||||
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 |
#5
|
|||
|
|||
Cita:
|
|
|
|