• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Как на делфи построить касательную линию к кривой Безье

Автор Docent, 27.08.09, 16:30:23

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

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

Docent

Сломал уже всю голову как при помощи делфи к кривой Безье в виде возьмерки провести касательную линию под заданным углом, причем такая линия может быть не одна. Вот еще и выбор необходимой линии нужно сделать

Bordes

Если не связываться с аналитическими методами, то можно попробовать решить "численно":
Угол наклона касательной+90 = угол нормали
В диапазоне параметров полученном из ksGetCurveMinMaxParametr,
при помощи ksGetCurvePoint и ksGetCurvePerpendicular и какого либо поискового алгоритма,
найти все точки кривой, в которых угол нормали равен (с какой-то точностью) искомому.

Примечания:
- ksGetCurveMinMaxParametr - Получить минимальный и максимальный параметр кривой.
- ksGetCurvePoint - Преобразовать параметр кривой t в координаты вида.
- ksGetCurvePerpendicular - Получить угол нормали к кривой в заданной точке.

Docent

  Спасибо за отклик!!!

iMath.ksGetCurveMinMaxParametr (rBezier1,double *tMin,double *tMax);
не понятно, что за минимальный и максимальный параметры кривой

iMath.ksGetCurvePoint (rBezier1, double t, double *kx, double *ky);
что за координаты проекции точки на кривую;

   iMath.ksGetCurvePerpendicular (rBezier1, double x, double y);
И как получить эту точку на кривой, через которую пройдет перпендикуляр, расположенный в пространстве, скажем , под углом 110 градусов

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

Docent

Может можно вот этим как-то сделать необходимое?

Kompas.ksExecuteKompasCommand (prTanLineByPntOn,  false );     

prTanLineByPntOn - процесс Компас API - Касательная прямая через точку кривой

Bordes

Цитата: Docent от 28.08.09, 00:01:41
Может можно вот этим как-то сделать необходимое?

Kompas.ksExecuteKompasCommand (prTanLineByPntOn,  false );     

prTanLineByPntOn - процесс Компас API - Касательная прямая через точку кривой

"Это"   запустит  (может быть) визуальный процесс построения касательной, т.е. как если бы, редактируя чертеж, "руками " вызвать команду. Если решением вашей проблемы считать запуск этой команды, и построение касательных вручную, то это подойдет.

Если вернутся к "численному методу", то в общих чертах можно как-то так начать (сорри, но на С++):
#define Accuracy 1000
double p, Max_p;
//curve - reference на обрабатываемую кривую
ksGetCurveMinMaxParametr (curve, &p, &Max_p);
double delta=(Max_p-p)/Accuracy;

struct TRes { double p, a; } Res[Accuracy];

double x, y, a;

for (long j=0; j < Accuracy; j++)
   {
   ksGetCurvePoint(curve, p, &x, &y);
   Res[j].p=p;
   Res[j].a=ksGetCurvePerpendicular (curve, x, y);
        p+=delta; /*p=p+delta*/
        if(p >= Max_p) break;
   }

- в результате получим массив значений углов нормали к кривой в заданном количестве точек.
- далее выбираем в этом массиве все углы, максимально близкие к искомому, например, сортируя массив по возрастанию значения выражения fabs(a-a_src), где a_src искомый угол, fabs стандартная функция получения абсолютного значения). Возможно придется еще учесть, что искомый угол наклона может иметь два значения, различающиеся на 180 гр.
- для выбранных углов,  по сохраненному параметру,  получаем нужные координаты точки кривой (через ksGetCurvePoint ).
! Естественно точность этого простого метода зависит от заданного количества шагов вычисления угла и длины кривой, для повышения точности надо или изменить или усложнить метод решения!

Docent