private void CalculateRoundParams(double radius) { if (radius > this.maxRadius) { return; } List <UnitPointBulge> temp = new List <UnitPointBulge>(); double bulge = BulgeHelper.GetBulgFromRadian(Math.PI / 2); bulge = this.Clockwise ? -bulge : bulge; List <UnitPoint> unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[0], this.rectPoint[1], this.rectPoint[2], radius); temp.Add(new UnitPointBulge(unitPoints[0], bulge)); temp.Add(new UnitPointBulge(unitPoints[1])); unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[1], this.rectPoint[2], this.rectPoint[3], radius); temp.Add(new UnitPointBulge(unitPoints[0], bulge)); temp.Add(new UnitPointBulge(unitPoints[1])); unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[2], this.rectPoint[3], this.rectPoint[0], radius); temp.Add(new UnitPointBulge(unitPoints[0], bulge)); temp.Add(new UnitPointBulge(unitPoints[1])); unitPoints = BulgeHelper.GetCufoffPoint(this.rectPoint[3], this.rectPoint[0], this.rectPoint[1], radius); temp.Add(new UnitPointBulge(unitPoints[0], bulge)); temp.Add(new UnitPointBulge(unitPoints[1])); this.Points = temp; this.Points.Insert(0, this.Points[this.PointCount - 1]); this.Points.RemoveAt(this.PointCount - 1); }
/// <summary> /// 得到直线或者圆弧的标准补偿点 /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="isOutside"></param> /// <returns></returns> public static Tuple <UnitPointBulge, UnitPointBulge> GetCompensationsPoint(UnitPointBulge p1, UnitPointBulge p2, double size, bool isOutside, bool isUpdateBulge = false) { UnitPointBulge up1 = new UnitPointBulge(); UnitPointBulge up2 = new UnitPointBulge(); if (!double.IsNaN(p1.Bulge))//圆弧 { var arc = DrawingOperationHelper.GetArcParametersFromBulge(p1.Point, p2.Point, (float)p1.Bulge); double r = arc.Clockwise ? arc.Radius - size : arc.Radius + size; if (isOutside) { r = arc.Clockwise ? arc.Radius + size : arc.Radius - size; } if (r > 0) { UnitPoint point1 = HitUtil.GetLinePointByDistance(arc.Center, p1.Point, r, true); UnitPoint point2 = HitUtil.GetLinePointByDistance(arc.Center, p2.Point, r, true); up1 = new UnitPointBulge() { Point = point1, Bulge = p1.Bulge, HasMicroConn = p1.HasMicroConn }; up2 = new UnitPointBulge() { Point = point2, Bulge = p2.Bulge, HasMicroConn = p2.HasMicroConn }; if (isUpdateBulge) { up1.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, up1.Point, up2.Point, arc.Clockwise); } } } else //直线 { var line1d1 = DrawingOperationHelper.GetLinePointByVerticalLine(p1.Point, p2.Point, size); var line1d2 = DrawingOperationHelper.GetLinePointByVerticalLine(p2.Point, p1.Point, size); UnitPoint point1 = !isOutside ? line1d1.Item2 : line1d1.Item1; UnitPoint point2 = !isOutside ? line1d2.Item1 : line1d2.Item2; up1 = new UnitPointBulge() { Point = point1, Bulge = p1.Bulge, HasMicroConn = p1.HasMicroConn }; up2 = new UnitPointBulge() { Point = point2, Bulge = p2.Bulge, HasMicroConn = p2.HasMicroConn }; } return(Tuple.Create(up1, up2)); }
private static List <IDrawObject> ConvertToMultiSegLine(Circle circle, List <BridgePoints> bridges) { List <IDrawObject> retObjects = new List <IDrawObject>(); if (bridges.Count == 2) { bridges[0].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(circle.Center, bridges[0].Point2.Point, bridges[1].Point1.Point, circle.IsClockwise);; retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = circle.LayerId, GroupParam = CopyUtil.DeepCopy(circle.GroupParam), Points = new List <UnitPointBulge>() { bridges[0].Point2, bridges[1].Point1 } }); bridges[1].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(circle.Center, bridges[1].Point2.Point, bridges[0].Point1.Point, circle.IsClockwise);; retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = circle.LayerId, GroupParam = CopyUtil.DeepCopy(circle.GroupParam), Points = new List <UnitPointBulge>() { bridges[1].Point2, bridges[0].Point1 } }); } else if (bridges.Count == 1) { bridges[0].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(circle.Center, bridges[0].Point2.Point, bridges[0].Point1.Point, circle.IsClockwise);; retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = circle.LayerId, GroupParam = CopyUtil.DeepCopy(circle.GroupParam), Points = new List <UnitPointBulge>() { bridges[0].Point2, bridges[0].Point1 } }); } return(retObjects); }
/// <summary> /// 直线与直线,补偿求交点 /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <param name="indexCur"></param> /// <returns></returns> private static List <UnitPointBulge> CalCompensationsBy2Line(UnitPointBulge p1, UnitPointBulge p2, UnitPointBulge p3, int indexCur, CompensationModel compensationParam, bool isOutside) { var retPoints = new List <UnitPointBulge>(); var cPoints1 = GetCompensationsPoint(p1, p2, compensationParam.Size, isOutside); var cPoints2 = GetCompensationsPoint(p2, p3, compensationParam.Size, isOutside); //如果两点距离在误差范围内,当做同一个点处理 if (HitUtil.Distance(cPoints1.Item2.Point, cPoints2.Item1.Point) < errorRange) { retPoints.Add(new UnitPointBulge(cPoints1.Item2.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } var line1 = DrawingOperationHelper.GetLineEquation(cPoints1.Item1.Point, cPoints1.Item2.Point); var line2 = DrawingOperationHelper.GetLineEquation(cPoints2.Item1.Point, cPoints2.Item2.Point); UnitPoint point = DrawingOperationHelper.GetIntersectionPointBy2Line(line1.Item1, line1.Item2, line1.Item3, line2.Item1, line2.Item2, line2.Item3); if (double.IsNaN(point.X) || double.IsNaN(point.Y)) { //平行 retPoints.Add(new UnitPointBulge(cPoints1.Item2.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } else { bool pointInLine = HitUtil.IsPointInLine(cPoints1.Item1.Point, cPoints1.Item2.Point, point, errorRange); if (compensationParam.IsSmooth && !pointInLine) { //圆角处理,转换为带弧度的点 bool closewise = HitUtil.IsClockwiseByCross(cPoints1.Item1.Point, cPoints1.Item2.Point, p2.Point); double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(p2.Point, cPoints1.Item2.Point, cPoints2.Item1.Point, closewise); retPoints.Add(new UnitPointBulge(cPoints1.Item2.Point, bulge, hasMicroConn: p2.HasMicroConn, position: -1 - indexCur)); retPoints.Add(new UnitPointBulge(cPoints2.Item1.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } else { retPoints.Add(new UnitPointBulge(point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } } }
private void GetMultiLineLeadLineParams(IDrawObject drawObject, LineInOutParamsModel leadInOutParamsModel) { MultiSegmentLineBase multiSegmentLine = drawObject as MultiSegmentLineBase; int segment = 0; if (multiSegmentLine != null) { //所在段数必须合法 segment = DrawingOperationHelper.GetPointInLineIndex(multiSegmentLine, this.p2); int nextIndex = (segment + 1 >= multiSegmentLine.PointCount && multiSegmentLine.IsCloseFigure) ? 0 : segment + 1; if (double.IsNaN(multiSegmentLine.Points[segment].Bulge)) { double partLen = HitUtil.Distance(multiSegmentLine.Points[segment].Point, this.p2); double allLen = HitUtil.Distance(multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point); float percent = (float)(segment + partLen / allLen); leadInOutParamsModel.FigureTotalLength = (float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(multiSegmentLine.Points, multiSegmentLine.IsCloseFigure, percent) / multiSegmentLine.SizeLength); //角度(p1p2与当前线段所成夹角或与圆弧在当前鼠标点位置的切点出的切线所成夹角) this.p2 = HitUtil.FindApparentIntersectPoint(this.p1, this.p2, multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point); double lineAngle = HitUtil.LineAngleR(multiSegmentLine.Points[nextIndex].Point, multiSegmentLine.Points[segment].Point, 0); UnitPoint extensionCordPoint = HitUtil.LineEndPoint(multiSegmentLine.Points[segment].Point, lineAngle, 5); leadInOutParamsModel.LineInAngle = (float)BulgeHelper.CalTwoLinesAngleFromThreePoints(extensionCordPoint, this.p2, this.p1); multiSegmentLine.IsInnerCut = HitUtil.IsClockwiseByCross(this.p1, this.p2, extensionCordPoint) == multiSegmentLine.Clockwise ? false : true; } else { ArcModelMini arcModelMini = DrawingOperationHelper.GetArcParametersFromBulge(multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point, (float)multiSegmentLine.Points[segment].Bulge); float percent = segment + DrawingOperationHelper.GetPercentInArcByPoint(arcModelMini, this.p2); leadInOutParamsModel.FigureTotalLength = (float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(multiSegmentLine.Points, multiSegmentLine.IsCloseFigure, percent) / multiSegmentLine.SizeLength); bool isInner; leadInOutParamsModel.LineInAngle = DrawingOperationHelper.GetLeadLineAngleArc(this.p1, this.p2, arcModelMini.Center, arcModelMini.Clockwise, out isInner); multiSegmentLine.IsInnerCut = isInner; } } //长度(p1p2的长度) leadInOutParamsModel.LineInLength = (float)HitUtil.Distance(p1, p2); }
/// <summary> /// 圆弧到直线,补偿求交点 /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <param name="indexCur"></param> /// <returns></returns> private static List <UnitPointBulge> CalCompensationsByArcLine(UnitPointBulge p1, UnitPointBulge p2, UnitPointBulge p3, int indexCur, CompensationModel compensationParam, bool isOutside) { var retPoints = new List <UnitPointBulge>(); ArcModelMini arc = DrawingOperationHelper.GetArcParametersFromBulge(p1.Point, p2.Point, (float)p1.Bulge); var cPoints = GetCompensationsPoint(p2, p3, compensationParam.Size, isOutside); double r = arc.Clockwise ? arc.Radius - compensationParam.Size : arc.Radius + compensationParam.Size; if (isOutside) { r = arc.Clockwise ? arc.Radius + compensationParam.Size : arc.Radius - compensationParam.Size; } UnitPoint point1 = HitUtil.GetLinePointByDistance(arc.Center, p2.Point, r, true); //如果两点距离在误差范围内,当做同一个点处理 if (HitUtil.Distance(point1, cPoints.Item1.Point) < errorRange) { retPoints.Add(new UnitPointBulge(point1, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } var line = DrawingOperationHelper.GetLineEquation(cPoints.Item1.Point, cPoints.Item2.Point); var intersects = DrawingOperationHelper.GetIntersectPointByLineAndCircle(line.Item1, line.Item2, line.Item3, arc.Center, r); var validPoint = new UnitPoint(double.NaN, double.NaN); UnitPoint intersecteArcPoint = new UnitPoint(double.NaN, double.NaN); //筛选有交点,如果有两个点就选距离p2近的点 if (intersects.Count == 1) { validPoint = intersects[0]; } else if (intersects.Count == 2) { validPoint = HitUtil.Distance(intersects[0], p2.Point) < HitUtil.Distance(intersects[1], p2.Point) ? intersects[0] : intersects[1]; } if (validPoint.IsEmpty) //|| !HitUtil.IsPointInLine(cPoints.Item1.Point, cPoints.Item2.Point, validPoint, errorRange)) { //求圆弧的切线的交点 if (arc.Clockwise != HitUtil.IsClockwiseByCross(p2.Point, point1, cPoints.Item1.Point)) { var l1 = DrawingOperationHelper.GetLineEquationByVerticalLine(point1, p2.Point); intersecteArcPoint = DrawingOperationHelper.GetIntersectionPointBy2Line(l1.Item1, l1.Item2, l1.Item3, line.Item1, line.Item2, line.Item3); } } bool completedSmooth = false; //是否完成圆角处理 if (compensationParam.IsSmooth) //圆角处理 { if (!intersecteArcPoint.IsEmpty || (!validPoint.IsEmpty && !HitUtil.IsPointInLine(cPoints.Item1.Point, cPoints.Item2.Point, validPoint, errorRange))) { bool closewise = HitUtil.IsClockwiseByCross(p2.Point, cPoints.Item1.Point, cPoints.Item2.Point); double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(p2.Point, point1, cPoints.Item1.Point, closewise); retPoints.Add(new UnitPointBulge(point1, bulge, hasMicroConn: p2.HasMicroConn, position: -1 - indexCur)); retPoints.Add(new UnitPointBulge(cPoints.Item1.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); completedSmooth = true; } } if (!completedSmooth) { if (!intersecteArcPoint.IsEmpty) { retPoints.Add(new UnitPointBulge(point1, position: indexCur)); retPoints.Add(new UnitPointBulge(intersecteArcPoint, position: indexCur)); } else if (!validPoint.IsEmpty) { retPoints.Add(new UnitPointBulge(validPoint, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } else { retPoints.Add(new UnitPointBulge(point1, position: indexCur)); retPoints.Add(new UnitPointBulge(p2.Point, position: indexCur)); retPoints.Add(new UnitPointBulge(cPoints.Item1.Point, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); } } return(retPoints); }
/// <summary> /// 计算补偿点 /// </summary> /// <param name="points"></param> /// <param name="isCloseFigure"></param> /// <param name="compensationParam"></param> /// <param name="isReverseDirection"></param> /// <param name="isOutside"></param> /// <returns></returns> public static List <UnitPointBulge> CalCompensationPoints(List <UnitPointBulge> points, bool isCloseFigure, CompensationModel compensationParam, bool isReverseDirection, bool isOutside) { var rets = new List <UnitPointBulge>(); if (points == null && points.Count <= 0) { return(rets); } #region 计算补偿点坐标 if (points.Count == 2) { var ps = GetCompensationsPoint(points[0], points[1], compensationParam.Size, isOutside); ps.Item1.IsBasePoint = true; ps.Item1.Position = 0; ps.Item2.IsBasePoint = true; ps.Item2.Position = 1; rets.Add(ps.Item1); rets.Add(ps.Item2); } else if (points.Count >= 3) { for (int i = 0; i < points.Count; i++) { if (!isCloseFigure && i == 0) { var ps = GetCompensationsPoint(points[0], points[1], compensationParam.Size, isOutside); ps.Item1.IsBasePoint = true; ps.Item1.Position = i; rets.Add(ps.Item1); } else if (!isCloseFigure && i == points.Count - 1) { var ps = GetCompensationsPoint(points[i - 1], points[points.Count - 1], compensationParam.Size, isOutside); ps.Item2.IsBasePoint = true; ps.Item2.Position = i; rets.Add(ps.Item2); } else { int indexPer = (i - 1 < 0) ? points.Count - 1 : i - 1; //前一段 int indexCur = i; //当前段 int indexNext = (i + 1 > points.Count - 1) ? 0 : i + 1; //后一段 UnitPointBulge p1 = points[indexPer]; UnitPointBulge p2 = points[indexCur]; UnitPointBulge p3 = points[indexNext]; var ps = new List <UnitPointBulge>(); if (!double.IsNaN(p1.Bulge) && !double.IsNaN(p2.Bulge)) { //圆弧到圆弧,求交点 ps = CalCompensationsBy2Arc(p1, p2, p3, indexCur, compensationParam, isOutside); } else if (double.IsNaN(p1.Bulge) && !double.IsNaN(p2.Bulge)) { //直线到圆弧,求交点 ps = CalCompensationsByLineArc(p1, p2, p3, indexCur, compensationParam, isOutside); } else if (!double.IsNaN(p1.Bulge) && double.IsNaN(p2.Bulge)) { //圆弧到直线,求交点 ps = CalCompensationsByArcLine(p1, p2, p3, indexCur, compensationParam, isOutside); } else { //直线到直线,求交点 ps = CalCompensationsBy2Line(p1, p2, p3, indexCur, compensationParam, isOutside); } if (ps.Count > 0) { ps[ps.Count - 1].IsBasePoint = true; } rets.AddRange(ps); } } } #endregion #region 更新凸度值,和所在段的标记 for (int i = 0; i < rets.Count - 1; i++) { if (!double.IsNaN(rets[i].Bulge) && (int)rets[i].Position >= 0) { ArcModelMini arc = DrawingOperationHelper.GetArcParametersFromBulge(points[(int)rets[i].Position].Point, points[(int)rets[i].Position + 1].Point, (float)points[(int)rets[i].Position].Bulge); double bugle = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, rets[i].Point, rets[i + 1].Point, arc.Clockwise); rets[i].Bulge = bugle; } if ((int)rets[i].Position < 0) { rets[i].Position = -(rets[i].Position + 1); } } if (isCloseFigure && rets.Count > 0 && !double.IsNaN(rets[rets.Count - 1].Bulge) && rets[rets.Count - 1].Position >= 0) { ArcModelMini arc = DrawingOperationHelper.GetArcParametersFromBulge(points[points.Count - 1].Point, points[0].Point, (float)points[points.Count - 1].Bulge); double bugle = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, rets[rets.Count - 1].Point, rets[0].Point, arc.Clockwise); rets[rets.Count - 1].Bulge = bugle; } if (rets.Count > 0 && (int)rets[rets.Count - 1].Position < 0) { rets[rets.Count - 1].Position = -(rets[rets.Count - 1].Position + 1); } #endregion #region 根据情况调整起点 if (isCloseFigure) { int index = rets.FindLastIndex(e => (int)e.Position == 0); if ((index == 1 && !isReverseDirection) || index == 2) { var temp = rets[0]; rets.Remove(temp); rets.Add(temp); } } #endregion return(rets); }
/// <summary> /// 圆弧到圆弧,补偿求交点 /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <param name="indexCur"></param> /// <returns></returns> private static List <UnitPointBulge> CalCompensationsBy2Arc(UnitPointBulge p1, UnitPointBulge p2, UnitPointBulge p3, int indexCur, CompensationModel compensationParam, bool isOutside) { var retPoints = new List <UnitPointBulge>(); ArcModelMini arc1 = DrawingOperationHelper.GetArcParametersFromBulge(p1.Point, p2.Point, (float)p1.Bulge); ArcModelMini arc2 = DrawingOperationHelper.GetArcParametersFromBulge(p2.Point, p3.Point, (float)p2.Bulge); double r1 = arc1.Clockwise ? arc1.Radius - compensationParam.Size : arc1.Radius + compensationParam.Size; double r2 = arc2.Clockwise ? arc2.Radius - compensationParam.Size : arc2.Radius + compensationParam.Size; if (isOutside) { r1 = arc1.Clockwise ? arc1.Radius + compensationParam.Size : arc1.Radius - compensationParam.Size; r2 = arc2.Clockwise ? arc2.Radius + compensationParam.Size : arc2.Radius - compensationParam.Size; } UnitPoint point1 = HitUtil.GetLinePointByDistance(arc1.Center, p2.Point, r1, true); UnitPoint point2 = HitUtil.GetLinePointByDistance(arc2.Center, p2.Point, r2, true); if (HitUtil.Distance(point1, point2) < errorRange) { retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } var intersects = DrawingOperationHelper.GetIntersectPointBy2Circle(arc1.Center, r1, arc2.Center, r2); var validPoint = new UnitPoint(double.NaN, double.NaN); UnitPoint intersecteArcPoint = new UnitPoint(double.NaN, double.NaN); //筛选有交点,如果有两个点就选距离p2近的点 if (intersects.Count == 1) { validPoint = intersects[0]; } else if (intersects.Count == 2) { validPoint = HitUtil.Distance(intersects[0], p2.Point) < HitUtil.Distance(intersects[1], p2.Point) ? intersects[0] : intersects[1]; } bool closewise = HitUtil.IsClockwiseByCross(p2.Point, point1, point2); if (validPoint.IsEmpty) { if (arc1.Clockwise != closewise || arc2.Clockwise != closewise)//求两个圆弧的切线的交点 { var line1 = DrawingOperationHelper.GetLineEquationByVerticalLine(point1, arc1.Center); var line2 = DrawingOperationHelper.GetLineEquationByVerticalLine(point2, arc2.Center); intersecteArcPoint = DrawingOperationHelper.GetIntersectionPointBy2Line(line1.Item1, line1.Item2, line1.Item3, line2.Item1, line2.Item2, line2.Item3); } } bool completedSmooth = false; //是否完成圆角处理 if (compensationParam.IsSmooth) //圆角处理 { bool needSmooth = false; if (!validPoint.IsEmpty) { double lineAngle = HitUtil.LineAngleR(arc1.Center, validPoint, 0); bool pointInArc = HitUtil.IsPointInArc(HitUtil.RadiansToDegrees(lineAngle), HitUtil.RadiansToDegrees(arc1.StartAngle), HitUtil.RadiansToDegrees(arc1.EndAngle), arc1.Clockwise); needSmooth = !pointInArc; } if (!intersecteArcPoint.IsEmpty || needSmooth) { double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(p2.Point, point1, point2, closewise); retPoints.Add(new UnitPointBulge(point1, bulge, hasMicroConn: p2.HasMicroConn, position: -1 - indexCur)); retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); completedSmooth = true; } } if (!completedSmooth) { if (!validPoint.IsEmpty) { retPoints.Add(new UnitPointBulge(validPoint, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); return(retPoints); } else if (!intersecteArcPoint.IsEmpty) { retPoints.Add(new UnitPointBulge(point1, position: indexCur)); retPoints.Add(new UnitPointBulge(intersecteArcPoint, position: indexCur)); retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); } else { retPoints.Add(new UnitPointBulge(point1, position: indexCur)); retPoints.Add(new UnitPointBulge(p2.Point, position: indexCur)); retPoints.Add(new UnitPointBulge(point2, p2.Bulge, hasMicroConn: p2.HasMicroConn, position: indexCur)); } } return(retPoints); }
private static List <IDrawObject> ConvertToMultiSegLine(MultiSegmentLineBase multiSegLine, List <BridgePoints> bridges) { List <IDrawObject> retObjects = new List <IDrawObject>(); double totalLength = 0; List <MicroUnitPoint> microTemps = MicroConnectHelper.InitMicroUnitPoint(multiSegLine.Points, multiSegLine.IsCloseFigure, out totalLength); List <MicroUnitPoint> microBridges = new List <MicroUnitPoint>(); microTemps.ForEach(e => e.Point.IsBasePoint = true); #region 位置点计算长度 foreach (BridgePoints point in bridges) { //第一个位置点 MicroUnitPoint startPoint = microTemps[(int)point.Point1.Position]; MicroUnitPoint endPoint = microTemps[(int)point.Point1.Position + 1 > microTemps.Count - 1 ? 0 : (int)point.Point1.Position + 1]; double length = 0; if (!double.IsNaN(startPoint.Point.Bulge)) { var arcMini = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, endPoint.Point.Point, (float)startPoint.Point.Bulge); double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arcMini.Center, startPoint.Point.Point, point.Point1.Point, arcMini.Clockwise); var arcNew = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, point.Point1.Point, (float)bulge); length = DrawingOperationHelper.GetArcLength(arcNew.Radius, arcNew.SweepAngle); } else { length = HitUtil.Distance(startPoint.Point.Point, point.Point1.Point); } microBridges.Add(new MicroUnitPoint() { Point = point.Point1, OwerPos = (int)point.Point1.Position, StartLength = startPoint.StartLength + length, Flags = MicroConnectFlags.None }); //第二个位置点 startPoint = microTemps[(int)point.Point2.Position]; endPoint = microTemps[(int)point.Point2.Position + 1 > microTemps.Count - 1 ? 0 : (int)point.Point2.Position + 1]; if (!double.IsNaN(startPoint.Point.Bulge)) { var arcMini = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, endPoint.Point.Point, (float)startPoint.Point.Bulge); double bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arcMini.Center, startPoint.Point.Point, point.Point2.Point, arcMini.Clockwise); var arcNew = DrawingOperationHelper.GetArcParametersFromBulge(startPoint.Point.Point, point.Point2.Point, (float)bulge); length = DrawingOperationHelper.GetArcLength(arcMini.Radius, arcNew.SweepAngle); } else { length = HitUtil.Distance(startPoint.Point.Point, point.Point2.Point); } microBridges.Add(new MicroUnitPoint() { Point = point.Point2, OwerPos = (int)point.Point2.Position, StartLength = startPoint.StartLength + length, Flags = MicroConnectFlags.None }); } #endregion #region 排序,相当于在合适的位置插入位置点 microTemps.AddRange(microBridges); microTemps.Sort((x, y) => { if (x.StartLength > y.StartLength) { return(1); } return(-1); }); #endregion #region 更新bulge for (int i = 0; i < microTemps.Count; i++) { int iNext = i + 1 >= microTemps.Count ? 0 : i + 1; if (!double.IsNaN(microTemps[i].Point.Bulge) && (!microTemps[i].Point.IsBasePoint || !microTemps[iNext].Point.IsBasePoint)) { int mIndex = microTemps[i].Point.IsBasePoint ? microTemps[i].OwerPos : (int)microTemps[i].Point.Position; int mNext = mIndex + 1 >= multiSegLine.Points.Count ? 0 : mIndex + 1; ArcModelMini arc = DrawingOperationHelper.GetArcParametersFromBulge(multiSegLine.Points[mIndex].Point, multiSegLine.Points[mNext].Point, (float)multiSegLine.Points[mIndex].Bulge); microTemps[i].Point.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, microTemps[i].Point.Point, microTemps[iNext].Point.Point, arc.Clockwise); } } #endregion #region 更新断开的位置标志 bridges.ForEach(e => { int startIndex = microTemps.FindIndex(m => m.Point == e.Point1); int endIndex = microTemps.FindIndex(m => m.Point == e.Point2); if (startIndex > endIndex) { var points1 = microTemps.GetRange(startIndex, microTemps.Count - startIndex); var points2 = microTemps.GetRange(0, endIndex); points1.ForEach(p => p.Point.HasMicroConn = true); points2.ForEach(p => p.Point.HasMicroConn = true); } else { var points = microTemps.GetRange(startIndex, endIndex - startIndex); points.ForEach(p => p.Point.HasMicroConn = true); } }); #endregion #region 转换为多段线 MultiSegmentLineBase lwPolyLine = null; for (int i = 0; i < microTemps.Count; i++) { if (microTemps[i].Point.HasMicroConn) { if (lwPolyLine != null) { microTemps[i].Point.HasMicroConn = false; lwPolyLine.Points.Add(microTemps[i].Point); retObjects.Add(lwPolyLine); lwPolyLine = null; } } else { if (lwPolyLine == null) { lwPolyLine = new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = multiSegLine.LayerId, GroupParam = CopyUtil.DeepCopy(multiSegLine.GroupParam), Points = new List <UnitPointBulge>() }; } lwPolyLine.Points.Add(microTemps[i].Point); } } if (lwPolyLine != null) { if (multiSegLine.IsCloseFigure) { (retObjects[0] as MultiSegmentLineBase).Points.InsertRange(0, lwPolyLine.Points); } else { retObjects.Add(lwPolyLine); } } #endregion return(retObjects); }
private static List <IDrawObject> ConvertToMultiSegLine(ArcBase arc, List <BridgePoints> bridges) { List <IDrawObject> retObjects = new List <IDrawObject>(); if (bridges.Count == 2) { double angle1 = HitUtil.LineAngleR(arc.Center, bridges[0].Point1.Point, 0); double angle2 = HitUtil.LineAngleR(arc.Center, bridges[1].Point1.Point, 0); angle1 = HitUtil.CalAngleSweep(arc.StartAngle, HitUtil.RadiansToDegrees(angle1), arc.IsClockwise); angle2 = HitUtil.CalAngleSweep(arc.StartAngle, HitUtil.RadiansToDegrees(angle2), arc.IsClockwise); if (angle1 > angle2) { bridges.Reverse(); } double bulge1 = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, arc.startPoint, bridges[0].Point1.Point, arc.IsClockwise); retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = arc.LayerId, GroupParam = CopyUtil.DeepCopy(arc.GroupParam), Points = new List <UnitPointBulge>() { new UnitPointBulge(arc.startPoint, bulge1), bridges[0].Point1 } }); bridges[0].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, bridges[0].Point2.Point, bridges[1].Point1.Point, arc.IsClockwise);; retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = arc.LayerId, GroupParam = CopyUtil.DeepCopy(arc.GroupParam), Points = new List <UnitPointBulge>() { bridges[0].Point2, bridges[1].Point1 } }); bridges[1].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, bridges[1].Point2.Point, arc.endPoint, arc.IsClockwise);; retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = arc.LayerId, GroupParam = CopyUtil.DeepCopy(arc.GroupParam), Points = new List <UnitPointBulge>() { bridges[1].Point2, new UnitPointBulge(arc.endPoint, bridges[1].Point2.Bulge) } }); } else if (bridges.Count == 1) { double bulge1 = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, arc.startPoint, bridges[0].Point1.Point, arc.IsClockwise); retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = arc.LayerId, GroupParam = CopyUtil.DeepCopy(arc.GroupParam), Points = new List <UnitPointBulge>() { new UnitPointBulge(arc.startPoint, bulge1), bridges[0].Point1 } }); bridges[0].Point2.Bulge = BulgeHelper.GetBulgeFromTwoPointsAndCenter(arc.Center, bridges[0].Point2.Point, arc.endPoint, arc.IsClockwise);; retObjects.Add(new MultiSegmentLineBase() { IsCloseFigure = false, LayerId = arc.LayerId, GroupParam = CopyUtil.DeepCopy(arc.GroupParam), Points = new List <UnitPointBulge>() { bridges[0].Point2, new UnitPointBulge(arc.endPoint, bridges[0].Point2.Bulge) } }); } return(retObjects); }