1.3.4.1. Получение координат точек прямой
1.3.4.1. Получение координат точек прямой
Рисование нестандартных линий выполняется следующим образом: вычисляются координаты всех пикселов, составляющих данную прямую, а потом каждый из них (а при необходимости — и какая-либо его окрестность) раскрашиваются нужным цветом. Следовательно, возникает вопрос об определении координат пикселов.
Существует ряд алгоритмов вычисления этих координат. Наиболее известный из них — алгоритм Брезенхэма (Bresengham), который заключается в равномерном разбрасывании "ступенек" разной длины вдоль линии. В Windows используется алгоритм GIQ (Grid Intersection Quantization). Каждый пиксел окружается воображаемым ромбом из четырех пикселов. Если прямая имеет общие точки с этим ромбом, то пиксел рисуется.
Самостоятельно реализовывать один из таких алгоритмов нет необходимости — в Windows существует функция LineDDA, которая возвращает вызвавшей ее программе координаты линии. Эта функция в качестве параметра принимает координаты начала и конца линии, а также указатель на функцию, которой будут передаваться координаты пикселов. Данная функция должна быть реализована в программе. За время выполнения LineDDA эта функция будет вызвана столько раз, сколько пикселов содержит линия (как обычно в Windows, последний пиксел не считается принадлежащим прямой). Каждый раз при вызове ей будут передаваться координаты очередного пиксела, причем пикселы будут упорядочены от начала к концу прямой.
В примере Lines (рис. 1.15) с помощью LineDDA рисуется пять различных типов линий. Рассмотрим на примере самого сложного из реализуемых программой типов линии ("Зеленая елочка"), как это делается (листинг 1.58).
Рис. 1.15. Окно программы Lines
Листинг 1.58. Рисование линии сложного стиля
// константы для типа "Зеленая елочка"
const
// Угол отклонения "иголки" от направления линии
FirNeedleAngle = 30;
//Длина иголки
FirNeedleLength = 8;
var
Counter: Integer; // Счетчик точек линии
// Вспомогательные переменные для построения "елочки"
DX1, DY1, DX2, DY2: Integer;
// Линия в виде "елочки"
procedure LineDrawFir(X, Y: Integer; Canvas: TCanvas); stdcall;
begin
with Canvas do case Counter mod 10 of
0: begin
MoveTo(X, Y);
LineTo(X + DX1, Y + DY1);
end;
5:
begin
MoveTo(X, Y);
LineTo(X + DX2, Y + DY2);
end;
end;
Inc(Counter);
end;
procedure TLinesForm.Line(X1, Y1, X2, Y2: Integer);
var
Angle: Extended;
begin
case RGroupLine.ItemIndex of
…
4:
begin
Counter:= 0;
Angle:= ArcTan2(Y2 — Y1, X2 — X1);
DX1:= Round(FirNeedleLength *
Cos(Angle + Pi / 180 * FirNeedleAngle));
DY1:= Round(FirNeedleLength *
Sin(Angle + Pi / 180 * FirNeedleAngle));
DX2:= Round(FirNeedleLength *
Cos(Angle — Pi / 180 * FirNeedleAngle));
DY2:= Round(FirNeedleLength *
Sin(Angle — Pi / 180 * FirNeedleAngle));
LineDDA(X1, Y1, X2, Y2, @LineDrawFir, Integer(Canvas));
end;
end;
end;
Каждая "иголка" — это линия длиной FirNeedleLength пикселов, отклоняющаяся от направления прямой на угол FirNeedleAngle градусов. "Иголки" отклоняются попеременно то в одну, то в другую сторону от прямой. В процедуре Line сначала рассчитываются смещения координат конца "иголки" относительно начала и результаты помещаются в глобальные переменные DX1, DY1, DX2, DY2. Переменная Counter служит для определения номера точки. Перед вызовом LineDDA она инициализируется нулем. Затем вызывается функция LineDDA, в качестве одного из параметров которой передается указатель на функцию обратного вызова LineDrawFir. В результате этого функция LineDrawFir будет вызвана последовательно для каждого из пикселов, составляющих линию, начиная с (X1, Y1). LineDrawFir ведет подсчет пикселов, каждый раз увеличивая Counter на единицу. Если остаток от деления номера точки на 10 равен 0, рисуется "иголка", отклоняющаяся в положительном направлении, если 5 — в отрицательном. В остальных случаях не рисуется ничего. Так получается "елочка".
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Установка и удаление точек прерывания
Установка и удаление точек прерывания Для того чтобы установить точку прерывания в определенной строке сценария, нужно поместить курсор в эту строку и нажать <F9> или выбрать пункт меню Debug|Toggle Breakpoint. Строки с точками прерывания будут отмечены красными точками около
1.8. Перспективы и перемена точек наблюдений
1.8. Перспективы и перемена точек наблюдений «Умственные способности, необходимые для координации перспективных изображений, оказываются полностью сформированными у ребенка обычно к 8-9 годам и проявляются в следующих довольно независимых друг от друга формах.
Глава 2 По прямой линии
Глава 2 По прямой линии Однажды Аркадий Волож заявил, что три самых приятных момента в его жизни — это рождение троих детей. То есть для него главное — семья. Но семья — это не только дети. Это и выдающиеся родители героя, настроившие своему сыну судьбу, которой Аркадий
Определение координат точек
Определение координат точек Команда ID вычисляет координаты точек. Вызывается из падающего меню Tools ? Inquiry ? ID Point или щелчком на пиктограмме Locate Point на панели инструментов Inquiry.В командной строке выводятся координаты точки в текущей пользовательской системе координат,
Размещение точек останова в программе
Размещение точек останова в программе Если есть подозрение, что ошибка содержится в каком-то конкретном сегменте программного кода, поместите точку останова как раз перед этим сегментом. На рис. 9.3 видно, как редактор Visual Basic представляет точку останова на экране - в виде
Удаление точек останова
Удаление точек останова Исправив ошибки в программном коде или отказавшись на время от попыток их исправления, вы захотите удалить ненужные точки останова. Удаление точек останова даст возможность VBA при следующем запуске выполнять программу без лишних задержек.
10.1.4. Прямой доступ к файлу
10.1.4. Прямой доступ к файлу Для чтения из файла в произвольном порядке, а не последовательно, можно воспользоваться методом seek, который класс File наследует от IO. Проще всего перейти на байт в указанной позиции. Номер позиции отсчитывается от начала файла, причем самый первый
Определение координат точек
Определение координат точек Команда ID вычисляет координаты точек. Вызывается из падающего меню Tools ? Inquiry ? ID Point или щелчком на пиктограмме Locate Point на панели инструментов Inquiry.В командной строке выводятся координаты точки в текущей пользовательской системе координат,
Определение координат точек
Определение координат точек Команда ID вычисляет координаты точек. Вызывается из падающего меню Tools ? Inquiry ? ID Point или щелчком на пиктограмме Locate Point на панели инструментов Inquiry.В командной строке выводятся координаты точки в текущей пользовательской системе координат,
Выбор точек вершины и угла
Выбор точек вершины и угла Чтобы задать вершину и угловые крайние точки, нажмите клавишу Enter в ответ на запрос: Select arc, circle, line, or <specify vertex> Программа попросит задать точку вершины и затем две крайние точки. Примечание Если вы выберете две параллельные линии, появится
2. Типы точек восстановления
2. Типы точек восстановления Существуют следующие типы точек восстановления:? начальные точки — такие точки создаются при первом запуске Windows. С их помощью можно вернуть все настройки в исходное состояние и получить «чистую» Windows — как сразу после установки;? контрольные
Дополнения точек входа в САС
Дополнения точек входа в САС Международный Союз по телекоммуникациям ввел несколько дополнений точек входа в САС X.509 v2 [78]. Они связывают с точками входа в САС некоторые дополнительные атрибуты. Каждое дополнение может быть помечено как критичное или некритичное.
Не прямой наводкой
Не прямой наводкой Автор: Ваннах МихаилСтвольная артиллерия - одна из немногих систем оружия, унаследованных нами даже не от индустриальной эпохи, а от позднего Средневековья. Тем не менее она находится на вооружении всех армий мира, успешно применяется в боях и, судя по