public bool Intersect2D(SBSLine2D line, out SBSVector3 point)
        {
            float det = this.A * line.B - line.A * this.B;
            point = SBSVector3.zero;

            if (det == 0)
                return false;

            point.x = (line.B * this.C - this.B * line.C) / det;
            point.y = (this.A * line.C - line.A * this.C) / det;
            return true;
        }
        public static void CreateLine(Vector3[] pointList, float width, Color color, bool isClosed, out Mesh lineMesh)
        {
            /*
             * A -------- C
             * B -------- D
            */

            lineMesh = new Mesh();
            lineMesh.name = "lineMesh";

            if (pointList.Length < 2)
                return;

            int vNum = pointList.Length * 2;
            int tNum = (pointList.Length - 1) * 2 * 3;
            int vIndex = 0;
            int tIndex = 0;
            Vector3[] vertices = new Vector3[vNum];
            Vector2[] uv = new Vector2[vNum];
            Vector3[] normals = new Vector3[vNum];
            Color[] colors = new Color[vNum];
            int[] triangles = new int[tNum];
            if (isClosed)
                triangles = new int[tNum + 2 * 3];

            for (int i = 0; i < pointList.Length - 1; i++)
            {
                Vector3 direction = (pointList[i + 1] - pointList[i]).normalized;
                Vector3 ortho = Vector3.Cross(direction, Vector3.forward);
                SBSVector3 A = pointList[i] - ortho * width * 0.5f;
                SBSVector3 B = pointList[i] + ortho * width * 0.5f;

                direction = (pointList[i] - pointList[i + 1]).normalized;
                ortho = Vector3.Cross(direction, Vector3.forward);
                SBSVector3 C = pointList[i + 1] + ortho * width * 0.5f;
                SBSVector3 D = pointList[i + 1] - ortho * width * 0.5f;

                if (i == 0)
                {
                    vertices[vIndex] = A;
                    vertices[vIndex + 1] = B;
                }
                else
                {
                    SBSLine2D line1 = new SBSLine2D(vertices[vIndex - 2], vertices[vIndex]);
                    SBSLine2D line2 = new SBSLine2D(A, C);
                    SBSVector3 intersection;
                    bool parallel = !line1.Intersect2D(line2, out intersection);
                    if (parallel)
                        vertices[vIndex] = A;
                    else
                        vertices[vIndex] = intersection;

                    line1 = new SBSLine2D(vertices[vIndex - 1], vertices[vIndex + 1]);
                    line2 = new SBSLine2D(B, D);
                    parallel = !line1.Intersect2D(line2, out intersection);
                    if (parallel)
                        vertices[vIndex + 1] = B;
                    else
                        vertices[vIndex + 1] = intersection;
                }

                vertices[vIndex + 2] = C;
                vertices[vIndex + 3] = D;

                triangles[tIndex] = vIndex;
                triangles[tIndex + 1] = vIndex + 2;
                triangles[tIndex + 2] = vIndex + 1;
                triangles[tIndex + 3] = vIndex + 1;
                triangles[tIndex + 4] = vIndex + 2;
                triangles[tIndex + 5] = vIndex + 3;

                tIndex += 6;
                vIndex += 2;
            }

            if (isClosed)
            {
                Vector3 lastPoint = pointList[pointList.Length - 1];
                Vector3 firstPoint = pointList[0];

                SBSVector3 A1 = vertices[0];
                SBSVector3 B1 = vertices[1];
                SBSVector3 C1 = vertices[2];
                SBSVector3 D1 = vertices[3];

                SBSVector3 A2 = vertices[vNum - 1 - 3];
                SBSVector3 B2 = vertices[vNum - 1 - 2];
                SBSVector3 C2 = vertices[vNum - 1 - 1];
                SBSVector3 D2 = vertices[vNum - 1];

                Vector3 direction = (firstPoint - lastPoint).normalized;
                Vector3 ortho = Vector3.Cross(direction, Vector3.forward);
                SBSVector3 A = lastPoint - ortho * width * 0.5f;
                SBSVector3 B = lastPoint + ortho * width * 0.5f;

                direction = (lastPoint - firstPoint).normalized;
                ortho = Vector3.Cross(direction, Vector3.forward);
                SBSVector3 C = firstPoint + ortho * width * 0.5f;
                SBSVector3 D = firstPoint - ortho * width * 0.5f;

                SBSLine2D line1 = new SBSLine2D(A2, C2);
                SBSLine2D line2 = new SBSLine2D(A, C);
                SBSVector3 intersection;
                bool parallel = !line1.Intersect2D(line2, out intersection);
                if (parallel)
                    vertices[vIndex] = A;
                else
                    vertices[vIndex] = intersection;

                line1 = new SBSLine2D(B2, D2);
                line2 = new SBSLine2D(B, D);
                parallel = !line1.Intersect2D(line2, out intersection);
                if (parallel)
                    vertices[vIndex + 1] = B;
                else
                    vertices[vIndex + 1] = intersection;

                line1 = new SBSLine2D(A, C);
                line2 = new SBSLine2D(A1, C1);
                parallel = !line1.Intersect2D(line2, out intersection);
                if (parallel)
                    vertices[0] = A1;
                else
                    vertices[0] = intersection;

                line1 = new SBSLine2D(B, D);
                line2 = new SBSLine2D(B1, D1);
                parallel = !line1.Intersect2D(line2, out intersection);
                if (parallel)
                    vertices[1] = B1;
                else
                    vertices[1] = intersection;

                triangles[tIndex] = vIndex;
                triangles[tIndex + 1] = 0;
                triangles[tIndex + 2] = vIndex + 1;
                triangles[tIndex + 3] = vIndex + 1;
                triangles[tIndex + 4] = 0;
                triangles[tIndex + 5] = 1;
            }

            for (int i = 0; i < vNum; i++)
            {
                uv[i] = Vector2.zero;
                normals[i] = -Vector3.forward;
                colors[i] = color;
            }

            lineMesh.vertices = vertices;
            lineMesh.uv = uv;
            lineMesh.normals = normals;
            lineMesh.colors = colors;

            string log = string.Empty;
            for (int i = 0; i < triangles.Length; i++)
                log += triangles[i] + ", ";
            //Debug.Log(" triangles: " + log);

            lineMesh.triangles = triangles;
        }