Resumen Dibujar una curva que pase por una serie de puntos   (2 mensajes )

Mensaje enviado por "Oswaldo D'Acevedo" <Oswaldo@heuristika.com>

Caramba Marcos, si que me has hecho sudar, hace muchisimo de mis ultimos dias universitarios pero fue refrescante poder ejercitar nuevamente las habilidades matematicas... No te explicare todo el proceso que pase para llegar a la formula pero creeme... esta correcto..

Primero , dado tres puntos en el plano pueden pasar infinitas curvas, sin embargo solo pasa una Parabola y una sola y es , me imagino, la curva cuya formula deseas encontrar.

Una parabola tiene como formula general la siguiente cuadratica

f(x)= bX^2 + bX + c
o
Y = aX^2 + bX + c

Tu problema se reduce entonces a encontrar los valores para a, b y c.
Dado que tienes 3 puntos definidos, a los que llamaremos (x1,y1) , (x2,y2) y (x3,y3) ellos te serviran para establecer tres ecuaciones lineales que podras resolver aplicando la formula que yo te indicare a continuacion


a = [(y1-y3)(x1-x2) - (y1-y2)(x1-x2)]/[(x2-x3)(x2^2-x1^2) - (x3^2-x2^2)(x1-x2)]

aplicada esta formula y encontrado el valor de a, podras encontrar el valor de b de la siguiente manera

b = [(x2^2-x1^2)a + (y1-y2)]/(x1-x2)

luego con esos dos valores encontraras c

c = x1 - (x1^2)a + (x1)b

aplicando esas formulas deberas poder encontrar los valores que te definiran la curva cuadratica (una parabola)

Suerte

Oswaldo

Nota

x^2 significa x al cuadrado

-----Original Message-----
From: owner-vb-esp@ccc.uba.ar [mailto:owner-vb-esp@ccc.uba.ar]On Behalf
Of Marcos Martin
Sent: Monday, January 03, 2000 9:52 AM
To: vbe@onelist.com; vb-esp@ccc.uba.ar
Subject: vb-esp : dibujar una curva que pase por una serie de puntos


Saludos y feliz 2000.

Empiezo el año con nuevos retos que desbordan mis capacidades de humilde programador.
Me veo en la obligación de ponerme al día en cuestiones de matemática y geometría (cosa francamente horrible).

Mi problema seguro que es sencillo para alguien que tenga frescos estos conocimientos.
Necesito dibujar una curva que pase por tres puntos, como mínimo. No me referiero a que los ajuste, si no que pase forzosamente por los tres.
Si existe una formula que permita dados n puntos dibujar una curva que pase por todos ellos pues mejor que mejor.

Tengo hecha la típica gráfica en 2D de puntos unidos por lineas rectas, pero ahora el cliente quiere suavizar esas rectas, que no son realistas y pasarlas a una curva. Supongo que mas de uno se las habrá visto con esto.....

He estado buscando información y encontré un par de funciones GDI. La mas util, aparentemente, es la que dibuja curvas Bézier, pero éstas requieren 2 puntos de control, para empezar, y con ellas solo consigo unir dos puntos. A base de dos en dos puntos saldrán un monton de curvas "sin continuidad" una con otra, no se si me explico.
Yo lo que quiero es una curva que dados unos puntos, 3 como mínimo, pase por todos ellos, de la misma forma que lo haría si nosotros , a mano alzada uniesemos esos puntos sin tirar lineas rectas.

¿Alguien sabe como hacer esto?
Agradecería cualquier ayuda, porque realmente no tengo ni idea al respecto.
Gracias.

------------------------------------------------------------------
Marcos Martín-Borregón Martín
IBERDROLA INGENIERIA Y CONSULTORIA
Madrid, Spain

Mensaje enviado por Diego Buendía <diegobb@teleline.es>

Hola:

Yo recordaba que existía algo en el API de Windows que se ocupaba de esto... usando curvas de Bèzier, que son curvas polinómicas del estilo que explica Oswaldo. Tras buscarlo en MSDN encontré PolyBezier, que genera una curva a partir de puntos, con la libertad adicional de definir la pendiente en los puntos de enlace mediante puntos adicionales (no se si habrán visto en los programas que hacen gráficos este tipo de curvas, en los puntos de enlace aparece una recta tangente a la curva con dos puntos en los extremos que, al desplazarlos, cambia la pendiente de las curvas adyacentes. En el visor API existe la declaración:

========================================================================

Public Type POINTAPI
        x As Long
        y As Long
End Type

Public Declare Function PolyBezier Lib "gdi32" Alias "PolyBezier" (ByVal hdc
As Long, lppt As POINTAPI, ByVal cPoints As Long) As Long

========================================================================

Y esto es lo que dice la MSDN al respecto:

========================================================================

PolyBezier
The PolyBezier function draws one or more Bézier curves.

BOOL PolyBezier(
  HDC hdc, // handle to device context
  CONST POINT *lppt, // pointer to endpoints and control points
  DWORD cPoints // count of endpoints and control points
);

Parameters
hdc Handle to a device context.
lppt Pointer to an array of POINT structures that contain the endpoints and control points of the curve(s).
cPoints Specifies the number of points in the lppt array. This value must be one more than three times the number of curves to be drawn, because each Bézier curve requires two control points and an endpoint, and the initial curve requires an additional starting point.

Return Values
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Windows NT: To get extended error information, callGetLastError.

Remarks
Th Polybezier function draws cubic Bézier curves by using the endpoints and control points specified by the lppt parameter. The first curve is drawn from the first point to the fourth point by using the second and third points as control points. Each subsequent curve in the sequence needs exactly three more points: the ending point of the previous curve is used as the starting point, the next two points in the sequence are control points, and the third is the ending point.

The current position is neither used nor updated by the PolyBezier function.
The figure is not filled.

This function draws lines by using the current pen.

QuickInfo
  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Unsupported.
  Header: Declared in wingdi.h.
  Import Library: Use gdi32.lib.

See Also
Lines and Curves Overview, Line and Curve Functions, MoveToEx, POINT,
PolyBezierTo

========================================================================

La única cosa que quedaría es saber cómo obtener un DC para poder pasarlo
como parámetro a la función.

Espero que esto aporte algo más a esta interesante cuestión.

Diego Buendía
Barcelona, Spain
diegobb@teleline.es
http://terra.teleline.es/personal/diegobb



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com