frechet 距离(狗绳距离)代码实现与优化(只是简单的优化,比递归提高9倍速度)

frechet 距离(狗绳距离)代码实现与优化(只是简单的优化,比递归提高9倍速度),第1张

frechet 距离(狗绳距离)代码实现与优化(只是简单的优化,比递归提高9倍速度) 背景

          看论文看到了这距离的作用,就试着学了一下,然后又恰巧发现这东西是个二维的dp 就用之前学的dp优化方法搞了一下。

          这个距离的定义我就不讲了,数学描述烧脑子,有兴趣自己去看。直觉定义我放这儿。

一个人在遛狗,他们走在各自的道路上。他们可能有着不同的速度,但是都不能往回走。最终的目的,就是求满足要求的绳子的最小长度。

          作用。这个重要,用来衡量两个曲线(空间路径)的相似性,曲线的相似性,我感觉我回到了泛函分析(晕)

文件结构

代码

          首先定义一个计算距离的py文件,其实就是把三种距离的计算打包在一个py文件里面,主要就是看你想用啥距离测度来描述两个点的距离(曼哈顿,欧式。切比雪夫、马氏、测地巴拉巴拉)

distance_lib.py

import numpy as np
import math
from numba import jit


@jit(nopython=True, fastmath=True)
def euclidean(p: np.ndarray, q: np.ndarray) -> float:
    d = p - q
    return math.sqrt(np.dot(d, d))


@jit(nopython=True, fastmath=True)
def haversine(p: np.ndarray,
              q: np.ndarray) -> float:
    """
    Vectorized haversine distance calculation
    :p: Initial location in radians
    :q: Final location in radians
    :return: Distance
    """
    d = q - p
    a = math.sin(d[0]/2.0)**2 + math.cos(p[0]) * math.cos(q[0]) 
        * math.sin(d[1]/2.0)**2

    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1.0 - a))
    return c


@jit(nopython=True, fastmath=True)
def earth_haversine(p: np.ndarray, q: np.ndarray) -> float:
    """
    Vectorized haversine distance calculation
    :p: Initial location in degrees [lat, lon]
    :q: Final location in degrees [lat, lon]
    :return: Distances in meters
    """
    earth_radius = 6378137.0
    return haversine(np.radians(p), np.radians(q)) * earth_radius

         

test1.py

import numpy as np
from typing import Callable, Dict
from numba import jit
from timeit import default_timer as timer
from distance_lib import euclidean, haversine, earth_haversine


class DiscreteFrechet(object):
    """
    Calculates the discrete Fréchet distance between two poly-lines using the
    original recursive algorithm
    """

    def __init__(self, dist_func):
        """
        Initializes the instance with a pairwise distance function.
        :param dist_func: The distance function. It must accept two NumPy
        arrays containing the point coordinates (x, y), (lat, long)
        """
        self.dist_func = dist_func
        self.ca = np.array([0.0])

    def distance(self, p: np.ndarray, q: np.ndarray) -> float:
        """
        Calculates the Fréchet distance between poly-lines p and q
        This function implements the algorithm described by Eiter & Mannila
        :param p: Poly-line p
        :param q: Poly-line q
        :return: Distance value
        """

        def calculate(i: int, j: int) -> float:
            """
            Calculates the distance between p[i] and q[i]
            :param i: Index into poly-line p
            :param j: Index into poly-line q
            :return: Distance value
            """
            if self.ca[i, j] > -1.0:
                return self.ca[i, j]

            d = self.dist_func(p[i], q[j])
            if i == 0 and j == 0:
                self.ca[i, j] = d
            elif i > 0 and j == 0:
                self.ca[i, j] = max(calculate(i-1, 0), d)
            elif i == 0 and j > 0:
                self.ca[i, j] = max(calculate(0, j-1), d)
            elif i > 0 and j > 0:
                self.ca[i, j] = max(min(calculate(i-1, j),
                                        calculate(i-1, j-1),
                                        calculate(i, j-1)), d)
            else:
                self.ca[i, j] = np.infty
            return self.ca[i, j]

        n_p = p.shape[0]
        n_q = q.shape[0]
        self.ca = np.zeros((n_p, n_q))
        self.ca.fill(-1.0)
        return calculate(n_p - 1, n_q - 1)


@jit(nopython=True)
def _get_linear_frechet(p: np.ndarray, q: np.ndarray,
                        dist_func: Callable[[np.ndarray, np.ndarray], float]) 
        -> np.ndarray:
    n_p = p.shape[0]
    n_q = q.shape[0]
    ca = np.zeros((n_p, n_q), dtype=np.float64)

    for i in range(n_p):
        for j in range(n_q):
            d = dist_func(p[i], q[j])

            if i > 0 and j > 0:
                ca[i, j] = max(min(ca[i - 1, j],
                                   ca[i - 1, j - 1],
                                   ca[i, j - 1]), d)
            elif i > 0 and j == 0:
                ca[i, j] = max(ca[i - 1, 0], d)
            elif i == 0 and j > 0:
                ca[i, j] = max(ca[0, j - 1], d)
            elif i == 0 and j == 0:
                ca[i, j] = d
            else:
                ca[i, j] = np.infty
    return ca


class LinearDiscreteFrechet(DiscreteFrechet):

    def __init__(self, dist_func):
        DiscreteFrechet.__init__(self, dist_func)
        # JIT the numba code
        self.distance(np.array([[0.0, 0.0], [1.0, 1.0]]),
                      np.array([[0.0, 0.0], [1.0, 1.0]]))

    def distance(self, p: np.ndarray, q: np.ndarray) -> float:
        n_p = p.shape[0]
        n_q = q.shape[0]
        self.ca = _get_linear_frechet(p, q, self.dist_func)
        return self.ca[n_p - 1, n_q - 1]


@jit(nopython=True)
def distance_matrix(p: np.ndarray,
                    q: np.ndarray,
                    dist_func: Callable[[np.array, np.array], float]) 
        -> np.ndarray:
    n_p = p.shape[0]
    n_q = q.shape[0]
    dist = np.zeros((n_p, n_q), dtype=np.float64)
    for i in range(n_p):
        for j in range(n_q):
            dist[i, j] = dist_func(p[i], q[j])
    return dist


