русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Кривые Безье


Дата добавления: 2013-12-23; просмотров: 4244; Нарушение авторских прав


Работа с мышью

Система 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 века независимо друг от друга Пьером Безье из автомобилестроительной компании «Рено» и Полем де Кастелье из компании«Ситроен», где применялись для проектирования кузовов автомобилей.

Кривая Безье задается двумя главными опорными точками (начало и конец кривой), а также рядом промежуточных опорных точек, через которые кривая не проходит. Промежуточные точки играют роль магнитов. Кривая начинается в одной начальной точке и направляется ко второй, по мере движения притягиваясь к контрольным точкам. Сначала преобладает влияние первой точки, но по мере приближения ко второй точке более сильным становится влияние контрольных точек.

Кривая Безье — параметрическая кривая, задаваемая выражением

0<t<1

где 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, например:

Visual Basic .Net:



Dim g As Graphics

g = Me.CreateGraphics

Dim redpen As Pen

redpen = New Pen(Color.Red, 3)

g.DrawBezier(redpen, 10, 10, 40, 40, 100, 100, 200, 300)

Visual C#:

Graphics g;

g = this.CreateGraphics();

Pen redpen;

redpen = new Pen(Color.Red, 3);

g.DrawBezier(redpen, 10, 10, 40, 40, 100, 100, 200, 300);

 

Сами контрольные точки можно нарисовать с помощью метода FillRectangle с аргументами, соответствующими одной точке.

 



<== предыдущая лекция | следующая лекция ==>
Сплайны | Изображения


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.006 сек.