Пример #1
0
        public static float ArcLength(this Bezier2 bezier, float step = 0.1f)
        {
            if (bezier.IsStraight())
            {
                return((bezier.d - bezier.a).magnitude);
            }
            float ret = 0;
            float t;

            for (t = step; t < 1f; t += step)
            {
                float len = (bezier.Position(t) - bezier.Position(t - step)).magnitude;
                ret += len;
            }
            {
                float len = (bezier.d - bezier.Position(t - step)).magnitude;
                ret += len;
            }
            return(ret);
        }
Пример #2
0
        /// <summary>
        /// Travels some distance on beizer and calculates the point and tangent at that distance.
        /// </summary>
        /// <param name="distance">distance to travel on the arc in meteres</param>
        /// <param name="tangent">normalized tangent on the curve toward the end of the beizer.</param>
        /// <returns>point on the curve at the given distance.</returns>
        public static Vector2 Travel2(this Bezier2 beizer, float distance, out Vector2 tangent)
        {
            if (beizer.IsStraight())
            {
                tangent = (beizer.d - beizer.a).normalized;
                return(beizer.TravelStraight(distance));
            }
            float t = beizer.Travel(0, distance);

            tangent = beizer.Tangent(t).normalized;
            return(beizer.Position(t));
        }
Пример #3
0
        public static float ArcLength(this Bezier2 bezier, Vector2 point, float step = 0.1f)
        {
            if (bezier.IsStraight())
            {
                return((point - bezier.a).magnitude);
            }
            float ret = 0;
            float t;

            for (t = step; t <= 1f + Epsilon; t += step)
            {
                var   p0   = bezier.Position(t - step);
                float len  = (bezier.Position(t) - p0).magnitude;
                float len2 = (point - p0).magnitude;
                if (len2 <= len + Epsilon)
                {
                    ret += len2;
                    return(ret);
                }
                ret += len;
            }
            return(ret);
        }
Пример #4
0
 public Vector2 CalculateCenter() {
     Vector2 pointAcc = Vector3.zero;
     float totalWieght = 0;
     foreach(var segmentID in SegmentList) {
         Bezier2 bezier = segmentID.ToSegment().CalculateSegmentBezier3().ToCSBezier2();
         float weitght = segmentID.ToSegment().m_averageLength;
         for (float t = 0; t < 1; t+=0.1f) {
             var pos = bezier.Position(t);
             pointAcc += pos * weitght;
             totalWieght += weitght;
         }
     }
     var ret = pointAcc / totalWieght;
     return ret;
 }