/// <summary>
        /// a1-a2線分とb2-b1の線分の交点を計算する
        /// 但し、平行ではなく交点がa1-a2とb2-b1の直線上に見つからないか、線分上に存在しない場合はnullを返す
        /// </summary>
        /// <param name="a1"></param>
        /// <param name="a2"></param>
        /// <param name="b1"></param>
        /// <param name="b2"></param>
        /// <returns></returns>
        public static Coordinate lineSegmentIntersection(Coordinate a1, Coordinate a2, Coordinate b1, Coordinate b2)
        {
            Coordinate coord = CoordinateUtility.intersection(a1, a2, b1, b2);

            if (CoordinateUtility.checkPointAndLineSegment(a1, a2, coord) && CoordinateUtility.checkPointAndLineSegment(b1, b2, coord))
            {
                return(coord);
            }

            return(null);
        }
        /// <summary>
        /// a1-a2のベクトル(a1起点)とb2-b1のベクトル(b2起点)の交点を計算する
        /// 但し、平行ではなく交点がa1-a2とb2-b1の直線上に見つからないか、線分上に存在しない場合はa2,b1の中点を返す
        /// </summary>
        /// <param name="a1"></param>
        /// <param name="a2"></param>
        /// <param name="b1"></param>
        /// <param name="b2"></param>
        /// <returns></returns>
        public static Coordinate vectorIntersection(Coordinate a1, Coordinate a2, Coordinate b1, Coordinate b2)
        {
            Coordinate coord = CoordinateUtility.intersection(a1, a2, b1, b2);

            if (CoordinateUtility.getDistance(a1, coord) < CoordinateUtility.getDistance(a2, coord) || CoordinateUtility.getDistance(b2, coord) < CoordinateUtility.getDistance(b1, coord))
            {
                // 交点座標がa1またはb2に近いに近い場合
                if (!CoordinateUtility.checkPointAndLineSegment(a1, a2, coord) && !CoordinateUtility.checkPointAndLineSegment(b1, b2, coord))
                {
                    coord.x = (a2.x + b1.x) / 2.0f;
                    coord.y = (a2.y + b1.y) / 2.0f;
                }
            }

            return(coord);
        }