public static double GetBulgeFromThreePoints(UnitPoint p1, UnitPoint p2, UnitPoint p3, bool isRoundAngle = true) { double bulge = Math.PI - CalTwoLinesAngleFromThreePoints(p1, p2, p3); bulge = isRoundAngle ? bulge : 2 * Math.PI - bulge; bool clockwise = HitUtil.IsClockwiseByCross(p1, p2, p3); bulge = GetBulgFromRadian(bulge); bulge = clockwise ? -bulge : bulge; return(bulge); }
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); }