[Solucionado] Curvas De Bézier Con Mas De 4 Puntos De Control


Objetivo: [Solucionado] Curvas De Bézier Con Mas De 4 Puntos De Control
Hola,
un nuestro amigo del foro italiano gambas-it.org pide ayuda relacionada con Curvas de Bézier.
A través del metodo CurveTo() en gambas, es posible dibujar una curva de Bezier, pero solo cúbica (4 puntos de control). Leyendo la página de Wikipedia (italiana) sobre el tema: http://it.wikipedia.org/wiki/Curve_...Visual_Basic_6, el encontró un programa en VB que el ha tratado de adaptar a gambas con una función para dibujar las curvas hasta de 255 puntos de control, pero la curva no permanece dentro de los puntos de control y se desborda, como se puede ver mediante el codigo/ejemplo (usando una DrawingArea de 1000x700) que el nuestro amigo dejó en el foro: http://www.gambas-it.org/smf/index.php?topic=3591.0

El pide ayuda para solucionar el problema.

última edición por vuott el Domingo, 27 Julio 2014, 16:42; editado 2 veces
Perfil MP  
Objetivo: Re: Curvas De Bézier Con Mas De 4 Puntos De Control
Vuott:

Le he puesto la propiedad cached de DrawingArea como True, y ya no da error al dibujar.
be


Pero no se si el resultado es el que el espera...

Saludos

Objetivo: Re: Curvas De Bézier Con Mas De 4 Puntos De Control
jsbsan escribió:  
Vuott:

Le he puesto la propiedad cached de DrawingArea como True, y ya no da error al dibujar.

Uhmmm... muy interesante, jsbsan !
Informaré el nuestro amigo del foro.



jsbsan escribió:  

Pero no se si el resultado es el que el espera...

Saludos

Veremos lo que el dirá.

Gracias por el tu aporte y muchos saludos, jsbsan.

Perfil MP  
Objetivo: Re: Curvas De Bézier Con Mas De 4 Puntos De Control
Hola jsbsan,
hay un problema: ampliando el tamaño de DrawingArea del tu ejemplo, yo veo la curva así be

Pero este es precisamente el error lamentado de el nuestro amigo.

Perfil MP  
Objetivo: Re: Curvas De Bézier Con Mas De 4 Puntos De Control
Bueno, al final, lo he conseguido

Lo que he usado es la fórmula paramétrica:

ecuacion_bezier


Y resultado es este:

curva_bezier

El código fuente es el siguiente:
' gambas class file

'fuente: http://it.wikipedia.org/wiki/Curve_Bezi%C3%A8r#Applicazione_in_Visual_Basic_6


Public Struct PuntoBezier
x As Float
y As Float
End Struct

Private punti As New PuntoBezier[]

Public Sub _new()
'un esempio con 5 punti di controllo

Dim punto As PuntoBezier

punto = New PuntoBezier
punto.x = 20
punto.y = 600
punti.Add(punto)
punto = New PuntoBezier
punto.x = 200
punto.y = 110
punti.Add(punto)
punto = New PuntoBezier
punto.x = 500
punto.y = 450
punti.Add(punto)
punto = New PuntoBezier
punto.x = 800
punto.y = 600
punti.Add(punto)
punto = New PuntoBezier
punto.x = 950
punto.y = 200
punti.Add(punto)
punto = New PuntoBezier
punto.x = 650
punto.y = 50
punti.Add(punto)
punto = New PuntoBezier

End

Public Sub Form_Open()

Me.w = 1000
Me.h = 700
Area.Refresh()

End

Public Function factorial(n As Integer) As Single

If n = 0 Then
Return 1
Else
Return n * factorial(n - 1)
Endif

End

Public Function NumeroCombinarorio(n As Integer, r As Integer) As Single
'http://www.hiru.com/matematicas/numeros-combinatorios

Return factorial(n) / (factorial(r) * (factorial(n - r)))

End

Public Sub Form_Resize()

Area.Refresh()

End

Public Sub Area_Draw()

bezierVB

End

Public Sub bezierVB()

Dim t As Single
Dim n As Integer
Dim i As Integer
Dim x As Integer

Dim xtnAntigua As Single
Dim ytnAntigua As Single

Dim xtn As Single
Dim ytn As Single

'Poligonal original

For x = 1 To punti.Count - 1
Paint.MoveTo(punti[x - 1].x, punti[x - 1].y)
Paint.LineTo(punti[x].x, punti[x].y)

Next
Paint.stroke

Paint.Brush = Paint.Color(Color.blue)
'-----------------------------------
'curva definida por ecuacion...
'-----------------------------------
xtnAntigua = 0
ytnAntigua = 0

n = punti.Count - 1
For t = 0 To 1 Step 0.001
xtn = 0
ytn = 0
For i = 0 To n
xtn = xtn + NumeroCombinarorio(n, i) * punti[i].x * (1 - t) ^ (n - i) * t ^ i
ytn = ytn + NumeroCombinarorio(n, i) * punti[i].y * (1 - t) ^ (n - i) * t ^ i
Next

If xtnAntigua = 0 And ytnAntigua = 0 Then
'primer puntono dibuja nada
Else
Paint.MoveTo(xtnAntigua, ytnAntigua)
Paint.LineTo(xtn, ytn)
Paint.Stroke
Endif
xtnAntigua = xtn
ytnAntigua = ytn

Next

End

Objetivo: Re: Curvas De Bézier Con Mas De 4 Puntos De Control
He añadido a mi blog, un pequeño editor de curvas Bezier, osea que puedes definir un poligono y mover los puntos, para ver como queda la curva Bezier.


Link



Enlace

Objetivo: Re: Curvas De Bézier Con Mas De 4 Puntos De Control
Eres un "máquina", Julio...

¡Fantástico!

Perfil MP  
Objetivo: Re: Curvas De Bézier Con Mas De 4 Puntos De Control
Optime, jsbsan !

El nuestro amigo del foro italiano ha visto la tu applicación y ha escrito simplemente que eres: grande !

Perfil MP  
Objetivo: Re: [Solucionado] Curvas De Bézier Con Mas De 4 Puntos De Control
......la fuerza del interscambio y interrelación entre los foros y los programadores.

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1372s (PHP: 35% SQL: 65%)
Consultas SQL: 21 - Debug off - GZIP Activado