src.acoustools.Paths.Curves
1# CURVES MUST DEFINE A get_data THAT RETURNS THE PARAMETERS FOR ITS CONSTRUCTOR SUCH THAT `curve==type(curve)(curve.get_data())` 2 3class CubicBezier(): 4 ''' 5 Cublic Bezier class defined by `start, end, offset_1, offset_2` \n 6 See https://www.desmos.com/calculator/gtngeffijw for interactive Bezier demo 7 8 ''' 9 10 def __init__(self, start, end, offset_1, offset_2): 11 self.start = start 12 self.end = end 13 self.offset_1 = offset_1 14 self.offset_2 = offset_2 15 16 self.index = -1 17 18 def __iter__(self): 19 return self #Is this right? 20 21 def __next__(self): 22 self.index += 1 23 24 if self.index == 0: 25 return self.start 26 elif self.index == 1: 27 return self.end 28 elif self.index == 2: 29 return self.offset_1 30 elif self.index == 3: 31 return self.offset_2 32 if self.index == 4: 33 raise StopIteration 34 35 36 def get_data(self): 37 38 39 return self.start, self.end, self.offset_1, self.offset_2 40 41 def __getitem__(self, i): 42 return self.get_data()[i] 43 44 def __len__(self): 45 return 4 46 47 def __str__(self): 48 return f"Bezier: Start{self.start}, End{self.end}, Offset_1{self.offset_1}, Offset_2{self.offset_2}" 49 50 51 52class Spline(): 53 ''' 54 Container for combining curve objects into a spline 55 ''' 56 57 def __init__(self,curves:list = None): 58 if curves is None: 59 curves = [] 60 self.curves = curves 61 self.index = -1 62 63 def __iter__(self): 64 return iter(self.curves) 65 66 def __next__(self): 67 self.index += 1 68 if self.index >= len(self.curves): 69 raise StopIteration 70 else: 71 return self.curves[self.index] 72 73 def __getitem__(self, i): 74 return self.curves[i] 75 76 def __len__(self): 77 return len(self.curves) 78 79 def add_curve(self,curve): 80 self.curves.append(curve) 81 82 def __setitem__(self, i, value): 83 self.curves[i] = value 84 85 def __str__(self): 86 return "Spline: " + str(self.curves) 87 88 def clone(self): 89 new_curves = [] 90 for curve in self.curves: 91 curve_type = type(curve) 92 data = curve.get_data() 93 data = [d.clone() for d in data] 94 new = curve_type(*data) 95 new_curves.append(new) 96 return Spline(new_curves)
class
CubicBezier:
4class CubicBezier(): 5 ''' 6 Cublic Bezier class defined by `start, end, offset_1, offset_2` \n 7 See https://www.desmos.com/calculator/gtngeffijw for interactive Bezier demo 8 9 ''' 10 11 def __init__(self, start, end, offset_1, offset_2): 12 self.start = start 13 self.end = end 14 self.offset_1 = offset_1 15 self.offset_2 = offset_2 16 17 self.index = -1 18 19 def __iter__(self): 20 return self #Is this right? 21 22 def __next__(self): 23 self.index += 1 24 25 if self.index == 0: 26 return self.start 27 elif self.index == 1: 28 return self.end 29 elif self.index == 2: 30 return self.offset_1 31 elif self.index == 3: 32 return self.offset_2 33 if self.index == 4: 34 raise StopIteration 35 36 37 def get_data(self): 38 39 40 return self.start, self.end, self.offset_1, self.offset_2 41 42 def __getitem__(self, i): 43 return self.get_data()[i] 44 45 def __len__(self): 46 return 4 47 48 def __str__(self): 49 return f"Bezier: Start{self.start}, End{self.end}, Offset_1{self.offset_1}, Offset_2{self.offset_2}"
Cublic Bezier class defined by start, end, offset_1, offset_2
See https://www.desmos.com/calculator/gtngeffijw for interactive Bezier demo
class
Spline:
53class Spline(): 54 ''' 55 Container for combining curve objects into a spline 56 ''' 57 58 def __init__(self,curves:list = None): 59 if curves is None: 60 curves = [] 61 self.curves = curves 62 self.index = -1 63 64 def __iter__(self): 65 return iter(self.curves) 66 67 def __next__(self): 68 self.index += 1 69 if self.index >= len(self.curves): 70 raise StopIteration 71 else: 72 return self.curves[self.index] 73 74 def __getitem__(self, i): 75 return self.curves[i] 76 77 def __len__(self): 78 return len(self.curves) 79 80 def add_curve(self,curve): 81 self.curves.append(curve) 82 83 def __setitem__(self, i, value): 84 self.curves[i] = value 85 86 def __str__(self): 87 return "Spline: " + str(self.curves) 88 89 def clone(self): 90 new_curves = [] 91 for curve in self.curves: 92 curve_type = type(curve) 93 data = curve.get_data() 94 data = [d.clone() for d in data] 95 new = curve_type(*data) 96 new_curves.append(new) 97 return Spline(new_curves)
Container for combining curve objects into a spline