class VectorizedDiscreteFrechet(DiscreteFrechet):

    def __init__(self, dist_func):
        DiscreteFrechet.__init__(self, dist_func)
        self.dist = np.array([0.0])

    def distance(self, p: np.ndarray, q: np.ndarray) -> float:
        """
        Calculates the Fréchet distance between poly-lines p and q
        This function implements the algorithm described by Eiter & Mannila
        :param p: Poly-line p
        :param q: Poly-line q
        :return: Distance value
        """

        def calculate(i: int, j: int) -> float:
            """
            Calculates the distance between p[i] and q[i]
            :param i: Index into poly-line p
            :param j: Index into poly-line q
            :return: Distance value
            """
            if self.ca[i, j] > -1.0:
                return self.ca[i, j]

            d = self.dist[i, j]
            if i == 0 and j == 0:
                self.ca[i, j] = d
            elif i > 0 and j == 0:
                self.ca[i, j] = max(calculate(i-1, 0), d)
            elif i == 0 and j > 0:
                self.ca[i, j] = max(calculate(0, j-1), d)
            elif i > 0 and j > 0:
                self.ca[i, j] = max(min(calculate(i-1, j),
                                        calculate(i-1, j-1),
                                        calculate(i, j-1)), d)
            else:
                self.ca[i, j] = np.infty
            return self.ca[i, j]

        n_p = p.shape[0]
        n_q = q.shape[0]
        self.ca = np.zeros((n_p, n_q))
        self.ca.fill(-1.0)
        self.dist = distance_matrix(p, q, dist_func=self.dist_func)
        return calculate(n_p - 1, n_q - 1)



@jit(nopython=True)
def compression_get_linear_frechet(p: np.ndarray, q: np.ndarray,
                        dist_func: Callable[[np.ndarray, np.ndarray], float]) 
        -> np.ndarray:
    n_p = p.shape[0]
    n_q = q.shape[0]
    ca = np.zeros((n_q), dtype=np.float64)
    for j in range(n_q):
        ca[j] = dist_func(p[0], q[j])

    for i in range(1,n_p):
        temp = ca[0]
        # 初始化最开始的
        d = dist_func(p[i], q[0])
        ca[0] = max(ca[0], d)
        for j in range(1,n_q):
            left_up = temp
            d = dist_func(p[i], q[j])
            temp = ca[j]
            ca[j] = max(min(ca[j],left_up,ca[j - 1]), d)
    return ca


class compressionLinearDiscreteFrechet(DiscreteFrechet):

    def __init__(self, dist_func):
        DiscreteFrechet.__init__(self, dist_func)
        # JIT the numba code
        self.distance(np.array([[0.0, 0.0], [1.0, 1.0]]),
                      np.array([[0.0, 0.0], [1.0, 1.0]]))

    def distance(self, p: np.ndarray, q: np.ndarray) -> float:
        self.ca = compression_get_linear_frechet(p, q, self.dist_func)
        return self.ca[-1]


