Esempio n. 1
0
        Arc2d get_arc(int i)
        {
            Arc    a         = (i == 0) ? arc1 : arc2;
            double start_deg = a.AngleStartR * MathUtil.Rad2Deg;
            double end_deg   = a.AngleEndR * MathUtil.Rad2Deg;

            if (a.PositiveRotation == true)
            {
                double tmp = start_deg;
                start_deg = end_deg;
                end_deg   = tmp;
            }
            Arc2d arc = new Arc2d(a.Center, a.Radius, start_deg, end_deg);

            // [RMS] code above does not preserve CW/CCW of arcs.
            //  It would be better to fix that. But for now, just check if
            //  we preserved start and end points, and if not reverse curves.
            if (i == 0 && arc.SampleT(0.0).DistanceSquared(Point1) > MathUtil.ZeroTolerance)
            {
                arc.Reverse();
            }
            if (i == 1 && arc.SampleT(1.0).DistanceSquared(Point2) > MathUtil.ZeroTolerance)
            {
                arc.Reverse();
            }

            return(arc);
        }
Esempio n. 2
0
 public void DebugPrint()
 {
     System.Console.WriteLine("biarc fit Pt0 {0} Pt1 {1}  Tan0 {2} Tan1 {3}", Point1, Point2, Tangent1, Tangent2);
     System.Console.WriteLine("  First: Start {0} End {1}  {2}",
                              (Arc1IsSegment) ? Segment1.P0 : Arc1.SampleT(0),
                              (Arc1IsSegment) ? Segment1.P1 : Arc1.SampleT(1),
                              (Arc1IsSegment) ? "segment" : "arc");
     System.Console.WriteLine("  Second: Start {0} End {1}  {2}",
                              (Arc2IsSegment) ? Segment2.P0 : Arc2.SampleT(0),
                              (Arc2IsSegment) ? Segment2.P1 : Arc2.SampleT(1),
                              (Arc2IsSegment) ? "segment" : "arc");
 }
        /// <summary>
        /// This is a utility function that returns the set of border points, which
        /// is useful when we use a roundrect as a UI element and want the border
        /// </summary>
        public Vector3d[] GetBorderLoop()
        {
            int corner_v = 0;

            for (int k = 0; k < 4; ++k)
            {
                if (((int)SharpCorners & (1 << k)) != 0)
                {
                    corner_v += 1;
                }
                else
                {
                    corner_v += CornerSteps;
                }
            }

            float innerW = Width - 2 * Radius;
            float innerH = Height - 2 * Radius;

            Vector3d[] vertices = new Vector3d[4 + corner_v];
            int        vi       = 0;

            for (int i = 0; i < 4; ++i)
            {
                vertices[vi++] = new Vector3d(signx[i] * Width / 2, 0, signy[i] * Height / 2);

                bool  sharp = ((int)SharpCorners & (1 << i)) > 0;
                Arc2d arc   = new Arc2d(new Vector2d(signx[i] * innerW, signy[i] * innerH),
                                        (sharp) ? MathUtil.SqrtTwo * Radius : Radius,
                                        startangle[i], endangle[i]);
                int use_steps = (sharp) ? 1 : CornerSteps;
                for (int k = 0; k < use_steps; ++k)
                {
                    double   t   = (double)(i + 1) / (double)(use_steps + 1);
                    Vector2d pos = arc.SampleT(t);
                    vertices[vi++] = new Vector3d(pos.x, 0, pos.y);
                }
            }

            return(vertices);
        }