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"
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")
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
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)
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