def main():
    np.set_printoptions(precision=4)
    distance_fun = earth_haversine

    linear_frechet = LinearDiscreteFrechet(distance_fun)
    slow_frechet = DiscreteFrechet(distance_fun)
    VDF = VectorizedDiscreteFrechet(distance_fun)
    compression_linear = compressionLinearDiscreteFrechet(distance_fun)

    p = np.array([
       [ 42.31644861, -83.77730583],
       [ 42.31631778, -83.77754194],
       [ 42.31619611, -83.77816083],
       [ 42.31604194, -83.77894   ],
       [ 42.31589861, -83.7797925 ],
       [ 42.31565222, -83.78029194],
       [ 42.31527111, -83.780575  ],
       [ 42.31491194, -83.78094639],
       [ 42.31462333, -83.78133361],
       [ 42.31411778, -83.78156806],
       [ 42.31361861, -83.78157389],
       [ 42.31300028, -83.78156694],
       [ 42.31235028, -83.78153222],
       [ 42.31171806, -83.78150528],
       [ 42.31097083, -83.78147556],
       [ 42.31028861, -83.78144833],
       [ 42.30959611, -83.78140667],
       [ 42.30890083, -83.78137667],
       [ 42.30821972, -83.78134028],
       [ 42.30762528, -83.78131917],
       [ 42.30691111, -83.781295  ],
       [ 42.30626583, -83.78123278],
       [ 42.30579611, -83.78121444],
       [ 42.30541694, -83.78127667],
       [ 42.30485833, -83.78123083],
       [ 42.30413889, -83.78119778],
       [ 42.30312917, -83.78116222],
       [ 42.30247667, -83.78113083],
       [ 42.30210861, -83.78116667],
       [ 42.30192611, -83.78127389],
       [ 42.30147583, -83.78119139],
       [ 42.30077167, -83.78109194],
       [ 42.30028778, -83.7810625 ],
       [ 42.29992   , -83.7812025 ],
       [ 42.29948083, -83.78110111],
       [ 42.29883806, -83.78105444],
       [ 42.29824833, -83.78105167],
       [ 42.29765167, -83.78105667],
       [ 42.29700667, -83.78105194],
       [ 42.29634194, -83.78104889],
       [ 42.29573611, -83.7810525 ],
       [ 42.295395  , -83.78100861],
       [ 42.29534111, -83.78095944],
       [ 42.29527   , -83.78094   ],
       [ 42.29494278, -83.78086833],
       [ 42.29426028, -83.78081528],
       [ 42.29358333, -83.78078778],
       [ 42.29294528, -83.78075722],
       [ 42.29230917, -83.78073306],
       [ 42.29162361, -83.78072333],
       [ 42.29089417, -83.78071083],
       [ 42.29000861, -83.78067528],
       [ 42.28929556, -83.78065222],
       [ 42.28855944, -83.78064944],
       [ 42.28785778, -83.78065806],
       [ 42.28723694, -83.78065444],
       [ 42.28653778, -83.78063944],
       [ 42.28624111, -83.78061833],
       [ 42.286215  , -83.78061333],
       [ 42.2862275 , -83.78057944],
       [ 42.28612   , -83.78060611],
       [ 42.28583833, -83.78057194],
       [ 42.28545444, -83.7805525 ],
       [ 42.2850025 , -83.78053639],
       [ 42.28455472, -83.78052861],
       [ 42.283995  , -83.78050056],
       [ 42.28351194, -83.78048444],
       [ 42.28297472, -83.78047333],
       [ 42.28236417, -83.78045944],
       [ 42.28184889, -83.78045667],
       [ 42.28155556, -83.78045972],
       [ 42.28151444, -83.78046194],
       [ 42.2815175 , -83.78046   ],
       [ 42.2813275 , -83.78045028],
       [ 42.28095361, -83.78043917],
       [ 42.28050833, -83.78044917],
       [ 42.280135  , -83.78044611],
       [ 42.27977472, -83.78042778],
       [ 42.27919556, -83.78023417],
       [ 42.27864194, -83.77985167],
       [ 42.278055  , -83.77948111],
       [ 42.27750944, -83.77912028],
       [ 42.276865  , -83.77870917],
       [ 42.27639083, -83.77840111],
       [ 42.27569194, -83.77795083],
       [ 42.27524083, -83.77764583],
       [ 42.27509861, -83.77755361],
       [ 42.27511028, -83.77751083],
       [ 42.27509667, -83.77747278],
       [ 42.27495222, -83.7773675 ],
       [ 42.27458694, -83.77713028]])
    q = np.array([
       [ 42.31661889, -83.77759694],
       [ 42.31651444, -83.77805778],
       [ 42.31639167, -83.77864528],
       [ 42.31627694, -83.77921639],
       [ 42.31612361, -83.77979778],
       [ 42.31601167, -83.78022333],
       [ 42.31587083, -83.78046167],
       [ 42.31573444, -83.78056583],
       [ 42.31549833, -83.78067222],
       [ 42.3152775 , -83.780815  ],
       [ 42.31496194, -83.78111833],
       [ 42.31475   , -83.78141778],
       [ 42.31445972, -83.78161111],
       [ 42.31412833, -83.78162167],
       [ 42.31372361, -83.78162611],
       [ 42.31325667, -83.78158194],
       [ 42.31257306, -83.78156139],
       [ 42.31207222, -83.78153778],
       [ 42.3114975 , -83.78147417],
       [ 42.3110025 , -83.78147611],
       [ 42.310545  , -83.78148778],
       [ 42.30996028, -83.78151278],
       [ 42.30964889, -83.78154667],
       [ 42.30927861, -83.78154222],
       [ 42.30889583, -83.78153222],
       [ 42.30830583, -83.78148917],
       [ 42.30787444, -83.78151389],
       [ 42.30739361, -83.78149083],
       [ 42.30688833, -83.78149306],
       [ 42.30645611, -83.78140167],
       [ 42.30617917, -83.78143528],
       [ 42.30593583, -83.7815    ],
       [ 42.30538944, -83.78145306],
       [ 42.3048975 , -83.78143833],
       [ 42.30437361, -83.78140833],
       [ 42.30387111, -83.78138111],
       [ 42.30336361, -83.78134694],
       [ 42.30279222, -83.78133222],
       [ 42.3024175 , -83.78134167],
       [ 42.30200111, -83.78141333],
       [ 42.30142417, -83.78128833],
       [ 42.30099889, -83.78121667],
       [ 42.30059   , -83.78115861],
       [ 42.30020167, -83.78121778],
       [ 42.29977306, -83.78127833],
       [ 42.29939833, -83.78119194],
       [ 42.29899917, -83.78111944],
       [ 42.29854361, -83.78108361],
       [ 42.29815611, -83.78103944],
       [ 42.29781111, -83.78100278],
       [ 42.29738556, -83.78100111],
       [ 42.29699972, -83.78100667],
       [ 42.296655  , -83.78100444],
       [ 42.29633833, -83.78099861],
       [ 42.29605778, -83.78096972],
       [ 42.29586694, -83.78095194],
       [ 42.29575806, -83.78089528],
       [ 42.29561083, -83.78085861],
       [ 42.29547028, -83.78088333],
       [ 42.29539   , -83.78079861],
       [ 42.295295  , -83.78078528],
       [ 42.29517639, -83.78075333],
       [ 42.2949275 , -83.78072667],
       [ 42.29467417, -83.78067917],
       [ 42.29445778, -83.78064917],
       [ 42.29409972, -83.78061444],
       [ 42.293735  , -83.78059833],
       [ 42.29332611, -83.78060528],
       [ 42.29283   , -83.78062111],
       [ 42.29163472, -83.78061194],
       [ 42.291115  , -83.78057333],
       [ 42.29058611, -83.78053583],
       [ 42.28991556, -83.78050139],
       [ 42.28944694, -83.78049   ],
       [ 42.28895194, -83.7804875 ],
       [ 42.28846889, -83.78049167],
       [ 42.28796361, -83.78048278],
       [ 42.28730917, -83.78049444],
       [ 42.28680806, -83.78053278],
       [ 42.28629917, -83.78051222],
       [ 42.28586972, -83.78049972],
       [ 42.28529083, -83.78052472],
       [ 42.28475306, -83.78054   ],
       [ 42.28422444, -83.78052833],
       [ 42.28372139, -83.78050028],
       [ 42.28336   , -83.78042   ],
       [ 42.28331167, -83.78041917],
       [ 42.28296583, -83.78043139],
       [ 42.28257361, -83.78042306],
       [ 42.28213528, -83.780415  ],
       [ 42.28167583, -83.78038389],
       [ 42.28125306, -83.78035861],
       [ 42.27966083, -83.78032361],
       [ 42.27943167, -83.78029611],
       [ 42.27922417, -83.78011056],
       [ 42.27854833, -83.77966083],
       [ 42.27816278, -83.77938583],
       [ 42.27776444, -83.77910083],
       [ 42.27735694, -83.77880583],
       [ 42.27690417, -83.7785075 ],
       [ 42.27637639, -83.77812556],
       [ 42.27598167, -83.77782778],
       [ 42.27558917, -83.77756861],
       [ 42.27521528, -83.77733417],
       [ 42.27487861, -83.77709444],
       [ 42.274515  , -83.77680611],
       [ 42.27439389, -83.77672333]])

    start = timer()
    distance = slow_frechet.distance(p, q)
    end = timer()
    slow_time = end - start
    print("Slow time and ferechet distance:n {:.8f}".format(slow_time),end="     ")
    print(distance)

    start = timer()
    distance = linear_frechet.distance(p, q)
    end = timer()
    linear_time = end - start
    print("Linear time and ferechet distance:n {:.8f}".format(linear_time),end="     ")
    print(distance)

    start = timer()
    distance = VDF.distance(p, q)
    end = timer()
    VDF_time = end - start
    print("VDF time and ferechet distance:n {:.8f}".format(VDF_time),end="     ")
    print(distance)

    start = timer()
    distance = compression_linear.distance(p, q)
    end = timer()
    compression_linear_time = end - start
    print("compression_linear time and ferechet distance :n {:.8f}".format(compression_linear_time),end="     ")
    print(distance)

    print()
    print("time ratio(based on linear):")
    print("Linear : compression_linear : :slow : VDA ")
    print("{:.2f} : {:.2f} : {:.2f} : {:.2f} ".format(linear_time / linear_time,compression_linear_time / linear_time,slow_time / linear_time,VDF_time / linear_time))


if __name__ == "__main__":
    main()

          其实干了啥呢,原始的 DiscreteFrechet 是从后往前递归实现的,然后改成 dp 从前往后实现得到 LinearDiscreteFrechet ,然后对 dp 做了点优化减少了空间复杂度 得到compressionLinearDiscreteFrechet,后来又想着先把所有距离都算出来,利用查表法看能不能降低时间 VectorizedDiscreteFrechet,结果表现超级拉跨

结果
Slow time and ferechet distance:
 0.02692690     83.23780104754721
Linear time and ferechet distance:
 0.00266960     83.23780104754721
VDF time and ferechet distance:
 0.21261920     83.23780104754721
compression_linear time and ferechet distance :
 0.00274860     83.23780104754721

