Система VisualStudio .Netпозволяет отслеживать события мыши. Для этого используются события MouseClick и MouseDoubleClick. Эти события имеют аргумент e, который, в свою очередь, имеет свойства и методы. Например, свойство e.Button позволяет определить, какая кнопка мыши нажата – правая или левая, а свойства e.X и e.Y позволяют определить координаты мыши в момент нажатия кнопки. Это можно использовать для нанесения точек на форму. Сами точки могут быть представлены в виде прямоугольников или кругов размером 1 пиксель. Эти точки можно поместить в динамический массив точек и в дальнейшем использовать для рисования кривых и многоугольников.
Рассмотрим пример. Пусть при щелчке левой кнопкой мыши по форме на форме отражается точка синего цвета, при этом её координаты запоминаются в массиве точек, размерность которого автоматически увеличивается с каждой новой точкой. Код обработчика события MouseClick будет следующим:
Visual Basic .Net:
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim p AsNew Rectangle(e.X, e.Y, 1, 1)
Dim mouse_point As New Point(e.X, e.Y)
g.DrawEllipse(Pens.Blue, p)
num_of_points += 1
ReDim Preserve point_array(num_of_points)
point_array(num_of_points) = mouse_point
EndIf
Visual C#:
if (e.Button==MouseButtons.Left)
{
Rectangle p = new Rectangle(e.X, e.Y, 1, 1);
Point mouse_point = new Point(e.X, e.Y);
g.DrawEllipse(Pens.Blue, p);
num_of_points += 1;
Array.Resize(ref point_array, num_of_points);
point_array[num_of_points-1] = mouse_point;
}
Массив и переменную num_of_points, в которую записывается число нанесенных точек, необходимо определить в области описаний модуля, чтобы он был доступен всем процедурам формы и в дальнейшем по нанесённым точкам можно было бы что-нибудь нарисовать:
Visual Basic .Net:
Dim point_array() As Point
Dim num_of_point as integer
Visual C#:
Point[] point_array;
int num_of_points;
Переменная g также здесь определена на уровне формы, а поверхность для рисования создана в обработчике события загрузки формы. Поскольку в языке C# отсутствует оператор Redim, то для изменения размера массива используются методы класса Math. В программе на Visual Basic .Net. их можно также использовать.
Кривые Безье отличаются от фундаментальных сплайнов большей гладкостью. Кривы́е Безье́ были разработаны в 60-х годах XX века независимо друг от друга Пьером Безье из автомобилестроительной компании «Рено» и Полем де Кастелье из компании«Ситроен», где применялись для проектирования кузовов автомобилей.
Кривая Безье задается двумя главными опорными точками (начало и конец кривой), а также рядом промежуточных опорных точек, через которые кривая не проходит. Промежуточные точки играют роль магнитов. Кривая начинается в одной начальной точке и направляется ко второй, по мере движения притягиваясь к контрольным точкам. Сначала преобладает влияние первой точки, но по мере приближения ко второй точке более сильным становится влияние контрольных точек.
где Pi - функция компонент векторов опорных вершин, а bi,n(t) - базисные функции кривой Безье, называемые также полиномами Бернштейна.
где n — степень полинома, i - порядковый номер опорной точки.
Степень полинома определяет необходимое количество промежуточных вершин, и, соответственно, порядок кривой. Кривая первого порядка (линейная) (n=1) определяется только двумя основными вершинами и не требует промежуточных вершин. Фактически она представляет собой прямую от начальной до конечной точки. Наибольшее применение имеют квадратичные (n=2) и кубические (n=3) кривые. Квадратичные кривые задаются двумя конечными точками (P0 и P2) и одной промежуточной точкой (P1).
Квадратичные кривые Безье в составе используются для описания формы символов в шрифтах TrueType.
Кубические кривые (n=3)задаются двумя опорными вершинами (P0 и P3) и двумя промежуточными (P1 и P2). Они описываются следующим уравнением:
Линия берёт начало из точки P0 направляясь к P1 и заканчивается в точке P3 подходя к ней со стороны P2. То есть кривая не проходит через точки P1 и P2, они используются для указания её направления. Длина отрезка между P0 и P1 определяет, как скоро кривая повернёт к P3.
В матричной форме кубическая кривая Безье записывается следующим образом:
где MBназывается базисной матрицей Безье:
Принцип построения квадратичной кривой иллюстрирует следующий рисунок:
Точка Q0 изменяется от P0 до P1 и описывает линейную кривую Безье.
Точка Q1 изменяется от P1 до P2 и также описывает линейную кривую Безье.
Точка B0 изменяется от Q0 до Q1 и описывает квадратичную кривую Безье.
Принцип построения кубической кривой иллюстрирует следующий рисунок:
Точки Q0, Q1 и Q2, описывают линейные кривые, а точки R0 и R1 описывают квадратичные кривые:
Visual Studio .Net содержит методы, позволяющие строить кубические кривые Безье. Для этого используется метод DrawBezier, аргументами которого являются объект Pen и координаты четырёх точек (двух опорных и двух промежуточных) или четыре объекта Point, например: