예제 #1
0
        /// <summary>
        /// Возвращает линию, примыкающую к данной линии
        /// </summary>
        /// <param name="l"></param>
        /// <param name="lines"></param>
        /// <param name="endpoint"></param>
        /// <returns></returns>
        public static SearchLineResult GetJointLineAtEnd(Line l, List <Line> lines, int endpoint)
        {
            Line thisLine = null;

            foreach (Line curLine in lines)
            {
                bool check = CheckLinesIsOverlap(l, curLine);
                if (check)
                {
                    thisLine = curLine;
                    break;
                }
            }

            foreach (Line curLine in lines)
            {
                bool check = CheckLinesIsOverlap(thisLine, curLine);
                if (check)
                {
                    continue;
                }

                int[] jointPoints = CheckLinesHaveJoinPoint(thisLine, curLine, true);
                if (jointPoints == null)
                {
                    continue;
                }
                if (jointPoints[0] == endpoint)
                {
                    SearchLineResult result = new SearchLineResult(curLine, jointPoints[1]);
                    return(result);
                }
            }
            return(null);
        }
예제 #2
0
        private static Line MoveJointLine(SearchLineResult res, XYZ delta)
        {
            Line prevLine    = res.Line;
            Line prevLineNew = null;

            if (res.EndpointNumber == 0)
            {
                XYZ p    = prevLine.GetEndPoint(0);
                XYZ newp = new XYZ(p.X + delta.X, p.Y + delta.Y, p.Z + delta.Z);
                prevLineNew = Line.CreateBound(newp, prevLine.GetEndPoint(1));
            }
            if (res.EndpointNumber == 1)
            {
                XYZ p    = prevLine.GetEndPoint(1);
                XYZ newp = new XYZ(p.X + delta.X, p.Y + delta.Y, p.Z + delta.Z);
                prevLineNew = Line.CreateBound(prevLine.GetEndPoint(0), newp);
            }
            return(prevLineNew);
        }
예제 #3
0
        /// <summary>
        /// Перемещает одну из линий контура на заданное расстояние
        /// </summary>
        /// <param name="loop">Линии первоначального контура</param>
        /// <param name="delta">Положительное значение - смещение наружу, отрицательное - внутрь</param>
        /// <param name="side">Одна из сторон</param>
        /// <returns>Набор линий, в котором одна из линий смещена на расстояние</returns>
        public static List <Curve> MoveLine(List <Curve> lines, double delta, LineSide side)
        {
            List <Line> loop = lines.Cast <Line>().ToList();

            List <Line> sideLines = GetSideLines(loop, side);

            XYZ moveVector = null;

            if (side == LineSide.Top)
            {
                moveVector = new XYZ(0, 0, delta);
            }
            else if (side == LineSide.Bottom)
            {
                moveVector = new XYZ(0, 0, delta);
            }
            else
            {
                List <Line> verticalLines   = loop.Where(i => Math.Abs(i.Direction.Z) == 1).ToList();
                XYZ         directionPoint0 = new XYZ(verticalLines[0].GetEndPoint(0).X, verticalLines[0].GetEndPoint(0).Y, 0);
                XYZ         directionPoint1 = new XYZ(verticalLines[1].GetEndPoint(0).X, verticalLines[1].GetEndPoint(0).Y, 0);

                XYZ wallDirectionVector = getVectorFromTwoPoints(directionPoint1, directionPoint0);
                XYZ normalizedDirection = normalizeVector(wallDirectionVector);

                if (side == LineSide.Left)
                {
                    delta = -delta;
                }

                moveVector = new XYZ(normalizedDirection.X * delta, normalizedDirection.Y * delta, 0);
            }


            foreach (Line curLine in sideLines)
            {
                XYZ p1    = curLine.GetEndPoint(0);
                XYZ p1new = new XYZ(p1.X + moveVector.X, p1.Y + moveVector.Y, p1.Z + moveVector.Z);

                XYZ p2    = curLine.GetEndPoint(1);
                XYZ p2new = new XYZ(p2.X + moveVector.X, p2.Y + moveVector.Y, p2.Z + moveVector.Z);

                Line             mainLineNew = Line.CreateBound(p1new, p2new);
                SearchLineResult res0        = GetJointLineAtEnd(curLine, loop, 0);

                Line prevLineNew = MoveJointLine(res0, moveVector);

                SearchLineResult res1     = GetJointLineAtEnd(curLine, loop, 1);
                Line             nextLine = res1.Line;

                Line nextLineNew = MoveJointLine(res1, moveVector);

                loop[loop.IndexOf(curLine)]   = mainLineNew;
                loop[loop.IndexOf(res0.Line)] = prevLineNew;
                loop[loop.IndexOf(res1.Line)] = nextLineNew;

                /*loop.Remove(curLine);
                 * loop.Remove(res0.Line);
                 * loop.Remove(res1.Line);
                 * loop.Add(mainLineNew);
                 * loop.Add(prevLineNew);
                 * loop.Add(nextLineNew);*/
            }

            return(loop.Cast <Curve>().ToList());
        }