/// <summary> /// Расчет параметров взаимного расположения /// Этот расчет предполагает, что полилинии направлены в одну сторону /// </summary> /// <param name="baseLine"></param> public void ComputeParameters() { if (BaseLine == null) { throw new System.Exception("Нет ссылки на BaseLine"); } //Начало Point3d startPt = Poly2d.GetPoint3dAt(0);//Начальная точка этой полилинии Point3d closestPtBase = BaseLine.GetClosestPointTo(startPt, false); StartParameterBase = BaseLine.GetParameterAtPoint(closestPtBase); //Параметр BaseLine в точке ближайшей к начальной точке этой полилинии Point3d baseLinePt = BaseLine.GetPointAtParameter(StartParameterBase); //точка на BaseLine Point3d closestPt = Poly2d.GetClosestPointTo(baseLinePt, false); StartParameter = Poly2d.GetParameterAtPoint(closestPt);//Обратный расчет параметра текущей линии //Конец Point3d endPt = Poly2d.GetPoint3dAt(Poly2d.NumberOfVertices - 1);//Конечная точка этой полилинии closestPtBase = BaseLine.GetClosestPointTo(endPt, false); EndParameterBase = BaseLine.GetParameterAtPoint(closestPtBase); //Параметр BaseLine в точке ближайшей к конечной точке этой полилинии baseLinePt = BaseLine.GetPointAtParameter(EndParameterBase); //точка на BaseLine closestPt = Poly2d.GetClosestPointTo(baseLinePt, false); EndParameter = Poly2d.GetParameterAtPoint(closestPt);//Обратный расчет параметра текущей линии }
/// <summary> /// Определение расположения справа или слева относительно BaseLine /// Этот расчет предполагает, что полилинии направлены в одну сторону /// </summary> public void ComputeOrientation() { if (BaseLine == null) { throw new System.Exception("Нет ссылки на BaseLine"); } if (StartParameterBase < 0 || StartParameter < 0 || EndParameterBase < 0 || EndParameter < 0) { throw new System.Exception("Не расcчитано расположение"); } //Получить две точки на BaseLine между которыми находится параметр начала этой линии int pt1Index = -1; int pt2Index = -1; if (StartParameterBase == BaseLine.StartParam) { pt1Index = 0; pt2Index = 1; } else if (StartParameterBase == BaseLine.EndParam) { pt1Index = BaseLine.NumberOfVertices - 2; pt2Index = BaseLine.NumberOfVertices - 1; } else if (Math.Truncate(StartParameterBase) == StartParameterBase) { pt1Index = (int)StartParameterBase; pt2Index = (int)StartParameterBase + 1; } else { pt1Index = (int)Math.Floor(StartParameterBase); pt2Index = (int)Math.Ceiling(StartParameterBase); } Point2d baseLinePt1 = BaseLine.GetPoint2dAt(pt1Index); Point2d baseLinePt2 = BaseLine.GetPoint2dAt(pt2Index); Point3d thisLineStartPt = Poly2d.GetPointAtParameter(StartParameter); Point2d thisLineStartPt_2d = new Point2d(thisLineStartPt.X, thisLineStartPt.Y); ToTheRightOfBaseLine = Utils.IsLeft(baseLinePt1, baseLinePt2, thisLineStartPt_2d) < 0; }