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 *


Populating the interactive namespace from numpy and matplotlib

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]:
                  njev: 2936
                   nit: 100
                  nfev: 15170
 minimization_failures: 41
                     x: array([ 0.05659363, -0.75000001,  1.78308599])
                   fun: 9.639328190458306
               message: ['requested number of basinhopping iterations completed successfully']

In [7]:
width = output.x[2]**2 * 2
width


Out[7]:
6.3587913118005748

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]:
0.91792488139953998

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]:
array([ 0.91702696])

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]:
[<matplotlib.lines.Line2D at 0x7f484199d7b8>]

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]:
                  njev: 2808
                   nit: 100
                  nfev: 14063
 minimization_failures: 3
                     x: array([ 0.06129598, -0.7420191 ,  0.01761774])
                   fun: 6.849280878375983
               message: ['requested number of basinhopping iterations completed successfully']

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]:
7.3000000000000007

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


  File "<ipython-input-14-db029b8338b9>", line 12
    #                 y_writer.writerow(y_list_optimised[i])
                                                            ^
SyntaxError: unexpected EOF while parsing

In [ ]: