/// <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); }
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); }
/// <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()); }