Визуализируйте B-Spline в .NET - PullRequest
1 голос
/ 22 июня 2009

Мне может понадобиться визуализировать B-сплайн (http://en.wikipedia.org/wiki/B-spline) в .NET. Я не с чего начать. Есть ли простой способ или библиотека, чтобы сделать это? Я бы предпочел сделать это в Silverlight, но WPF и Win Forms тоже подойдут. Я представляю программное обеспечение как систему координат с некоторыми контрольными точками, которые вы можете добавлять, удалять или перемещать, вызывая перекрашивание сплайна. Обратите внимание, что мне не хватает математического фона. В GDI + я нашел несколько методов, которые, кажется, предназначены для рисования сплайнов, но я не уверен, что это B-сплайны.

Любой совет будет оценен. Библиотеки, код, ссылки на руководства или общие предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 22 июня 2009

Недавно я написал очень быструю программу для некоторого научного кода, использующего сплайны. В частности, эти сплайны являются NURBS (неоднородными рациональными базисными сплайнами). Это наиболее обобщенная форма сплайна. Все остальные сплайны являются частными случаями этого типа. Вектор узла используется для генерации сплайна, а рекурсивный алгоритм Кокса де Бур - для расчета значения точки. Код на C # очень плох, это было то, что я быстро собрал, чтобы решить проблему, и до того, как я стал более отточенным разработчиком. Если вы воспользуетесь Google Cox de Boor, вы найдете много страниц, на которых обсуждается теоретическая основа сплайнов. Осторожно, большинство из них имеют какую-то ошибку (некоторые обсуждают вектор узлов)

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

Я не помню все математические детали, но постараюсь помочь, если знаю ответ. Удачи, это было очень трудное знание с моей стороны!

РЕДАКТИРОВАТЬ - Я полагаю, что вы получите B-сплайн из этих методов, если вы установите вес для данной точки 1.

1 голос
/ 22 июня 2009

B-Spline - это решение проблемы, возможно, вам следует описать вашу проблему и спросить, какое решение лучше. GDI + содержит DrawBezier и DrawCurve для рисования сплайнов, которые могут быть хорошей отправной точкой. Примерно так:

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 и p3 не являются частью кривой, а являются «контрольными точками», переместите их, чтобы увидеть эффект.

...