Страница 1 из 1

Method GetCurvature

СообщениеДобавлено: 16 ноя 2010 15:53
Mihan
Может кто-нибудь подскажет как работает этот метод, может есть пример. Мне нужно узнать "направление" окружности, т.е. есть начальная точка на окружности и есть конечная точка окружности, нужно узнать как идет окружность от н.т до к.н. или от к.н. до н.т. Вот что есть в хелпе:
o Sub GetCurvature( double iParam,
CATSafeArrayVariant oCurvature)

Returns the curvature and curvature direction at the parameter specified.
Parameters:
iParam
The parameter of the chosen point on the curve.
oCurvature[0]
The curvature at the specified parameter.
oCurvature[1;2]
The unit-vector of curvature direction at the specified parameter.

Re: Method GetCurvature

СообщениеДобавлено: 16 ноя 2010 17:44
booSter
Если под "направлением окружности" понимается "по часовой стрелке" либо "против часовой стрелки" в контексте плоскости на которой лежит окружность, то GetCurvature вам вряд ли чем поможет, поскольку она возвращает радиус кривизны (который для окружности постоянен и равен её радиусу) и вектор направления кривизны (который по сути нормаль)

Если начальная точка (A), конечная (B) и центр окружности (O) заданы координатами, то задачу можно решить посчитав угол межу векторами OA и OB и сравнив его с PI.

Если точки заданы параметром на кривой (P1) (P2) то по знаку разности P2-P1, хотя тут есть нюансы связанные с параметризацией самой окружности: вроде как (-PI,PI]

Re: Method GetCurvature

СообщениеДобавлено: 16 ноя 2010 20:47
Mihan
А как же выбрать, если у нас начальная(А), конечная(В) и центр окружности(О) лежат на одной прямой, т.е. на диаметре. Какую полуокружность выбрать???

Re: Method GetCurvature

СообщениеДобавлено: 17 ноя 2010 00:42
bit
А если просто взять начальный и конечный параметры GetParamExtents. Направление от меньшего к большему.

Если нужно знать обход по часовой стрелке или против , попробуйте так:
Сx, Сy - координаты центра
Bx, By - координаты первой точи
1. взять касательную в начальной точке - GetTangent
Tx, Ty
2. Построить вектор из начальной точки к центру
Vx = Cx-Bx; Vy = Cy-By (по иде должно совпасть с направлением кривизны в начальной точке, GetCurvature)
3. направление обхода можно определить по знаку выражения:
Vx*Ty-Vy*Tx
если >0, по часовой стрелке, <0 - против
Если GetTangent возвращает правильное направление, должно сработать.

Re: Method GetCurvature

СообщениеДобавлено: 18 ноя 2010 19:35
Mihan
Может конечно глупый вопрос, но как вызвать процедуру GetParamExtents???Какие нужны входные параметры???
Вот что написано в хелпе:
o Sub GetParamExtents( CATSafeArrayVariant oParams)

Returns the parametric extents of the curve. This is the parametric equivalent of the end-points.
Parameters:
oParams[0]
The parameter associated with the start point of the curve
oParams[1]
The parameter associated with the end point of the curve

И что это за тип CATSafeArrayVariant???

Re: Method GetCurvature

СообщениеДобавлено: 19 ноя 2010 01:29
Mihan
Вроде разобрался, что то начало выводиться. Еще вопросик: во всех процедурах(GetCurvature, GetTangent и т. д.) используется параметр iParam. Откуда его брать??? Может он получается на выходе от процедуры GetParamExtents???

Re: Method GetCurvature

СообщениеДобавлено: 19 ноя 2010 02:04
bit
Mihan писал(а):Еще вопросик: во всех процедурах(GetCurvature, GetTangent и т. д.) используется параметр iParam. Откуда его брать??? Может он получается на выходе от процедуры GetParamExtents???

Именно так.

Re: Method GetCurvature

СообщениеДобавлено: 19 ноя 2010 12:22
booSter
Уравнение кривой можно преобразовать к параметрическому виду:

Код: Выделить всё
 | x = PX(t)
{ y = PY(t)
 | z = PZ(t)

где t - и есть этот самый iParam.

Физический смысл этого параметра - длинна вдоль кривой от её начальной точки (в некотором масштабе). Функция GetParamExtents возвращает границы параметризации кривой. Обычно это диапазон [0,1]: 0 - начало, 1 - конец, но есть и исключения (утверждать не стану, но вроде как окружность и дуга параметризованны через угол в радианах от оси ОХ).