time ratio(based on linear):
Linear : compression_linear : :slow : VDA 
1.00 : 1.03 : 10.09 : 79.64 
另外一组曲线(供测试)

          最后在提供一组曲线,大家测试下

p = np.array([[ 42.27764194, -83.69931   ],
       [ 42.27735028, -83.69914667],
       [ 42.27678667, -83.69895222],
       [ 42.27631444, -83.69889278],
       [ 42.27580917, -83.69888194],
       [ 42.27528806, -83.69894139],
       [ 42.27462333, -83.698925  ],
       [ 42.27417667, -83.69887167],
       [ 42.27371028, -83.69883389],
       [ 42.27326722, -83.69875833],
       [ 42.27293333, -83.69871   ],
       [ 42.27260083, -83.698555  ],
       [ 42.27252667, -83.69851111],
       [ 42.27253611, -83.69829611],
       [ 42.27263194, -83.69801361],
       [ 42.27283111, -83.69780778],
       [ 42.2731525 , -83.69777056],
       [ 42.27344667, -83.69794889],
       [ 42.27366083, -83.69829139],
       [ 42.27385444, -83.69872417],
       [ 42.27410694, -83.69931611],
       [ 42.27419444, -83.69977167],
       [ 42.27431083, -83.70023639],
       [ 42.274425  , -83.70078917],
       [ 42.27458694, -83.70132583],
       [ 42.2747225 , -83.70187472],
       [ 42.27478528, -83.70254   ],
       [ 42.27466083, -83.70296472],
       [ 42.2744675 , -83.7033175 ],
       [ 42.27416083, -83.70364194],
       [ 42.27395389, -83.70386194],
       [ 42.27376833, -83.70406583],
       [ 42.27352111, -83.70428028],
       [ 42.27334083, -83.70450972],
       [ 42.27321917, -83.70478194],
       [ 42.27316361, -83.70501722],
       [ 42.27314528, -83.70533861],
       [ 42.27324861, -83.70541694],
       [ 42.27351222, -83.70534194],
       [ 42.273705  , -83.70534722],
       [ 42.27400667, -83.70527111],
       [ 42.27421361, -83.7051425 ],
       [ 42.27430278, -83.70497889],
       [ 42.27441833, -83.70490389],
       [ 42.27453583, -83.704895  ],
       [ 42.27475278, -83.70488778],
       [ 42.27492472, -83.70493556],
       [ 42.27510028, -83.70497278],
       [ 42.2752525 , -83.70503917],
       [ 42.27542472, -83.70511444],
       [ 42.27550639, -83.70519222],
       [ 42.27555194, -83.70534667],
       [ 42.27552194, -83.70549278],
       [ 42.27546694, -83.70568444],
       [ 42.27534833, -83.70591167],
       [ 42.27536472, -83.70607   ],
       [ 42.2753675 , -83.70621972],
       [ 42.27536694, -83.70642444],
       [ 42.27538444, -83.70660611],
       [ 42.27535861, -83.70683833],
       [ 42.275355  , -83.70706194],
       [ 42.27547472, -83.70726167],
       [ 42.27542306, -83.7075275 ],
       [ 42.27534278, -83.70771972],
       [ 42.27527111, -83.70786361],
       [ 42.27521778, -83.70804306],
       [ 42.27517139, -83.70821833],
       [ 42.27513167, -83.7084025 ],
       [ 42.27510444, -83.70860556],
       [ 42.27506056, -83.7088725 ],
       [ 42.27509111, -83.70900833],
       [ 42.27515028, -83.70914944],
       [ 42.27523528, -83.70925528],
       [ 42.27538472, -83.70936833],
       [ 42.27545833, -83.70943417],
       [ 42.27551972, -83.7095125 ],
       [ 42.27556361, -83.70954667],
       [ 42.27561944, -83.70959194],
       [ 42.27566028, -83.70961639],
       [ 42.27570361, -83.70961333],
       [ 42.27572806, -83.70965167],
       [ 42.2757625 , -83.70968056],
       [ 42.27575861, -83.70967806],
       [ 42.27577583, -83.70970444],
       [ 42.27579194, -83.70970111],
       [ 42.27577444, -83.7097    ],
       [ 42.27574889, -83.70968944],
       [ 42.27568194, -83.70960222],
       [ 42.27565278, -83.70961583],
       [ 42.27560167, -83.70957417],
       [ 42.27554556, -83.70955861],
       [ 42.27549583, -83.70952278],
       [ 42.27543806, -83.70950056],
       [ 42.27542083, -83.70949778],
       [ 42.27541083, -83.7095025 ],
       [ 42.27543528, -83.70953306],
       [ 42.27543778, -83.70958667],
       [ 42.27540528, -83.70969556],
       [ 42.27537611, -83.70976333],
       [ 42.27540389, -83.70973556],
       [ 42.27540583, -83.70983694],
       [ 42.27542306, -83.70984806],
       [ 42.27540278, -83.70986861],
       [ 42.27537944, -83.709825  ],
       [ 42.27534917, -83.70990056],
       [ 42.27537444, -83.7098625 ],
       [ 42.27537028, -83.70984889],
       [ 42.27538917, -83.70982111],
       [ 42.27540167, -83.70979611],
       [ 42.27542583, -83.709775  ],
       [ 42.27545278, -83.70974   ],
       [ 42.27548194, -83.70971194],
       [ 42.27548389, -83.70964444],
       [ 42.27550694, -83.70959694],
       [ 42.27545083, -83.7095675 ],
       [ 42.27538222, -83.70952944],
       [ 42.27532833, -83.70948333],
       [ 42.27526194, -83.70943972],
       [ 42.27519222, -83.70937194],
       [ 42.27514583, -83.70930028],
       [ 42.27513333, -83.70918389],
       [ 42.27511694, -83.70905028],
       [ 42.27512222, -83.70891639],
       [ 42.27511778, -83.70879583],
       [ 42.27510972, -83.70864417],
       [ 42.27511778, -83.70834028],
       [ 42.27512778, -83.70811833],
       [ 42.27513806, -83.70787194],
       [ 42.27513056, -83.70763194],
       [ 42.27512861, -83.70733028],
       [ 42.27518722, -83.70722167],
       [ 42.27517639, -83.70714222],
       [ 42.27514222, -83.70718472],
       [ 42.27518194, -83.707205  ],
       [ 42.27519889, -83.70723056],
       [ 42.27517   , -83.70722778],
       [ 42.27517   , -83.70721778],
       [ 42.27517361, -83.70710389],
       [ 42.27523056, -83.70703194],
       [ 42.27523333, -83.70698417],
       [ 42.27523306, -83.706885  ],
       [ 42.27522111, -83.70677833],
       [ 42.27519778, -83.70666472],
       [ 42.27516333, -83.70651   ],
       [ 42.27519111, -83.70633611],
       [ 42.27522889, -83.70622583],
       [ 42.27530583, -83.70595806],
       [ 42.27535056, -83.70574611],
       [ 42.27532861, -83.70556333],
       [ 42.27517083, -83.70539778],
       [ 42.27506972, -83.70536167],
       [ 42.27484444, -83.705305  ],
       [ 42.27470556, -83.70526083],
       [ 42.27446444, -83.70528389],
       [ 42.27429361, -83.70538917],
       [ 42.27413972, -83.70551028],
       [ 42.2739825 , -83.70562639],
       [ 42.27380639, -83.70569028],
       [ 42.27358806, -83.70565861],
       [ 42.27339417, -83.70563556],
       [ 42.27321417, -83.70562056],
       [ 42.27310028, -83.70557556],
       [ 42.27305194, -83.70551083],
       [ 42.27300278, -83.70524583],
       [ 42.2731225 , -83.7047475 ],
       [ 42.27326056, -83.70435944],
       [ 42.27347472, -83.70401667],
       [ 42.2737775 , -83.70377333],
       [ 42.2740575 , -83.70346361],
       [ 42.2743175 , -83.70316194],
       [ 42.27452722, -83.7028325 ],
       [ 42.27465278, -83.70227667],
       [ 42.27460833, -83.70184528],
       [ 42.27454194, -83.70139444],
       [ 42.27447278, -83.70093833],
       [ 42.27437833, -83.70046278],
       [ 42.274225  , -83.69978694],
       [ 42.27411361, -83.69926417],
       [ 42.27400111, -83.69874944],
       [ 42.27386667, -83.69824333],
       [ 42.27365111, -83.69786667],
       [ 42.27332   , -83.69768583],
       [ 42.27309361, -83.69775278],
       [ 42.27291556, -83.69788083],
       [ 42.27282361, -83.69796278],
       [ 42.27276   , -83.69805   ],
       [ 42.27269667, -83.698075  ],
       [ 42.27267056, -83.69810833],
       [ 42.27270583, -83.69825722],
       [ 42.27287667, -83.69833861],
       [ 42.27310667, -83.69840833],
       [ 42.2733975 , -83.698505  ],
       [ 42.27376861, -83.69857   ],
       [ 42.2741875 , -83.69860167],
       [ 42.274615  , -83.69863778],
       [ 42.27505278, -83.69865944],
       [ 42.27563028, -83.69871   ],
       [ 42.27619833, -83.69876167],
       [ 42.27660611, -83.69876917],
       [ 42.27699083, -83.69876   ],
       [ 42.27726667, -83.69874528],
       [ 42.27736167, -83.69874556],
       [ 42.27742333, -83.69872694],
       [ 42.27748417, -83.69847889],
       [ 42.27745111, -83.69810972],
       [ 42.27738778, -83.69766083],
       [ 42.27731778, -83.69713833],
       [ 42.27719667, -83.69637444],
       [ 42.27709722, -83.69576861],
       [ 42.2770175 , -83.69514778],
       [ 42.27687028, -83.69428806],
       [ 42.27677667, -83.69364444],
       [ 42.27669861, -83.6929975 ],
       [ 42.27665972, -83.69232833],
       [ 42.27664167, -83.69166972],
       [ 42.27663167, -83.69100417],
       [ 42.27655694, -83.69021972],
       [ 42.27650778, -83.68965667],
       [ 42.27641861, -83.68910694],
       [ 42.27632889, -83.68869889],
       [ 42.276215  , -83.68823667],
       [ 42.27611861, -83.68777667],
       [ 42.27597472, -83.68726778],
       [ 42.2758375 , -83.68673194],
       [ 42.27567861, -83.68615889],
       [ 42.27547472, -83.6854175 ],
       [ 42.27532333, -83.68491111],
       [ 42.27522333, -83.684485  ],
       [ 42.2751225 , -83.68412444],
       [ 42.27502611, -83.68370167],
       [ 42.27495639, -83.68342083],
       [ 42.27490278, -83.6832025 ],
       [ 42.27488389, -83.68309528],
       [ 42.27486167, -83.68304194],
       [ 42.27484222, -83.68307861],
       [ 42.27481194, -83.68301833],
       [ 42.27479778, -83.68299278],
       [ 42.27477778, -83.68293167],
       [ 42.27475917, -83.682865  ],
       [ 42.27474444, -83.68283528],
       [ 42.27470306, -83.68274972],
       [ 42.27467722, -83.68264139],
       [ 42.27466861, -83.68260667],
       [ 42.27465028, -83.68254194],
       [ 42.27462806, -83.68246056],
       [ 42.27455639, -83.68231111],
       [ 42.27450194, -83.68200028],
       [ 42.27451694, -83.68171917],
       [ 42.27454472, -83.68133806],
       [ 42.27452861, -83.68087194],
       [ 42.27451278, -83.68020528],
       [ 42.27449917, -83.67972722],
       [ 42.27448389, -83.67930444],
       [ 42.27445278, -83.67893528],
       [ 42.27441444, -83.67861556],
       [ 42.27432694, -83.67843583],
       [ 42.27435111, -83.677985  ],
       [ 42.27444944, -83.67753639],
       [ 42.27446361, -83.67697667],
       [ 42.27445583, -83.67639833],
       [ 42.27444722, -83.67581417],
       [ 42.27444222, -83.67525306],
       [ 42.27442917, -83.67478083]])
