Exemple #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="pn"></param>
        /// <returns></returns>
        internal SvgPathItem CreateRoundCorner(Vector2 pn)
        {
            var pc = GetPoint();
            var pb = befor.GetPoint();

            var a1 = MathF.Atan2(pc.Y - pb.Y, pc.X - pb.X); //傾き
            var a2 = MathF.Atan2(pn.Y - pc.Y, pn.X - pc.X); //次の線の傾き
            var a  = (a1 + a2) / 2;

            a = MathF.Abs(a);
            if (a > MathF.PI)
            {
                a -= MathF.PI;
            }

            float r = 2;
            float v = 0;


            v = r / MathF.Tan(a);              // 半径r円の接点の頂点からの距離
            float l1 = CmUtils.Length(pb, pc); // 自分の線の長さ
            float l2 = CmUtils.Length(pc, pn); // 次の線の長さ

            if (l1 < v || l2 < v)
            {
                return(null);
            }


            var citem = new SvgPathItem('C', this);

            var x  = MathF.Cos(a1) * v;
            var y  = MathF.Sin(a1) * v;
            var p1 = new Vector2(pc.X - x, pc.Y - y);

            x = MathF.Cos(a2) * v;
            y = MathF.Sin(a2) * v;
            var p2 = new Vector2(pc.X + x, pc.Y + y);


            var c = r * 0.5522847f; // 半径rの円弧に近似するためのコントロールポイントの長さ

            x = MathF.Cos(a1) * c;
            y = MathF.Sin(a1) * c;
            var c1 = new Vector2(p1.X + x, p1.Y + y);

            x = MathF.Cos(a2) * c;
            y = MathF.Sin(a2) * c;
            var c2 = new Vector2(p2.X - x, p2.Y - y);

            var points = new List <Vector2>();

            points.Add(c1);
            points.Add(c2);
            points.Add(p2);
            citem.SetPoints(points);

            this.points[0] = p1;

            CmUtils.DebugWriteLine(string.Format("a1:{0:0.00},a2:{1:0.00},vl:{2:0.00},cl:{3:0.00}", CmUtils.ToAngle(a1), CmUtils.ToAngle(a2), v, c));

            return(citem);
        }