interpolator split

This commit is contained in:
Frank DeMarco 2014-03-11 13:31:45 +09:00
parent 72bdf822bc
commit ba48810f34
1 changed files with 32 additions and 21 deletions

View File

@ -208,7 +208,7 @@ class LinearSpline(Spline):
class GUI(Animation):
B_DUPLICATE, B_WRITE, B_DELETE, B_LINEAR, B_CUBIC = range(5)
B_DUPLICATE, B_WRITE, B_DELETE, B_LINEAR, B_CUBIC, B_SPLIT = range(6)
def __init__(self, parent):
Animation.__init__(self, parent, unfiltered=True)
@ -217,6 +217,7 @@ class GUI(Animation):
self.display_surface = self.get_display_surface()
self.time_filter = self.get_game().time_filter
self.delegate = self.get_delegate()
self.split = False
self.success_indicator_active = True
self.success_indicator_blink_count = 0
self.load_configuration()
@ -230,7 +231,7 @@ class GUI(Animation):
self.set_buttons()
self.active = False
self.set_nodeset_index()
self.set_yrange()
self.set_y_range()
self.set_markers()
self.subscribe(self.respond_to_command)
self.subscribe(self.respond_to_mouse_down, MOUSEBUTTONDOWN)
@ -285,10 +286,10 @@ class GUI(Animation):
def set_buttons(self):
self.buttons = buttons = []
text = "Duplicate", "Write", "Delete", "Linear", "Cubic"
text = "Duplicate", "Write", "Delete", "Linear", "Cubic", "[---]"
x = 0
for ii in xrange(5):
buttons.append(Button(self, text[ii], x))
for instruction in text:
buttons.append(Button(self, instruction, x))
x += buttons[-1].location.w + 10
def set_nodeset_index(self, increment=None, index=None):
@ -320,31 +321,38 @@ class GUI(Animation):
self.set_nodeset_index(0)
return self.parent[self.nodeset_index]
def set_yrange(self):
def set_y_range(self):
width = self.plot_rect.w
nodeset = self.get_nodeset()
self.yrange = yrange = [nodeset[0].y, nodeset[-1].y]
self.y_range = y_range = [nodeset[0].y, nodeset[-1].y]
x = 0
while x < width:
y = nodeset.get_y(self.get_function_coordinates(x)[0])
if y < yrange[0]:
yrange[0] = y
elif y > yrange[1]:
yrange[1] = y
if y < y_range[0]:
y_range[0] = y
elif y > y_range[1]:
y_range[1] = y
x += width * .01
if yrange[1] - yrange[0] == 0:
offset = self.flat_y_range / 2.0
yrange[0] -= offset
yrange[1] += offset
print yrange, offset
if y_range[1] - y_range[0] == 0:
y_range[1] += self.flat_y_range
if self.split:
self.adjust_for_split(y_range, nodeset)
self.set_axis_labels()
def adjust_for_split(self, y_range, nodeset):
middle = nodeset[0].y
below, above = middle - y_range[0], y_range[1] - middle
if below > above:
y_range[1] += below - above
else:
y_range[0] -= above - below
def set_axis_labels(self):
self.axis_labels = labels = []
nodeset, formatted, render, rect, yr = (self.get_nodeset(),
self.get_formatted_measure,
self.font.render,
self.plot_rect, self.yrange)
self.plot_rect, self.y_range)
for ii, node in enumerate(nodeset[0::len(nodeset) - 1]):
xs = render(formatted(node.x), True, (0, 0, 0), (255, 255, 255))
xsr = xs.get_rect()
@ -434,6 +442,9 @@ class GUI(Animation):
self.set_nodeset_index(1)
self.store_in_configuration()
redraw = True
elif bi == self.B_SPLIT:
self.split = not self.split
redraw = True
elif plot_rect.collidepoint(pos) and \
not self.collide_markers(pos):
xp, yp = pos[0] - plot_rect.left, pos[1] - plot_rect.top
@ -453,7 +464,7 @@ class GUI(Animation):
self.store_in_configuration()
redraw = True
if redraw:
self.set_yrange()
self.set_y_range()
self.set_markers()
self.draw()
@ -467,7 +478,7 @@ class GUI(Animation):
if nodeset.add_node(map(float, result.group(1, 2))) is not None:
nodeset.remove(old, False)
self.store_in_configuration()
self.set_yrange()
self.set_y_range()
self.set_axis_labels()
self.set_markers()
self.draw()
@ -511,7 +522,7 @@ class GUI(Animation):
def get_function_coordinates(self, xp=0, yp=0):
nodeset = self.get_nodeset()
x_min, x_max, (y_min, y_max) = nodeset[0].x, nodeset[-1].x, self.yrange
x_min, x_max, (y_min, y_max) = nodeset[0].x, nodeset[-1].x, self.y_range
rect = self.plot_rect
x = float(xp) / (rect.right - rect.left) * (x_max - x_min) + x_min
y = float(yp) / (rect.bottom - rect.top) * (y_min - y_max) + y_max
@ -525,7 +536,7 @@ class GUI(Animation):
def get_plot_coordinates(self, x=0, y=0):
nodeset = self.get_nodeset()
x_min, x_max, (y_min, y_max) = nodeset[0].x, nodeset[-1].x, self.yrange
x_min, x_max, (y_min, y_max) = nodeset[0].x, nodeset[-1].x, self.y_range
x_ratio = float(x - x_min) / (x_max - x_min)
rect = self.plot_rect
xp = x_ratio * (rect.right - rect.left) + rect.left