In [109]:
%pylab inline
import pandas as pd
import csv
import shapely.affinity as af
import shapely.geometry as sh
from scipy.optimize import fsolve, basinhopping
from threshold_functions import *
from dimension_measure import *
In [3]:
x_list = list()
y_list = list()
with open('../data/cutout_x.csv', 'r') as x_csvfile:
with open('../data/cutout_y.csv', 'r') as y_csvfile:
x_reader = csv.reader(x_csvfile, delimiter=',', lineterminator='\n')
y_reader = csv.reader(y_csvfile, delimiter=',', lineterminator='\n')
for row in x_reader:
x_list += [row]
for row in y_reader:
y_list += [row]
In [4]:
x_array = list()
y_array = list()
for i in range(len(x_list)):
x_array += [array(x_list[i], dtype='float')]
y_array += [array(y_list[i], dtype='float')]
In [5]:
cutout = shapely_cutout(x_array[0],y_array[0])
cutout
Out[5]:
In [6]:
output = width_calc_minimiser(cutout,10)
output
Out[6]:
In [7]:
width = output.x[2]**2 * 2
width
Out[7]:
In [8]:
circle = sh.Point(output.x[0],output.x[1]).buffer(output.x[2]**2)
In [9]:
circle.difference(cutout)
Out[9]:
In [10]:
cutout.difference(circle)
Out[10]:
In [11]:
def scaled_fig_start(w,l):
figure(figsize=(w/2.54,l/2.54))
subplots_adjust(left=0, right=1, top=1, bottom=0)
def scaled_fig_end(w,l):
axis('equal')
xlim([-w/2,w/2])
ylim([-l/2,l/2])
grid(True)
In [12]:
scaled_fig_start(12,12)
plot(cutout.exterior.xy[0],cutout.exterior.xy[1])
plot(circle.exterior.xy[0],circle.exterior.xy[1],'r')
plot([circle.centroid.xy[0]-width/2,circle.centroid.xy[0]+width/2],
[circle.centroid.xy[1],circle.centroid.xy[1]])
plot(circle.centroid.xy[0],circle.centroid.xy[1],'go')
scaled_fig_end(12,12)
In [47]:
# length = length_calc(cutout, width)
ratio_guess = ratio_calc(cutout,width)
ratio_guess
Out[47]:
In [86]:
def solve_ellipse_ratio(R,P,A,W):
toBeZeroed = (P/A) * (W/2) - ( 3*(R+1) - sqrt( (3*R+1)*(R+3) ) )
return toBeZeroed
In [101]:
def approx_ellipse_solver(R,P,A,W):
toBeZeroed = (P/A) * (W/2) - ( R + 1 )
return toBeZeroed
In [96]:
perimeter = cutout.length
area = cutout.area
ratio = fsolve(solve_ellipse_ratio,ratio_guess,args=(perimeter, area, width))
ratio
Out[96]:
In [106]:
t = linspace(-5,0,1000)
R_iter = exp(t)
solver_y = solve_ellipse_ratio(R_iter,perimeter, area, width)
approx_solver_y = approx_ellipse_solver(R_iter,perimeter, area, width)
plot(R_iter,approx_solver_y,'r:')
plot(R_iter,solver_y)
plot(R_iter,zeros(size(t)),'k--')
plot(ratio,0,'o')
Out[106]:
In [ ]:
In [118]:
length = width/ratio
unit_circle = sh.Point(0,0).buffer(1)
eq_ellipse = af.scale(unit_circle, xfact = width/2, yfact = length/2)
eq_ellipse
Out[118]:
In [110]:
def ellipse_in_cutout(minimiserInput,cutout,eq_ellipse,weight):
a = minimiserInput[0]
b = minimiserInput[1]
theta = minimiserInput[2]
moved_ellipse = af.translate(eq_ellipse, xoff=a, yoff=b)
rotated_ellipse = af.rotate(moved_ellipse, theta)
ellipse = rotated_ellipse
toMinimise = weight*ellipse.difference(cutout).area + cutout.difference(ellipse).area
return toMinimise
def eq_ellipse_positioning(cutout,eq_ellipse,weight):
minimizer_kwargs = {"args": (cutout,eq_ellipse,weight,), "method": 'BFGS' }
x0 = np.array([0,0,0])
output = basinhopping(ellipse_in_cutout,x0,niter=100,minimizer_kwargs=minimizer_kwargs)
return output
In [113]:
output = eq_ellipse_positioning(cutout,eq_ellipse,10)
output
Out[113]:
In [114]:
def reposition_ellipse(eq_ellipse,outputX):
a = outputX[0]
b = outputX[1]
theta = outputX[2]
moved_ellipse = af.translate(eq_ellipse, xoff=a, yoff=b)
rotated_ellipse = af.rotate(moved_ellipse, theta)
return rotated_ellipse
In [119]:
repositioned_ellipse = reposition_ellipse(eq_ellipse,output.x)
repositioned_ellipse
Out[119]:
In [120]:
scaled_fig_start(12,12)
plot(cutout.exterior.xy[0],cutout.exterior.xy[1])
plot(repositioned_ellipse.exterior.xy[0],repositioned_ellipse.exterior.xy[1],'r')
plot(repositioned_ellipse.centroid.xy[0],repositioned_ellipse.centroid.xy[1],'go')
scaled_fig_end(12,12)
In [ ]:
scaled_fig_start(12,12)
plot(cutout.exterior.xy[0],cutout.exterior.xy[1])
plot(circle.exterior.xy[0],circle.exterior.xy[1],'r')
plot([circle.centroid.xy[0]-width/2,circle.centroid.xy[0]+width/2],
[circle.centroid.xy[1],circle.centroid.xy[1]])
plot(circle.centroid.xy[0],circle.centroid.xy[1],'go')
scaled_fig_end(12,12)
In [26]:
sh.box(*cutout.bounds).difference(cutout)
Out[26]:
In [33]:
boxBound = max(array([cutout.bounds[2]-cutout.bounds[0],cutout.bounds[3]-cutout.bounds[1]]))
boxBound
Out[33]:
In [13]:
# x_list_optimised = x_list
# y_list_optimised = y_list
In [14]:
with open('../data/cutout_width.csv', 'w') as cutout_width:
with open('../data/cutout_length.csv', 'w') as cutout_length:
with open('../data/cutout_box_bound.csv', 'w') as cutout_box_bound:
# x_writer = csv.writer(x_csvfile, delimiter=',', lineterminator='\n')
# y_writer = csv.writer(y_csvfile, delimiter=',', lineterminator='\n')
# for i in range(len(x_list_optimised)):
# x_writer.writerow(x_list_optimised[i])
# y_writer.writerow(y_list_optimised[i])
In [ ]: