private static bool IsCubicChordMonotone(Point[] controlPoints, double squaredTolerance)
        {
            double num = GeometryHelper.SquaredDistance(controlPoints[0], controlPoints[3]);

            if (num <= squaredTolerance)
            {
                return(false);
            }
            Vector lhs  = controlPoints[3].Subtract(controlPoints[0]);
            Vector rhs  = controlPoints[1].Subtract(controlPoints[0]);
            double num2 = GeometryHelper.Dot(lhs, rhs);

            if ((num2 < 0.0) || (num2 > num))
            {
                return(false);
            }
            Vector vector3 = controlPoints[2].Subtract(controlPoints[0]);
            double num3    = GeometryHelper.Dot(lhs, vector3);

            if ((num3 < 0.0) || (num3 > num))
            {
                return(false);
            }
            if (num2 > num3)
            {
                return(false);
            }
            return(true);
        }
예제 #2
0
        private IList <double> ComputeAngles()
        {
            _angles = new double[Count];
            for (var i = 1; i < Count - 1; i++)
            {
                _angles[i] = -GeometryHelper.Dot(Normals[i - 1], Normals[i]);
            }
            if (IsClosed)
            {
                var num2 = -GeometryHelper.Dot(Normals[0], Normals[Count - 2]);
                _angles[0] = _angles[Count - 1] = num2;
            }
            else
            {
                _angles[0] = _angles[Count - 1] = 1.0;
            }

            return(_angles);
        }
예제 #3
0
            private static void GetArcAngle(Point ptStart, Point ptEnd, bool fLargeArc, bool fSweepUp,
                                            out double rCosArcAngle, out double rSinArcAngle, out int cPieces)
            {
                rCosArcAngle = GeometryHelper.Dot(ptStart, ptEnd);
                rSinArcAngle = GeometryHelper.Determinant(ptStart, ptEnd);
                if (rCosArcAngle >= 0.0)
                {
                    if (!fLargeArc)
                    {
                        cPieces = 1;
                        return;
                    }

                    cPieces = 4;
                }
                else if (fLargeArc)
                {
                    cPieces = 3;
                }
                else
                {
                    cPieces = 2;
                }

                var d = Math.Atan2(rSinArcAngle, rCosArcAngle);

                if (fSweepUp)
                {
                    if (d < 0.0)
                    {
                        d += 6.2831853071795862;
                    }
                }
                else if (d > 0.0)
                {
                    d -= 6.2831853071795862;
                }

                d           /= cPieces;
                rCosArcAngle = Math.Cos(d);
                rSinArcAngle = Math.Sin(d);
            }