예제 #1
0
            /// <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);//Обратный расчет параметра текущей линии
            }
예제 #2
0
            /// <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;
            }