private static List <BridgePoints> GetBridgeByArc(ArcBase arc, UnitPoint p1, UnitPoint p2, BridgingModel param) { List <BridgePoints> retPoints = new List <BridgePoints>(); var line = DrawingOperationHelper.GetLineEquation(p1, p2); double width = param.Width / 2; ArcModelMini arcMini = new DrawModel.ArcModelMini() { Center = arc.Center, Radius = arc.Radius, StartAngle = arc.StartAngle, EndAngle = arc.EndAngle, SweepAngle = arc.AngleSweep, Clockwise = arc.IsClockwise }; List <UnitPoint> points = DrawingOperationHelper.GetIntersectPointByLineAndCircle(line.Item1, line.Item2, line.Item3, arc.Center, arc.Radius); var hasPoints = points?.Where(p => !p.IsEmpty && (HitUtil.IsPointOnArc(p, 0.000001f, arcMini) && HitUtil.IsPointInLine(p1, p2, p, 0.000001f))).ToList(); if (hasPoints != null && hasPoints.Count > 0) { //根据宽度求点 double angle = width / arc.Radius * (arc.IsClockwise ? 1 : -1); hasPoints?.ForEach(p => { double lineAngle = HitUtil.LineAngleR(arcMini.Center, p, 0); double angle1 = lineAngle + angle; double angle2 = lineAngle - angle; UnitPoint retPoint1 = UnitPoint.Empty; UnitPoint retPoint2 = UnitPoint.Empty; if (HitUtil.IsPointInArc(HitUtil.RadiansToDegrees(angle1), arcMini.StartAngle, arcMini.EndAngle, arcMini.Clockwise)) { //第一个位置点 retPoint1 = HitUtil.PointOnCircle(arcMini.Center, arcMini.Radius, angle1); } if (HitUtil.IsPointInArc(HitUtil.RadiansToDegrees(angle2), arcMini.StartAngle, arcMini.EndAngle, arcMini.Clockwise)) { //第二个位置点 retPoint2 = HitUtil.PointOnCircle(arcMini.Center, arcMini.Radius, angle2); } BridgePoints bridges = new BridgePoints(arc, new UnitPointBulge(retPoint1), new UnitPointBulge(retPoint2), HitUtil.Distance(p1, p)); retPoints.Add(bridges); }); } return(retPoints); }
private float GetPercentInPolylineByPoint(IDrawObject drawObject, UnitPoint unitPoint) { MultiSegmentLineBase item = (MultiSegmentLineBase)drawObject; int segment = DrawingOperationHelper.GetPointInLineIndex(item, unitPoint); int nextIndex = (segment + 1 >= item.PointCount) ? 0 : segment + 1; float percent; if (double.IsNaN(item.Points[segment].Bulge)) { double partLen = HitUtil.Distance(item.Points[segment].Point, unitPoint); double allLen = HitUtil.Distance(item.Points[segment].Point, item.Points[nextIndex].Point); percent = (float)(segment + partLen / allLen); } else { DrawModel.ArcModelMini arcModelMini = DrawingOperationHelper.GetArcParametersFromBulge(item.Points[segment].Point, item.Points[nextIndex].Point, (float)item.Points[segment].Bulge); percent = segment + DrawingOperationHelper.GetPercentInArcByPoint(arcModelMini, unitPoint); } return((float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(item.Points, item.IsCloseFigure, percent) / item.SizeLength)); }