191 lines
4.8 KiB
Python
191 lines
4.8 KiB
Python
# Functions that return segments to draw each shape based on height/width
|
|
# Configs that are highly opinionated to calculate some parameters
|
|
|
|
def line_shape(height, width):
|
|
return [
|
|
[(0, 0), (0, height)]
|
|
]
|
|
|
|
|
|
def fishbone_shape(height, width):
|
|
mid_x = width / 2
|
|
return [
|
|
[(0, 0), (mid_x, height), (width, 0)]
|
|
]
|
|
|
|
|
|
def cross_shape(height, width):
|
|
dx = width * 0.1
|
|
mid_y = height / 2
|
|
left_inner = width * 0.25 + dx
|
|
right_inner = width * 0.75 - dx
|
|
|
|
return [
|
|
[(0, 0), (left_inner, mid_y), (0, height)],
|
|
[(left_inner, mid_y), (right_inner, mid_y)],
|
|
[(width, 0), (right_inner, mid_y), (width, height)],
|
|
]
|
|
|
|
|
|
def bezier_shape(height, width, anchor_tip=0.2, anchor_center=0.3):
|
|
return [
|
|
('C', [
|
|
(0, 0),
|
|
(width * anchor_tip, 0),
|
|
(width * (0.5 - anchor_center), height),
|
|
(width * 0.5, height)
|
|
]),
|
|
('C', [
|
|
(width * 0.5, height),
|
|
(width * (0.5 + anchor_center), height),
|
|
(width * (1 - anchor_tip), 0),
|
|
(width, 0)
|
|
]),
|
|
]
|
|
|
|
|
|
def wave_shape(height, width, param_a=0.0, param_b=0.0):
|
|
mid_y = height / 2
|
|
|
|
return [
|
|
('L', [(0, 0), (width * 0.25, 0)]),
|
|
('Q', [(width * 0.25, 0), (width * (0.5 + param_a), height * param_b), (width * 0.5, mid_y)]),
|
|
('Q', [(width * 0.5, mid_y), (width * (0.5 - param_a), height * (1 - param_b)), (width * 0.75, height)]),
|
|
('L', [(width * 0.75, height), (width, height)]),
|
|
]
|
|
|
|
|
|
def fabric_shape(height, width):
|
|
line1 = [
|
|
(width * 0.25, height * 0.25),
|
|
(width * 0.0, height * 0.25),
|
|
(width * 0.0, height * 0.0),
|
|
(width * 0.5, height * 0.0),
|
|
(width * 0.5, height * 1.0),
|
|
(width * 1.0, height * 1.0),
|
|
(width * 1.0, height * 0.75),
|
|
(width * 0.75, height * 0.75),
|
|
]
|
|
|
|
line2 = [
|
|
(width * 0.75, height * 0.25),
|
|
(width * 0.75, height * 0.0),
|
|
(width * 1.0, height * 0.0),
|
|
(width * 1.0, height * 0.5),
|
|
(width * 0.0, height * 0.5),
|
|
(width * 0.0, height * 1.0),
|
|
(width * 0.25, height * 1.0),
|
|
(width * 0.25, height * 0.75),
|
|
]
|
|
|
|
return [line1, line2]
|
|
|
|
|
|
def circle_shape(height, width):
|
|
kappa = 0.5522847498
|
|
rx = width / 2
|
|
ry = height / 2
|
|
cx = rx
|
|
cy = ry
|
|
kx = rx * kappa
|
|
ky = ry * kappa
|
|
|
|
return [
|
|
('C', [
|
|
(cx + rx, cy),
|
|
(cx + rx, cy + ky),
|
|
(cx + kx, cy + ry),
|
|
(cx, cy + ry)
|
|
]),
|
|
('C', [
|
|
(cx, cy + ry),
|
|
(cx - kx, cy + ry),
|
|
(cx - rx, cy + ky),
|
|
(cx - rx, cy)
|
|
]),
|
|
('C', [
|
|
(cx - rx, cy),
|
|
(cx - rx, cy - ky),
|
|
(cx - kx, cy - ry),
|
|
(cx, cy - ry)
|
|
]),
|
|
('C', [
|
|
(cx, cy - ry),
|
|
(cx + kx, cy - ry),
|
|
(cx + rx, cy - ky),
|
|
(cx + rx, cy)
|
|
]),
|
|
]
|
|
|
|
|
|
def line_config(height, width, x_spacing, y_spacing, bbox):
|
|
_, _, _, bbox_height = bbox
|
|
height = height * bbox_height
|
|
y_offset = (height + y_spacing) / 2
|
|
return (height, 0, x_spacing, y_spacing, y_offset)
|
|
|
|
|
|
def fishbone_config(height, width, x_spacing, y_spacing, bbox):
|
|
y_offset = (height + y_spacing) / 2
|
|
return (height, width, x_spacing, y_spacing, y_offset)
|
|
|
|
|
|
def cross_config(height, width, x_spacing, y_spacing, bbox):
|
|
x_spacing = -0.4 * width
|
|
y_spacing = height
|
|
y_offset = height
|
|
return (height, width, x_spacing, y_spacing, y_offset)
|
|
|
|
|
|
def bezier_config(height, width, x_spacing, y_spacing, bbox):
|
|
y_offset = (height + y_spacing) / 2
|
|
return (height, width, x_spacing, y_spacing, y_offset)
|
|
|
|
|
|
def wave_config(height, width, x_spacing, y_spacing, bbox):
|
|
x_spacing = -0.2 * width
|
|
y_spacing = 0
|
|
y_offset = 0.5 * height
|
|
return (height, width, x_spacing, y_spacing, y_offset)
|
|
|
|
|
|
def fabric_config(height, width, x_spacing, y_spacing, bbox):
|
|
x_spacing = -0.375 * width
|
|
y_spacing = 0.25 * height
|
|
y_offset = 0.625 * height
|
|
return (height, width, x_spacing, y_spacing, y_offset)
|
|
|
|
|
|
def circle_config(height, width, x_spacing, y_spacing, bbox):
|
|
y_offset = (height + y_spacing) / 2
|
|
return (height, width, x_spacing, y_spacing, y_offset)
|
|
|
|
|
|
SHAPES = {
|
|
'line': line_shape,
|
|
'fishbone': fishbone_shape,
|
|
'cross': cross_shape,
|
|
'bezier': bezier_shape,
|
|
'wave': wave_shape,
|
|
'fabric': fabric_shape,
|
|
'circle': circle_shape,
|
|
}
|
|
|
|
CONFIGS = {
|
|
'line': line_config,
|
|
'fishbone': fishbone_config,
|
|
'cross': cross_config,
|
|
'bezier': bezier_config,
|
|
'wave': wave_config,
|
|
'fabric': fabric_config,
|
|
'circle': circle_config,
|
|
}
|
|
|
|
|
|
def get_shape(shape_type):
|
|
return SHAPES.get(shape_type, line_shape)
|
|
|
|
|
|
def get_config(shape_type):
|
|
return CONFIGS.get(shape_type, line_config)
|