Commit 91886e96 authored by Jayant Khatkar's avatar Jayant Khatkar
Browse files

bug fixes in voxmap generation and structure of cost function code

parent 3ce8c051
......@@ -45,7 +45,7 @@ function problem(cons::Vector{contour}, max_layers::Int, min_dist::Number)
G = LightGraphs.SimpleDiGraph(0)
# separate contours into layers
layer_heights = sort(collect(Set([c.pos[1,3] for c in cons])))
layer_heights = sort(collect(Set([c.pos[end,3] for c in cons])))
layers = [[] for i in 1:length(layer_heights)]
clayeri = []
contour_trees = []
......@@ -96,18 +96,22 @@ end
function seg_helper_orientation(p,q,r)
val = (q[2]-p[2]) * (r[1]-q[1]) - (q[1]-p[1]) * (r[2]-q[2])
if val > 0
# clockwise
return 1
return 1 # clockwise
elseif val < 0
# anticlockwise
return 2
return 2 # anticlockwise
else
# colinear
return 0
return 0 # colinear
end
end
function onseg(p,q,r)
# check if q lies on segment pr assuming 3 points are colinear
return ((q[1] <= max(p[1], r[1])) && (q[1] >= min(p[1], r[1])) &&
(q[2] <= max(p[2], r[2])) && (q[2] >= min(p[2], r[2])))
end
function seg_intersect(p1,q1,p2,q2)
o1 = seg_helper_orientation(p1, q1, p2)
......@@ -115,10 +119,12 @@ function seg_intersect(p1,q1,p2,q2)
o3 = seg_helper_orientation(p2, q2, p1)
o4 = seg_helper_orientation(p2, q2, q1)
if (o1 o2) && (o3 o4)
if (o1 o2) && (o3 o4) ||
o1==0 && onseg(p1, p2, q1) ||
o2==0 && onseg(p1, q2, q1) ||
o3==0 && onseg(p2, p1, q2) ||
o4==0 && onseg(p2, q1, q2)
return true
elseif o1==0 || o2==0 || o3==0 || o4==0
print("Colinearity! - TODO")
end
return false
......@@ -134,7 +140,7 @@ function voxmap(vox, vox_d, prob::problem)
# for one vox, get all contours which pass through it
# only need to search contours in its layer
l = Int((vox[3] + prob.layer_height/2)/prob.layer_height)
l = Int(round((vox[3] + prob.layer_height/2)/prob.layer_height))
voxx1 = vox[1] + vox_d/2
voxx2 = vox[1] - vox_d/2
voxy1 = vox[2] + vox_d/2
......@@ -154,6 +160,11 @@ function voxmap(vox, vox_d, prob::problem)
# check if contour passes thorough this vox
for i in 2:size(c.pos)[1]
# make sure it is a line segment, not a point
if c.pos[i-1,1:2] == c.pos[i,1:2]
continue
end
# is this line segment completely outside vox?
if c.pos[i, 1] > voxx1 && c.pos[i-1, 1] > voxx1 ||
c.pos[i,1] < voxx2 && c.pos[i-1, 1] < voxx2 ||
......@@ -162,7 +173,7 @@ function voxmap(vox, vox_d, prob::problem)
# segment outside vox entirely
if seg_now
print("Something's gone wrong: segment entirely outside voxel, but last segment inside")
println("Something's gone wrong: segment entirely outside voxel, but last segment inside")
end
continue
end
......@@ -178,7 +189,7 @@ function voxmap(vox, vox_d, prob::problem)
seg_now = true
if i!=2
print("Whole segment inside but something wrong")
println("Whole segment inside but something wrong")
end
continue
end
......@@ -189,9 +200,6 @@ function voxmap(vox, vox_d, prob::problem)
cross_side3 = seg_intersect(c.pos[i-1,:], c.pos[i,:], [voxx2, voxy1], [voxx2, voxy2])
cross_side4 = seg_intersect(c.pos[i-1,:], c.pos[i,:], [voxx2, voxy2], [voxx1, voxy2])
println(cid)
println([cross_side1, cross_side2, cross_side3, cross_side4])
# does this line segment intersect with vox only once
if p1inside p2inside
......@@ -201,7 +209,7 @@ function voxmap(vox, vox_d, prob::problem)
xi = [voxx1, voxx2][[cross_side1, cross_side3]][1]
p_i = interpolate(c.pos[i-1,:], c.pos[i,:], xi, 1)
t_i = interpolate(c.time[i-1], c.time[i], c.pos[i-1,1], xi, c.pos[i,1])
elseif cross_side3 || cross_side4
elseif cross_side2 || cross_side4
# intersection with y
yi = [voxy1, voxy2][[cross_side2, cross_side4]][1]
p_i = interpolate(c.pos[i-1,:], c.pos[i,:], yi, 2)
......@@ -211,7 +219,9 @@ function voxmap(vox, vox_d, prob::problem)
if p1inside
# end existing segment
if !seg_now
print("Something's gone wrong")
# contour end on the first segment
t_start = 0
seglen_sofar = 0
end
seglen_sofar += dist(c.pos[i-1, :], p_i)
push!(segcontours, cid)
......@@ -232,36 +242,57 @@ function voxmap(vox, vox_d, prob::problem)
p_is = []
t_is = []
if cross_side1
push!(p_is, interpolate(c.pos[i-1,:], c.pos[i,:], voxx1, 1))
p = interpolate(c.pos[i-1,:], c.pos[i,:], voxx1, 1)
if !isnan(p[1])
push!(p_is, p)
push!(t_is, interpolate(c.time[i-1], c.time[i], c.pos[i-1,1], voxx1, c.pos[i,1]))
end
end
if cross_side2
push!(p_is, interpolate(c.pos[i-1,:], c.pos[i,:], voxy1, 2))
p = interpolate(c.pos[i-1,:], c.pos[i,:], voxy1, 2)
if !isnan(p[1])
push!(p_is,p)
push!(t_is, interpolate(c.time[i-1], c.time[i], c.pos[i-1,2], voxy1, c.pos[i,2]))
end
end
if cross_side3
push!(p_is, interpolate(c.pos[i-1,:], c.pos[i,:], voxx2, 1))
p = interpolate(c.pos[i-1,:], c.pos[i,:], voxx2, 1)
if !isnan(p[1])
push!(p_is,p)
push!(t_is, interpolate(c.time[i-1], c.time[i], c.pos[i-1,1], voxx2, c.pos[i,1]))
end
end
if cross_side4
push!(p_is, interpolate(c.pos[i-1,:], c.pos[i,:], voxy2, 2))
p = interpolate(c.pos[i-1,:], c.pos[i,:], voxy2, 2)
if !isnan(p[1])
push!(p_is, p)
push!(t_is, interpolate(c.time[i-1], c.time[i], c.pos[i-1,2], voxy2, c.pos[i,2]))
end
end
if seg_now
print("Something's wrong")
end
if length(p_is) >= 2
push!(segoffset, mean(t_is))
push!(segcontours, cid)
n_intersections = sum([cross_side1, cross_side2, cross_side3, cross_side4])
if n_intersections ==2
if length(p_is) == 2
push!(seglen, dist(p_is[1], p_is[2]))
else
push!(seglen, dist(p_is[1], p_is[3]))
end
end
else
p1inside = c.pos[i-1, 1] <= voxx1 && c.pos[i-1, 1] >= voxx2 &&
c.pos[i-1, 2] >= voxy2 && c.pos[i-1, 2] <= voxy1
p = p1inside ? c.pos[i-1,:] : c.pos[i,:]
t = p1inside ? c.time[i-1] : c.time[i]
push!(segcontours, cid)
push!(segoffset, (t + t_is[1])/2)
push!(seglen, dist(p_is[1], p))
end
end
end
# if contour ends inside the voxel
......@@ -327,6 +358,7 @@ function valid_swap(rollout::Vector{Int}, i::Int, j::Int, prob::problem)
# would swapping indices i and j in rollout result in another valid rollout?
# NOTE THIS FUNCTION DOESNT WORK
# IT ONLY CHECKS DEPENDENCIES TO A DEPTH OF 1
# TODO, leave for now, use check_validity to double check at the end
if i>j
i,j = j,i
......@@ -372,12 +404,6 @@ function check_validity(rollout::Vector{Int}, prob::problem)
end
#voxels = DataFrames.DataFrame(CSV.File("tensile-1-1.csv"))
contours = contour.(JSON.parse(open("tensilecontours.json")))
dt = problem(contours, 5, 5)
@benchmark random_rollout(dt.G)
function test_voxmap()
# create vox
vox = [0,0,0.5]
......@@ -403,3 +429,51 @@ function test_voxmap()
vm = voxmap(vox, vox_d, prob)
return vm
end
function rollout2time(rollout::Vector{Int}, prob)
# start time of each contour, assuming no travel time
return cumsum([prob.contours[c].time[end] for c in rollout])
end
function calc_cost(rollout::Vector{Int}, prob::problem, voxms::Vector{voxmap})
# go from rollout to timestart for each contour
timestart = rollout2time(rollout, prob)
# calculate time at each voxel
# calculate temp difference from voxel below it
# calculate stresses at each voxel
# calculate cost func at each voxel
# sum over the voxels
end
function construct_cost(prob::problem)
a = 1
b = :($a + 5) # using $ 'interpolates' literal expression into the 'quoted' expression
c = :(5*5 + a)
d = :($b + $c) #interpolate other expressions to form larger expressions
ex1 = :(i*2) # construct this according to voxels and contours
ex2 = quote
function cost_f(i::Int)
return $ex1
end
end
return eval(ex2) # return the contructed function
end
voxels = DataFrames.DataFrame(CSV.File("tensile-1-1.csv"))
contours = contour.(JSON.parse(open("tensilecontours.json")))
dt = problem(contours, 5, 5)
@benchmark random_rollout(dt)
rl = random_rollout(dt)
voxms = [voxmap([v.x, v.y, v.z], 1, dt) for v in eachrow(voxels)]
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment