Окружность (дуга окружности) , касательная к двум кривым

Автор ProgForKompas, 26.09.14, 14:43:48

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

ProgForKompas

Здравствуйте, уважаемые!

Подскажите можно ли построить оружность (дугу), касательную к двум кривым (прямая и дуга, две дуги).
Работаю на Delphi.

Dometer

Строить оную "касательную" как эквидистанту (на расстояние R, где R-радиус окружности) к контуру с вершиной в центре окружности.

Впрочем, не вполне ясно что из чего надо строить, но воспользоваться эквидистантами можно как для прямого, так и для обратного построения.

Есть интерфейс ksMathematic2D, в SDK посмотрите арсенал функций и ненужна там никакая эквидистанта.
Можно воспользоваться функцией ksCouplingLineLine.

ProgForKompas

Подробное описание проблемы.
Про эквидистанты если можно поподробнее,
Как можно использовать в данном случае ksCouplingLineLine не пойму.

Есть пример в SDK - c:\Program Files\ASCON\KOMPAS-3D V15\SDK\Pascal\DELPHIAUTO\step2\
Есть темы на форуме - http://forum.ascon.ru/index.php/topic,3941.msg75590.html#msg75590
Для Вашего случая, нужно использовать функции:
- ksCouplingLineCircle - сопряжении окружности и прямой,
- ksCouplingCircleCircle - сопряжения  для двух окружностей.
Принцип их работы одинаков и в примере есть работа с ksCouplingLineLine.

ProgForKompas

Спасибо всем за подсказки.
Проблему решил. Перефразируя заказчика операции Ы "Все придумано до нас!".
Нужно было просто вспомнить построение сопряжений с помощью циркуля.
Искомая координата Х центра дуги сопряжения лежит на пересечении горизонтальной прямой, проходящей через известную координату Y. Тем самым значение координаты Х можно определить по теореме Пифагора.

Вот код, может кому интересно.
var
kompas: KompasObject;
Document2D : ksDocument2D;
DocumentParam: ksDocumentParam;
iMath:ksMathematic2D;
iDynArray: ksDynamicArray;
iPoint, iPoint2: ksMathPointParam;
rad1,rad2,x,y,Rad_p:real;
begin
//Подключаемся к КОМПАСу
if Kompas = nil then
kompas:=KompasObject(CreateOleObject('Kompas.Application.5'));
//Получаем и заполняем интерфейс параметров документа
DocumentParam:=ksDocumentParam(kompas.GetParamStruct(ko_DocumentParam));
DocumentParam.Init();
DocumentParam.type_:=ksDocumentDrawing;
//Получаем интерфейс документа
Document2D:=ksDocument2D(kompas.Document2D);
//Создаем новый чертеж
Document2D.ksCreateDocument(DocumentParam);
//Получаем параметры чертежа
//радиус большой дуги
rad1:=StrToFloat(Ed_rad1.Text);
//радиус дуги сопряжения (маолая)
rad2:=StrToFloat(Ed_rad2.Text);
//радиус толкателя
Rad_p:=StrToFloat(Ed_radP.Text);
//координата х малой окружности считаем по теореме Пифагора
x:=(Rad1- Sqrt(sqr(rad1-rad2)-sqr(Rad_p-rad2)))*(-1)  ;
//кордината y малой окружности
y:=(Rad_p-rad2);
//координаты центра дуги сопряжения получены, можно найти точки пересечения
//дуг и дуги и линии
// Динамический массив для хранения объектов-точек (в виде указателей
// на интерфейсы ksMathPointParam)
iDynArray := ksDynamicArray(Kompas.GetDynamicArray( POINT_ARR ));;
if iDynArray = nil then
Exit;
//Инициализация математического интерфейса
iMath:=ksMathematic2D(Kompas.GetMathematic2D);
//Ищем пересечение Окружностей
if iMath.ksIntersectCirCir(x, y,Rad2,(Rad1*(-1)), 0,Rad1,iDynArray) then
//Если нашли ищем пересечение линии и окружности
if iMath.ksIntersectCirLin(x, y,Rad2,0, Rad_P,0,iDynArray) then
begin
  // Создание объекта-точки, 1-я точка сопряжение окружностей
iPoint := ksMathPointParam(Kompas.GetParamStruct(ko_MathPointParam));
//вторая точка сопряжение окружности и прямой
iPoint2 := ksMathPointParam(Kompas.GetParamStruct(ko_MathPointParam));
// Извлечение точек из массива
iDynArray.ksGetArrayitem( 0, iPoint );
iDynArray.ksGetArrayitem( 1, iPoint2 );
//Все данные получили начинаем построение
//Большая дуга
Document2D.ksArcByPoint(Rad1*(-1),0,Rad1,0,0,iPoint.x, iPoint.y,1,1);
//малая дуга
Document2D.ksArcByPoint(x,y,Rad2,iPoint.x, iPoint.y,iPoint2.x, iPoint2.y,1,1);
//линия
Document2D.ksLineSeg(iPoint2.x, iPoint2.y,iPoint2.x-100, iPoint2.y,1);
// Освобождение объекта-точки
iPoint := nil;
iPoint2 := nil;
end;
//освобождение динамического массива
iDynArray.ksDeleteArray;
//Делаем КОМПАС видимым
kompas.Visible:=true;
end;

также прилагаю схему, на которой показаны переменные