Работа с API КОМПАС-3D > Урок 6 > Построение дуги окружности +1
Разработка под Windows, C++, CAD/CAM, API, Блог компании АСКОН
Рекомендация: подборка платных и бесплатных курсов Java - https://katalog-kursov.ru/
Продолжаем цикл статей по работе с API САПР КОМПАС-3D Сергея Норсеева, инженера-программиста АО «ВНИИ «Сигнал», автора книги «Разработка приложений под КОМПАС в Delphi». В качестве среды используется C++ Builder. В предыдущих уроках по API КОМПАС Основы и Оформление чертежа мы исходили из того, что КОМПАС не запущен, в уроке Корректное подключение к КОМПАС мы проверяли наличие уже запущенного КОМПАСа и подключались к нему. В уроке Основная надпись разбирали, как заполнить основную надпись чертежа. В прошлом уроке Графические примитивы мы начали чертить первые геометрические фигуры. В данной статье рассматриваются различные способы построения дуги окружности. В КОМПАС ее можно построить тремя различными способами. Мы рассмотрим их все.
Постановка задачи
Вначале определимся с тем, что будем строить. Для примера предлагаю взять полуокружность радиуса
10 мм с центром в точке с координатами
(100, 100). Данная дуга показана на рисунке ниже.
(Картинка кликабельна).
A, B и C – вспомогательные точки, которые пригодятся нам при описании различных способов построения дуги.
По трем точкам
Первый способ основывается на том, что вам известны координаты точек
A, B и C, но неизвестны координаты центра. Для построения дуги по трем точкам используется метод
ksArcBy3Points интерфейса
ksDocument2D. Ниже приводится его прототип.
long ksArcBy3Points ( double x1, //Координаты первой точки
double y1,
double x2, //Координаты второй точки
double y2,
double x3, //Координаты третьей точки
double y3,
long style);//Стиль линии
Стили линии обсуждались в
предыдущей статье цикла.
В случае успеха метод возвращает указатель на построенную дугу, а в случае ошибки – значение
ноль.
Для построения нашей дуги нужно определиться с координатами точек. Так, точка
A имеет координаты
(90, 100), точка
B (100, 110), точка
C (110, 100). При таких исходных данных вызов метода
ksArcBy3Points должен производиться так, как показано ниже.
Document2D->ksArcBy3Points( 90 , 100, //Точка А
100, 110, //Точка B
110, 100, //Точка C
1); //Cтиль линии
О том, как получить указатель на интерфейс
ksDocument2D, рассказывалось в
предыдущих статьях цикла.
По центру и углам
Данный способ основан на том, что вам известны координаты центра дуги и углы ее концов. Для построения дуги по этой информации используется метод
ksArcByAngle интерфейса
ksDocument2D. Ниже приводится прототип этого метода.
long ksArcByAngle ( double xc, //Координаты центра
double yc,
double rad, //Радиус
double f1, //Углы
double f2,
short direction, //Направление отрисовки
long style); //Стиль линии
С параметрами
xc,
yc,
rad и
style, думаю, всё ясно. С ними вопросов возникнуть не должно.
Параметры
f1 и
f2 задают углы (
в градусах) между прямыми, проходящими через центр дуги и ее конечные точки, и горизонтальной прямой. Данные углы показаны на рисунке ниже.
Теперь по поводу параметра
direction. Он задает направление, в котором следует отрисовывать дугу. Если он равен
1, то дуга строится против часовой стрелки, если же он равен
-1, то дуга строится по часовой стрелке. Например, дуга, изображенная на рисунке выше, отрисована против часовой стрелки, а на рисунке ниже представлена дуга, построенная с теми же параметрами, но по часовой стрелке.
В случае успеха метод
ksArcByAngle возвращает указатель на построенную дугу, а в случае ошибки — значение
ноль.
Вернемся к нашей задаче построения дуги. Для ее отрисовки против часовой стрелки углы должны быть заданы следующим образом:
f1 = 0,
f2 = 180. Для отрисовки этой же дуги по часовой стрелке значения углов нужно поменять местами
(f1 = 180, f2 = 0).
Код построения дуги приведен ниже.
Document2D->ksArcByAngle( 100, 100, //Координаты центра
10, //Радиус
0, 180, //Углы
1, //Против часовой стрелки
1); //Cтиль линии
По центру и конечным точкам
Данный способ основан на том, что вам известны координаты центра дуги и координаты конечных точек дуги. Для построения дуги по этой информации используется метод
ksArcByPoint интерфейса
ksDocument2D. Ниже приводится прототип этого метода.
long ksArcByPoint ( double xc, //Координаты центра
double yc,
double rad, //Радиус
double x1, //Координаты первой конечной точки
double y1,
double x2, //Координаты второй конечной точки
double y2,
short direction, //Направление
long style); //Стиль линии
Данный метод очень похож на рассмотренный ранее метод
ksArcByAngle. Разница состоит лишь в том, что конечные точки задаются не углами, а координатами.
В случае успеха метод
ksArcByPoint возвращает указатель на дугу, а в случае ошибки —
ноль.
Ниже приводится код вызова этого метода для построения нашей дуги.
Document2D->ksArcByPoint( 100, 100, //Координаты центра
10, //Радиус
110, 100, //Точка C
90 , 100, //Точка A
1, //Против часовой стрелки
1); //Стиль линии
Внимательный читатель наверняка заметил, что параметры метода
ksArcByPoint являются избыточными. Почему? Неужели ошибка создателей API? На самом деле нет. Просто нужно правильно понимать назначение точек
(x1, y1) и
(x2, y2). Согласно документации КОМПАС:
x1, y1 – координаты начальной точки дуги,
x2, y2 – координаты конечной точки дуги.
Такое неправильное описание и создает путаницу. На самом деле точки
(x1, y1) и
(x2, y2) могут не принадлежать дуге. Они задают не положение конечных точек, а ориентацию вектора, на котором они находятся. Причем начало этого вектора находится в центре дуги. Рисунок ниже поясняет это более наглядно.
Исходя из этого, рассматриваемую нами дугу можно построить с помощью кода, приведенного ниже.
double xc = 100;
double yc = 100;
Document2D->ksArcByPoint( xc, yc, //Координаты центра
10, //Радиус
xc+1, yc, //Первая конечная точка
xc-1, yc, //Вторая конечная тока
1, //Против часовой стрелки
1); //Стиль линии
Обратите внимание: конечные точки не совпадают с точками
A и
C, но дуга все равно строится правильно.
Заключение
В данной статье мы рассмотрели различные способы построения дуги окружности. Каким из них пользоваться, решайте сами. Но я думаю, что ваше решение будет определяться той информацией о дуге, которая у вас есть в данный момент времени.
Продолжение следует, следите за новостями блога.
Сергей Норсеев, автор книги «Разработка приложений под КОМПАС в Delphi».
К сожалению, не доступен сервер mySQL