Да, действительно - назвав задачу тривиальной, я немного перегнул =)
Хотя и надобность в решении у меня отпала, но интерес к вопросу не пропал
Придумал вариант решения. Пока не конечный. т.к. со сплайнами какая-то ерунда. Ну и может кто подкинет свежих идей и замечаний
Задумка в следующем:
1. Имеем кривую и точку. Сколько можно отложить перпендикуляров? Правильно - несколько!
2. Берем кривую и разбиваем ее на сегменты. За основу для разбивки берем
Parameter (кстати, толком не пойму - что это такое?! Хотел бы услышать толковое разъяснение)
3. Получаем ближайшую точку на сегменте к искомой точке методом
GetClosestPointTo(Point3d givenPoint, bool extend). Тут-же вопрос - как работает extend? Что и куда продолжается?
4. Проверяем, что если соединить полученную и искомую точку, то образованный отрезок будет перпендикулярен кривой. Для этого используем касательную в точке
Вот код:
private static IEnumerable<Point3d> GetPerpendicularsFromPointOnCurve(Point3d point, Curve curve)
{
var pts = new List<Point3d>();
var curveParamPts = new Point3dCollection();
if (curve is Spline)
{
var spline = (Spline) curve;
for (var cpi = 0; cpi < spline.NumFitPoints; cpi++)
curveParamPts.Add(spline.GetFitPointAt(cpi));
}
else
{
for (var p = 0; p < curve.EndParam; p++)
curveParamPts.Add(curve.GetPointAtParameter(p));
curveParamPts.Add(curve.GetPointAtParameter(curve.EndParam));
}
foreach (Curve splitCurve in curve.GetSplitCurves(curveParamPts))
{
var closestPoint = splitCurve.GetClosestPointTo(point, false);
var derInPoint = splitCurve.GetFirstDerivative(closestPoint);
var angel = (point - closestPoint).GetAngleTo(derInPoint);
if (Math.Abs(angel - Math.PI / 2) < Tolerance.Global.EqualPoint |
Math.Abs(angel - Math.PI) < Tolerance.Global.EqualPoint)
pts.Add(closestPoint);
}
return pts;
}
Извините, вам запрещён просмотр содержимого спойлеров.
Хотелось бы послушать замечания и предложения. Особенно касаемо сплайнов (пока вариант работает не совсем корректно)
И еще вопрос: есть
Curve.GetFirstDerivative(), а есть
Curve.GetSecondDerivative() - В чем различия?