예제 #1
0
        /// <summary>
        /// 三个点画线段所需要的六个关键点
        /// </summary>
        /// <param name="lp">上一个点</param>
        /// <param name="cp">当前点</param>
        /// <param name="np">下一个点</param>
        /// <param name="width">线段宽度</param>
        /// <param name="ltp">上一个点的上角点</param>
        /// <param name="lbp">上一个点的下角点</param>
        /// <param name="ntp">下一个点的上角点</param>
        /// <param name="nbp">下一个点的下角点</param>
        /// <param name="itp">交汇点的上角点</param>
        /// <param name="ibp">交汇点的下角点</param>
        internal static void GetLinePoints(Vector3 lp, Vector3 cp, Vector3 np, float width,
                                           ref Vector3 ltp, ref Vector3 lbp,
                                           ref Vector3 ntp, ref Vector3 nbp,
                                           ref Vector3 itp, ref Vector3 ibp,
                                           ref Vector3 clp, ref Vector3 crp,
                                           ref bool bitp, ref bool bibp, int debugIndex = 0)
        {
            var dir1  = (cp - lp).normalized;
            var dir1v = Vector3.Cross(dir1, Vector3.forward).normalized *width;

            ltp = lp - dir1v;
            lbp = lp + dir1v;
            if (debugIndex == 1 && cp == np)
            {
                ntp = np - dir1v;
                nbp = np + dir1v;
                clp = cp - dir1v;
                crp = cp + dir1v;
                return;
            }

            var dir2  = (cp - np).normalized;
            var dir2v = Vector3.Cross(dir2, Vector3.back).normalized *width;

            ntp = np - dir2v;
            nbp = np + dir2v;
            clp = cp - dir2v;
            crp = cp + dir2v;

            if (Vector3.Cross(dir1, dir2) == Vector3.zero && np != cp)
            {
                itp = ntp;
                ibp = nbp;
                return;
            }

            var ldist = (Vector3.Distance(cp, lp) + 1) * dir1;
            var rdist = (Vector3.Distance(cp, np) + 1) * dir2;

            bitp = true;
            if (!UGLHelper.GetIntersection(ltp, ltp + ldist, ntp, ntp + rdist, ref itp))
            {
                itp  = cp - dir1v;
                clp  = cp - dir1v;
                crp  = cp - dir2v;
                bitp = false;
            }
            bibp = true;
            if (!UGLHelper.GetIntersection(lbp, lbp + ldist, nbp, nbp + rdist, ref ibp))
            {
                ibp  = cp + dir1v;
                clp  = cp + dir1v;
                crp  = cp + dir2v;
                bibp = false;
            }
            if (bitp == false && bibp == false && cp == np)
            {
                ltp = cp - dir1v;
                clp = cp + dir1v;
                crp = cp + dir1v;
            }
        }
예제 #2
0
        public void Draw(VertexHelper vh)
        {
            var sp         = Vector2.zero;
            var np         = Vector2.zero;
            var posList    = new List <Vector3>();
            var bezierList = new List <Vector3>();
            var cp2        = Vector2.zero;

            foreach (var seg in segs)
            {
                switch (seg.type)
                {
                case SVGPathSegType.M:
                    sp = np = seg.relative ? np + seg.p1 : seg.p1;
                    if (posList.Count > 0)
                    {
                        DrawPosList(vh, posList);
                    }
                    posList.Add(np);
                    break;

                case SVGPathSegType.L:
                    np = seg.relative ? np + seg.p1 : seg.p1;
                    posList.Add(np);
                    break;

                case SVGPathSegType.H:
                    np = seg.relative ? np + new Vector2(seg.value, 0) : new Vector2(seg.value, np.y);
                    posList.Add(np);
                    break;

                case SVGPathSegType.V:
                    np = seg.relative ? np + new Vector2(0, seg.value) : new Vector2(np.x, seg.value);
                    posList.Add(np);
                    break;

                case SVGPathSegType.C:
                    var cp1 = seg.relative ? np + seg.p1 : seg.p1;
                    cp2 = seg.relative ? np + seg.p2 : seg.p2;
                    var ep   = seg.relative ? np + seg.p3 : seg.p3;
                    var dist = (int)Vector2.Distance(np, ep) * 2;
                    if (dist < 2)
                    {
                        dist = 2;
                    }
                    UGLHelper.GetBezierList2(ref bezierList, np, ep, dist, cp1, cp2);
                    for (int n = 1; n < bezierList.Count; n++)
                    {
                        posList.Add(bezierList[n]);
                    }
                    np = ep;
                    break;

                case SVGPathSegType.S:
                    cp1 = np + (np - cp2).normalized * Vector2.Distance(np, cp2);
                    var scp2 = seg.relative ? np + seg.p1 : seg.p1;
                    ep   = seg.relative ? np + seg.p2 : seg.p2;
                    dist = (int)Vector2.Distance(np, ep) * 2;
                    if (dist < 2)
                    {
                        dist = 2;
                    }
                    UGLHelper.GetBezierList2(ref bezierList, np, ep, dist, cp1, scp2);
                    for (int n = 1; n < bezierList.Count; n++)
                    {
                        posList.Add(bezierList[n]);
                    }
                    break;

                case SVGPathSegType.Z:
                    posList.Add(sp);
                    DrawPosList(vh, posList);
                    break;

                case SVGPathSegType.Q:
                case SVGPathSegType.T:
                case SVGPathSegType.A:
                default:
                    Debug.LogError("unknow seg:" + seg.type);
                    break;
                }
            }
            if (posList.Count > 0)
            {
                DrawPosList(vh, posList);
            }
            //UGL.DrawCricle(vh, sp, 1, Color.black);
        }