Пример #1
0
 def __init__(self, vertices=None, kdt=None, falloff=None, negate=False, power=2):
     self.falloff = falloff
     self.negate = negate
     if kdt is not None:
         self.kdt = kdt
     elif vertices is not None:
         self.kdt = SvKdTree.new(SvKdTree.best_available_implementation(), vertices, power=power)
     else:
         raise Exception("Either kdt or vertices must be provided")
     self.__description__ = "KDT Attractor"
Пример #2
0
 def __init__(self, vertices=None, kdt=None, falloff=None, power=2):
     self.falloff = falloff
     if kdt is not None:
         self.kdt = kdt
     elif vertices is not None:
         self.kdt = SvKdTree.new(SvKdTree.best_available_implementation(),
                                 vertices,
                                 power=power)
     else:
         raise Exception("Either kdt or vertices must be provided")
Пример #3
0
 def to_point(self, centers, falloff):
     if self.metric == 'DISTANCE':
         metric_single = 'EUCLIDEAN'
     else:
         metric_single = self.metric
     n = len(centers)
     if n == 1:
         sfield = SvScalarFieldPointDistance(centers[0],
                                             falloff=falloff,
                                             metric=metric_single,
                                             power=self.get_power())
         vfield = SvVectorFieldPointDistance(centers[0],
                                             falloff=falloff,
                                             metric=metric_single,
                                             power=self.get_power())
     elif self.merge_mode == 'AVG':
         sfields = [
             SvScalarFieldPointDistance(center,
                                        falloff=falloff,
                                        metric=metric_single,
                                        power=self.get_power())
             for center in centers
         ]
         sfield = SvMergedScalarField('AVG', sfields)
         vfields = [
             SvVectorFieldPointDistance(center,
                                        falloff=falloff,
                                        metric=metric_single,
                                        power=self.get_power())
             for center in centers
         ]
         vfield = SvAverageVectorField(vfields)
     elif self.merge_mode == 'MIN':
         kdt = SvKdTree.new(SvKdTree.best_available_implementation(),
                            centers,
                            power=self.get_power())
         vfield = SvKdtVectorField(kdt=kdt, falloff=falloff)
         sfield = SvKdtScalarField(kdt=kdt, falloff=falloff)
     else:  # SEP
         sfield = [
             SvScalarFieldPointDistance(center,
                                        falloff=falloff,
                                        metric=metric_single,
                                        power=self.get_power())
             for center in centers
         ]
         vfield = [
             SvVectorFieldPointDistance(center,
                                        falloff=falloff,
                                        metric=metric_single,
                                        power=self.get_power())
             for center in centers
         ]
     return vfield, sfield
Пример #4
0
    def __init__(self, sites, metric='DISTANCE', power=None):
        self.sites = np.asarray(sites)
        self.metric = metric

        if metric == 'DISTANCE':
            self.power = 2
        elif metric == 'MANHATTAN':
            self.power = 1
        elif metric == 'CHEBYSHEV':
            self.power = np.inf
        elif metric == 'CUSTOM':
            self.power = power
        else:
            raise Exception("Unsupported metric")

        self.implementation = SvKdTree.best_available_implementation()
        self.kdtree = SvKdTree.new(self.implementation,
                                   sites,
                                   power=self.power)
Пример #5
0
def _check_min_distance(v_new, vs_old, min_r):
    if not vs_old:
        return True
    kdt = SvKdTree.new(SvKdTree.BLENDER, vs_old)
    nearest, idx, dist = kdt.query(v_new)
    if dist is None:
        return True
    ok = (dist >= min_r)
    #if not ok:
    #    print(f"V {v_new} => {nearest}, {dist} >= {min_r}")
    return ok