Продолжаем цикл статей по работе с 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».

Комментарии (0)