q = np.array([[ 42.27757111, -83.69863194],
       [ 42.27751444, -83.69895889],
       [ 42.27713361, -83.69901167],
       [ 42.27669778, -83.69890111],
       [ 42.27616111, -83.69882278],
       [ 42.27561306, -83.69877222],
       [ 42.2749725 , -83.69873472],
       [ 42.27452028, -83.69869556],
       [ 42.27408167, -83.69866222],
       [ 42.27367222, -83.69863944],
       [ 42.27323889, -83.69853778],
       [ 42.27307583, -83.69847583],
       [ 42.2730175 , -83.69846444],
       [ 42.27296667, -83.69843167],
       [ 42.27292639, -83.69841944],
       [ 42.27282694, -83.69835917],
       [ 42.27277778, -83.69812278],
       [ 42.272935  , -83.69784611],
       [ 42.27319417, -83.69772389],
       [ 42.27360111, -83.69789833],
       [ 42.27377056, -83.69828194],
       [ 42.27388917, -83.69876139],
       [ 42.27405917, -83.69948139],
       [ 42.27419111, -83.70004528],
       [ 42.27432056, -83.70063944],
       [ 42.27452333, -83.70153806],
       [ 42.27464028, -83.70210694],
       [ 42.27461278, -83.70256278],
       [ 42.27444361, -83.70296944],
       [ 42.27411944, -83.70332111],
       [ 42.27393333, -83.70354444],
       [ 42.27374278, -83.70377056],
       [ 42.2734825 , -83.70411944],
       [ 42.27332639, -83.704455  ],
       [ 42.27323778, -83.70483167],
       [ 42.27320694, -83.70518944],
       [ 42.27315528, -83.70575083],
       [ 42.27315278, -83.70623083],
       [ 42.27313472, -83.70678361],
       [ 42.27313389, -83.70732361],
       [ 42.27311417, -83.70799861],
       [ 42.27310806, -83.70845583],
       [ 42.27311278, -83.70891944],
       [ 42.273125  , -83.70955917],
       [ 42.27309361, -83.709985  ],
       [ 42.27309306, -83.71028944],
       [ 42.27308222, -83.71067028],
       [ 42.27307528, -83.7111575 ],
       [ 42.27312222, -83.71189139],
       [ 42.27316083, -83.71243333],
       [ 42.27319111, -83.71290944],
       [ 42.27329083, -83.71352333],
       [ 42.27345861, -83.7139375 ],
       [ 42.27365194, -83.71428694],
       [ 42.27379583, -83.71465861],
       [ 42.27393611, -83.71505667],
       [ 42.2741    , -83.71565194],
       [ 42.27423778, -83.71607444],
       [ 42.27437556, -83.71650222],
       [ 42.27443528, -83.7168475 ],
       [ 42.27446417, -83.71703583],
       [ 42.27451528, -83.71717   ],
       [ 42.27452139, -83.71728917],
       [ 42.27432833, -83.71737556],
       [ 42.27392611, -83.71751556],
       [ 42.27366417, -83.7176675 ],
       [ 42.27346   , -83.71798861],
       [ 42.27334583, -83.71839778],
       [ 42.27341444, -83.71910528],
       [ 42.27341806, -83.71956083],
       [ 42.27338528, -83.71975778],
       [ 42.273345  , -83.71998444],
       [ 42.273395  , -83.72030444],
       [ 42.27343667, -83.72076278],
       [ 42.27350639, -83.72128861],
       [ 42.27357861, -83.72185444],
       [ 42.27368556, -83.72266694],
       [ 42.27373667, -83.72325028],
       [ 42.27378611, -83.72378   ],
       [ 42.27383278, -83.72438444],
       [ 42.27378722, -83.72482861],
       [ 42.27363028, -83.72523528],
       [ 42.27345528, -83.72562694],
       [ 42.27315111, -83.72618694],
       [ 42.27296444, -83.72664778],
       [ 42.2728075 , -83.72705083],
       [ 42.27268444, -83.72739778],
       [ 42.27262694, -83.72759667],
       [ 42.27262333, -83.72761   ],
       [ 42.27258806, -83.72765333],
       [ 42.27258639, -83.72766611],
       [ 42.27253556, -83.7278625 ],
       [ 42.27253   , -83.72825333],
       [ 42.27250444, -83.72873833],
       [ 42.27248444, -83.72929056],
       [ 42.2724425 , -83.7300725 ],
       [ 42.27236694, -83.73068361],
       [ 42.27232694, -83.73129083],
       [ 42.27229833, -83.73189528],
       [ 42.27228278, -83.73250389],
       [ 42.27229667, -83.7326825 ],
       [ 42.27227917, -83.73272944],
       [ 42.27227639, -83.73283667],
       [ 42.27227806, -83.73295167],
       [ 42.27235944, -83.73305806],
       [ 42.27259361, -83.73309083],
       [ 42.27302944, -83.73311722],
       [ 42.27336472, -83.73313111],
       [ 42.27368   , -83.73315639],
       [ 42.27401361, -83.7331675 ],
       [ 42.27421   , -83.73316694],
       [ 42.27437667, -83.73321361],
       [ 42.27447361, -83.73327583],
       [ 42.2745075 , -83.73331583],
       [ 42.27454833, -83.73328722],
       [ 42.27458611, -83.73331528],
       [ 42.27464167, -83.73330806],
       [ 42.2746975 , -83.73324306],
       [ 42.2747675 , -83.73333028],
       [ 42.27480917, -83.73324639],
       [ 42.27483722, -83.73311806],
       [ 42.27482528, -83.732975  ],
       [ 42.27481944, -83.73272083],
       [ 42.27477833, -83.73247139],
       [ 42.27473833, -83.73215333],
       [ 42.27472417, -83.73191333],
       [ 42.27471861, -83.73186   ],
       [ 42.27470611, -83.73185083],
       [ 42.27477694, -83.73178889],
       [ 42.27484167, -83.73174028],
       [ 42.27484667, -83.73163583],
       [ 42.27480528, -83.73142528],
       [ 42.27464861, -83.73111111],
       [ 42.27449361, -83.73086333],
       [ 42.27431167, -83.73059417],
       [ 42.27409917, -83.73027861],
       [ 42.27385083, -83.72994639],
       [ 42.27346667, -83.72944194],
       [ 42.27316361, -83.72909417],
       [ 42.27293444, -83.72880361],
       [ 42.2727825 , -83.72866889],
       [ 42.27257333, -83.72874139],
       [ 42.27249333, -83.72884583],
       [ 42.27243583, -83.72910333],
       [ 42.27239833, -83.72949306],
       [ 42.27237806, -83.72988889],
       [ 42.27234556, -83.73036056],
       [ 42.27230778, -83.73070083],
       [ 42.27229222, -83.73105417],
       [ 42.27228361, -83.73142028],
       [ 42.27227889, -83.73174917],
       [ 42.27227861, -83.73208694],
       [ 42.2722775 , -83.73235444],
       [ 42.27227833, -83.73255583],
       [ 42.27227167, -83.73261583],
       [ 42.27225667, -83.73270667],
       [ 42.27223944, -83.73279278],
       [ 42.27230639, -83.73290917],
       [ 42.27256222, -83.73296917],
       [ 42.27286222, -83.73298444],
       [ 42.27314278, -83.732985  ],
       [ 42.27336972, -83.73300528],
       [ 42.27360722, -83.73300472],
       [ 42.27375806, -83.73301   ],
       [ 42.27389667, -83.73302583],
       [ 42.27397806, -83.73302861],
       [ 42.27402889, -83.73304028],
       [ 42.27404278, -83.73302389],
       [ 42.27413472, -83.73301222],
       [ 42.2741525 , -83.73302417],
       [ 42.27419611, -83.73305389],
       [ 42.27426   , -83.73298528],
       [ 42.27429944, -83.73293361],
       [ 42.27419722, -83.73297583],
       [ 42.274225  , -83.73297111],
       [ 42.2742375 , -83.73300861],
       [ 42.27428472, -83.73287833],
       [ 42.27428833, -83.73286361],
       [ 42.27428889, -83.73286417],
       [ 42.27431861, -83.73288   ],
       [ 42.27434028, -83.73289639],
       [ 42.27440611, -83.73294833],
       [ 42.27448361, -83.73295778],
       [ 42.27454083, -83.73293944],
       [ 42.27486   , -83.73271889],
       [ 42.27490361, -83.73268167],
       [ 42.27482611, -83.73274333],
       [ 42.27483917, -83.73271583],
       [ 42.27479028, -83.73271306],
       [ 42.27478028, -83.73271556],
       [ 42.274825  , -83.73277639],
       [ 42.27489667, -83.73287833],
       [ 42.27497861, -83.73299639],
       [ 42.27495944, -83.73305944],
       [ 42.27478917, -83.73309111],
       [ 42.27483556, -83.73315556],
       [ 42.27492556, -83.73317306],
       [ 42.27512167, -83.73317194],
       [ 42.27537278, -83.73303583],
       [ 42.27553167, -83.73291139],
       [ 42.27560611, -83.73284472],
       [ 42.27562194, -83.73283944],
       [ 42.27571944, -83.732725  ],
       [ 42.27576194, -83.73266278],
       [ 42.27590222, -83.73238444],
       [ 42.276035  , -83.73200528],
       [ 42.27619167, -83.73162556],
       [ 42.27641278, -83.73135278],
       [ 42.27668556, -83.73115667],
       [ 42.27696861, -83.73105   ],
       [ 42.27704694, -83.73102861],
       [ 42.27711944, -83.73097333],
       [ 42.2771    , -83.73080167],
       [ 42.27700417, -83.73049444],
       [ 42.27690389, -83.73007722],
       [ 42.2767675 , -83.72951722],
       [ 42.27665639, -83.72909444],
       [ 42.27654389, -83.72868556],
       [ 42.27643778, -83.72829806],
       [ 42.27627694, -83.72772778],
       [ 42.27615389, -83.72729028],
       [ 42.27604056, -83.72687306],
       [ 42.27588722, -83.72632972],
       [ 42.27580833, -83.72591861],
       [ 42.27576583, -83.725525  ],
       [ 42.27571417, -83.72510333],
       [ 42.27566917, -83.72464028],
       [ 42.27558972, -83.72403694],
       [ 42.27552028, -83.72359222],
       [ 42.27544583, -83.72317528],
       [ 42.27539556, -83.72275694],
       [ 42.27534417, -83.72236167],
       [ 42.27528528, -83.72183278],
       [ 42.27521778, -83.72143333],
       [ 42.27515972, -83.72101667],
       [ 42.2750925 , -83.72057361],
       [ 42.27499944, -83.72010556],
       [ 42.27485333, -83.71949611],
       [ 42.27477111, -83.71898639],
       [ 42.27462861, -83.71853583],
       [ 42.2744825 , -83.71806944],
       [ 42.27437667, -83.71755778],
       [ 42.27425083, -83.71707333],
       [ 42.27408139, -83.716445  ],
       [ 42.27395167, -83.71598833],
       [ 42.27380889, -83.715485  ],
       [ 42.27363667, -83.71501056],
       [ 42.27340333, -83.71441417],
       [ 42.27325   , -83.71395333],
       [ 42.27314556, -83.71350694],
       [ 42.27305222, -83.71290472],
       [ 42.27297861, -83.71245806],
       [ 42.2729225 , -83.712     ],
       [ 42.27291556, -83.71154722],
       [ 42.27291333, -83.71100111],
       [ 42.27290917, -83.71063361],
       [ 42.27292417, -83.71026583],
       [ 42.27293611, -83.70987389],
       [ 42.27296167, -83.70945028],
       [ 42.27297917, -83.70885167],
       [ 42.27298111, -83.70840361],
       [ 42.2729875 , -83.70795083],
       [ 42.27299806, -83.70749083],
       [ 42.27300667, -83.70686417],
       [ 42.27301944, -83.70639056],
       [ 42.27303917, -83.70589167],
       [ 42.27307278, -83.70540389],
       [ 42.27313417, -83.70493611],
       [ 42.27333056, -83.70437972],
       [ 42.2735925 , -83.70402028],
       [ 42.27386778, -83.70371028],
       [ 42.27414167, -83.703415  ],
       [ 42.27441889, -83.703105  ],
       [ 42.27449361, -83.70298861],
       [ 42.27454333, -83.7029    ],
       [ 42.27460333, -83.70272   ],
       [ 42.27462111, -83.70246611],
       [ 42.27451361, -83.70192333],
       [ 42.27438306, -83.7014    ],
       [ 42.27425417, -83.70087   ],
       [ 42.27413222, -83.70032778],
       [ 42.27395694, -83.69959528],
       [ 42.27382528, -83.69902167],
       [ 42.27368778, -83.69847528],
       [ 42.27352444, -83.69810611],
       [ 42.27332806, -83.69783833],
       [ 42.27313333, -83.69774   ],
       [ 42.27308417, -83.69771917],
       [ 42.27310111, -83.69763528],
       [ 42.27300667, -83.69769167],
       [ 42.27282472, -83.69791528],
       [ 42.27272972, -83.69811889],
       [ 42.27258778, -83.69823139],
       [ 42.27238694, -83.69816722],
       [ 42.27204944, -83.69793778],
       [ 42.27147056, -83.69752528],
       [ 42.27101917, -83.69729833],
       [ 42.27055944, -83.69724139],
       [ 42.27009278, -83.69741333],
       [ 42.26963972, -83.69765722],
       [ 42.26904556, -83.69791083],
       [ 42.2685775 , -83.69796778],
       [ 42.26810806, -83.69791833],
       [ 42.26765889, -83.69776028],
       [ 42.26704861, -83.69735944],
       [ 42.26661361, -83.69685722],
       [ 42.26623278, -83.69629583],
       [ 42.26586361, -83.69575167],
       [ 42.2653875 , -83.69503083],
       [ 42.26502528, -83.69446833],
       [ 42.26463111, -83.69385528],
       [ 42.2641825 , -83.69328778],
       [ 42.26347083, -83.69277917],
       [ 42.26290944, -83.69263806],
       [ 42.26240056, -83.69269139],
       [ 42.26195667, -83.69287278],
       [ 42.26153583, -83.69312444],
       [ 42.26104944, -83.69357972],
       [ 42.2606725 , -83.6939825 ],
       [ 42.26030111, -83.69438667],
       [ 42.25991861, -83.69481833],
       [ 42.25941778, -83.69516361],
       [ 42.2590175 , -83.69532611],
       [ 42.25865111, -83.69540667],
       [ 42.25835028, -83.69544639],
       [ 42.25818667, -83.69546111],
       [ 42.25812139, -83.6954825 ],
       [ 42.25805861, -83.69546861],
       [ 42.25810389, -83.69547528],
       [ 42.25811861, -83.69548167],
       [ 42.25809528, -83.695485  ],
       [ 42.25796083, -83.69550611],
       [ 42.25765333, -83.69554389],
       [ 42.25726833, -83.69559444],
       [ 42.25700833, -83.69561889],
       [ 42.25691972, -83.69563028],
       [ 42.25688333, -83.69557778],
       [ 42.25688444, -83.69562694],
       [ 42.25700528, -83.69569861],
       [ 42.25696583, -83.69569806],
       [ 42.25691833, -83.69569167],
       [ 42.25678361, -83.69567194],
       [ 42.25662278, -83.69531639],
       [ 42.25649944, -83.69489417],
       [ 42.25636194, -83.69429722],
       [ 42.25622111, -83.69362861],
       [ 42.25605583, -83.69295167],
       [ 42.25598083, -83.6926175 ],
       [ 42.25591833, -83.69237333],
       [ 42.25588611, -83.69220889],
       [ 42.25586972, -83.69214028],
       [ 42.25597194, -83.69209833],
       [ 42.25597194, -83.69208778],
       [ 42.255955  , -83.69194639],
       [ 42.25592611, -83.69169444],
       [ 42.25588194, -83.69142278],
       [ 42.25583528, -83.69111306],
       [ 42.2558075 , -83.69080139],
       [ 42.255745  , -83.69029194],
       [ 42.25569278, -83.68984861],
       [ 42.25563361, -83.68939222],
       [ 42.25556917, -83.68893194],
       [ 42.25548   , -83.68845444],
       [ 42.25545583, -83.68825611],
       [ 42.25544444, -83.68820111],
       [ 42.25542583, -83.68818361],
       [ 42.25542611, -83.68814417],
       [ 42.25539139, -83.6879725 ],
       [ 42.2554775 , -83.68771639],
       [ 42.25563667, -83.68762722],
       [ 42.25583222, -83.68754583],
       [ 42.25604194, -83.68750583],
       [ 42.25626889, -83.68746361],
       [ 42.25639278, -83.68744611],
       [ 42.25650306, -83.68743556],
       [ 42.25670667, -83.68739944],
       [ 42.25693167, -83.68735694],
       [ 42.25718417, -83.68733361],
       [ 42.25743583, -83.68734083],
       [ 42.25767611, -83.68734694],
       [ 42.25787389, -83.68735833],
       [ 42.25796861, -83.68737778],
       [ 42.25799361, -83.68749   ],
       [ 42.25799639, -83.68763528],
       [ 42.25801917, -83.68786639],
       [ 42.25796417, -83.687935  ],
       [ 42.2579    , -83.68788139],
       [ 42.25791167, -83.68782306],
       [ 42.25790806, -83.68782556],
       [ 42.25786778, -83.68782917],
       [ 42.25783167, -83.68785667],
       [ 42.25782083, -83.6878575 ],
       [ 42.25781583, -83.68788833],
       [ 42.2578275 , -83.6878625 ],
       [ 42.25781778, -83.687875  ],
       [ 42.25782583, -83.68785778],
       [ 42.25781583, -83.68788389],
       [ 42.25782778, -83.68785833],
       [ 42.25779139, -83.68780444],
       [ 42.25766083, -83.68779278],
       [ 42.25745306, -83.68779639],
       [ 42.25720111, -83.687785  ],
       [ 42.25710167, -83.68781417],
       [ 42.25706667, -83.68795333],
       [ 42.25708389, -83.68821417],
       [ 42.25707972, -83.68852861],
       [ 42.25707611, -83.68894194],
       [ 42.25707111, -83.68913528],
       [ 42.25707833, -83.68915333],
       [ 42.25706667, -83.68917889],
       [ 42.25691   , -83.68922583],
       [ 42.25671583, -83.68922861],
       [ 42.25659639, -83.68921083],
       [ 42.25651833, -83.68921528],
       [ 42.25644444, -83.68929306],
       [ 42.25644444, -83.68967139],
       [ 42.25644611, -83.68994639],
       [ 42.25642694, -83.69011944],
       [ 42.25627444, -83.69024361],
       [ 42.25606417, -83.6903125 ],
       [ 42.25602583, -83.69033278],
       [ 42.25600444, -83.69033833],
       [ 42.25593278, -83.69031333],
       [ 42.25597   , -83.69041361],
       [ 42.25599667, -83.690485  ],
       [ 42.25598056, -83.69046583],
       [ 42.25595083, -83.69047778],
       [ 42.25582167, -83.69047778],
       [ 42.25571083, -83.69031944],
       [ 42.25566028, -83.69000333],
       [ 42.25559083, -83.68954444],
       [ 42.25550528, -83.68898167],
       [ 42.25537333, -83.68818583],
       [ 42.25526306, -83.68756333],
       [ 42.25513278, -83.68689   ],
       [ 42.25499639, -83.68617194],
       [ 42.25486028, -83.68545611],
       [ 42.2546875 , -83.68455944],
       [ 42.25455861, -83.68392083],
       [ 42.25444861, -83.68335722],
       [ 42.25430944, -83.68275639],
       [ 42.25420722, -83.68235361],
       [ 42.25400722, -83.6820675 ],
       [ 42.25370361, -83.68194417],
       [ 42.25339833, -83.68210222],
       [ 42.25319861, -83.68266417],
       [ 42.25331833, -83.68312611],
       [ 42.25362222, -83.68343722],
       [ 42.25408333, -83.68352667],
       [ 42.25483167, -83.68360611],
       [ 42.25548   , -83.68365   ],
       [ 42.25619   , -83.68368472],
       [ 42.25694389, -83.68371917],
       [ 42.25798194, -83.68375694],
       [ 42.25878417, -83.68368833],
       [ 42.25960472, -83.6834325 ],
       [ 42.26038583, -83.68302778],
       [ 42.26135444, -83.68219833],
       [ 42.26200194, -83.68140333],
       [ 42.26262889, -83.680565  ],
       [ 42.26325028, -83.67973   ],
       [ 42.26406667, -83.67863056],
       [ 42.26466833, -83.67782167],
       [ 42.26531111, -83.67710083],
       [ 42.26628861, -83.67637389],
       [ 42.26709194, -83.67602944],
       [ 42.26792528, -83.67584528],
       [ 42.26877361, -83.67579278],
       [ 42.26989   , -83.67578278],
       [ 42.27066944, -83.67577583],
       [ 42.27140111, -83.67572806],
       [ 42.27208972, -83.67563056],
       [ 42.27287028, -83.67524833],
       [ 42.27337917, -83.67487028],
       [ 42.27378528, -83.67458194],
       [ 42.27404944, -83.67439056],
       [ 42.27417028, -83.67427111]])
后记

          我看了别人还有其他的优化方法,但感觉有点难理解,我整明白再来更新,利用啥稀疏矩阵和其他的东西配合,似乎速度还能提高几倍

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5670398.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存