Pregunta

Es posible que necesite visualizar un B-Spline ( http://en.wikipedia.org / wiki / B-spline ) en .NET. No sé por dónde empezar. ¿Hay alguna manera fácil o biblioteca para hacerlo? Preferiría hacerlo en Silverlight, pero WPF y Win Forms también están bien. Me imagino el software como un sistema de coordenadas con algunos puntos de control que puede agregar, eliminar o mover causando que la spline se repinte. Tenga en cuenta que me falta el fondo matemático. Encontré algunos métodos en GDI + que parecen estar destinados a dibujar splines, pero no estoy seguro de si se trata de B-Splines.

Cualquier consejo sería apreciado. Bibliotecas, códigos, enlaces a guías o sugerencias generales son bienvenidos.

¿Fue útil?

Solución

Hace un tiempo escribí un programa muy rápido para un código científico que utilizaba splines. En particular, estas splines son NURBS (splines de base racional no uniforme). Esta es la forma más generalizada de la spline. Todas las demás splines son casos especiales de este tipo. El vector de nudo se usa para generar la spline, y el algoritmo recursivo Cox de Boor se usa para calcular el valor de un punto. El código C # es muy pobre, fue algo que reuní rápidamente para resolver un problema y antes era un desarrollador más pulido. Si buscas en Google Cox de Boor, encontrarás muchas páginas que analizan la base teórica de las splines. Tenga cuidado, la mayoría de ellos tienen algún tipo de error (algunos de ellos en su discusión sobre el vector de nudo)

http://stochfit.svn.sourceforge.net/viewvc/ stochfit / trunk / NURBs /

No recuerdo todos los detalles matemáticos, pero intentaré ayudar si sé la respuesta. ¡Buena suerte, fue un conocimiento muy difícil de adquirir por mi parte!

EDITAR: creo que obtienes una B-spline de estos métodos si configuras el peso para un punto determinado en 1.

Otros consejos

Un B-Spline es una solución a un problema, tal vez debería describir su problema y preguntar cuál es la mejor solución. GDI + contiene DrawBezier y DrawCurve para dibujar splines, ese podría ser un buen punto para comenzar. Algo como esto:

Point p1 = new Point(10, 10);
Point p2 = new Point(50, 10);
Point p3 = new Point(10, 50);
Point p4 = new Point(50, 50);
e.Graphics.DrawBezier(Pens.Blue, p1, p2, p3, p4);

p2 y p3 no son parte de la curva sino 'puntos de control', muévalos para ver el efecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top