public static bool IsPointInArc(double testAngle, double startAngle, double endAngle, bool clockWise) { double angle1 = HitUtil.CalAngleSweep(startAngle, endAngle, clockWise); double angle2 = HitUtil.CalAngleSweep(startAngle, testAngle, clockWise); if (Math.Abs(angle1 % 360) > Math.Abs(angle2 % 360)) { return(true); } return(false); }
public static ArcModelMini GetArcParametersFromThreePoints(UnitPoint startPoint, UnitPoint midPoint, UnitPoint endPoint) { ArcModelMini arcModel = new ArcModelMini(); arcModel.Clockwise = HitUtil.IsClockwiseByCross(startPoint, midPoint, endPoint); arcModel.Center = HitUtil.CenterPointFrom3Points(startPoint, midPoint, endPoint); arcModel.Radius = (float)HitUtil.Distance(arcModel.Center, startPoint); arcModel.StartAngle = (float)HitUtil.RadiansToDegrees(HitUtil.LineAngleR(arcModel.Center, startPoint, 0)); float EndAngle = (float)HitUtil.RadiansToDegrees(HitUtil.LineAngleR(arcModel.Center, endPoint, 0)); arcModel.SweepAngle = (float)HitUtil.CalAngleSweep(arcModel.StartAngle, EndAngle, arcModel.Clockwise); return(arcModel); }
//TODO:此方法可能存在问题 public static bool IsLineOnArc(UnitPoint p1, UnitPoint p2, UnitPoint center, float radius, double startAngle, double angleSweep, bool clockwise, float thWidth) { List <UnitPoint> unitPoints = HitUtil.GetIntersectPointLineWithCircle(p1, p2, center, radius, thWidth); for (int i = 0; i < unitPoints.Count; i++) { double angle = HitUtil.LineAngleR(center, unitPoints[i], 0); angle = HitUtil.RadiansToDegrees(angle); double sweepAngle = HitUtil.CalAngleSweep(startAngle, angle, clockwise); if (Math.Abs(angleSweep) > Math.Abs(sweepAngle)) { return(true); } } return(false); }
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); }