コード例 #1
0
ファイル: BulgeHelper.cs プロジェクト: liyangTeam/WSXCut
        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);
        }
コード例 #2
0
        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);
        }