Skip to content

Commit 1318ff4

Browse files
author
bhz
committed
1.add max sub array problem algorithm
2.add hit info storage in raytracer1.jl
1 parent c5b0a38 commit 1318ff4

File tree

2 files changed

+71
-4
lines changed

2 files changed

+71
-4
lines changed

find_max_subarray.jl

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# max sub array problem
2+
function findMaxCrossingSubarray(A,low,mid,high)
3+
left_sum = typemin(Float64)
4+
sum = 0
5+
max_left = 1
6+
for i=[mid:-1:low]
7+
sum += A[i]
8+
if sum>left_sum
9+
left_sum = sum
10+
max_left = i
11+
end
12+
end
13+
right_sum = typemin(Float64)
14+
sum = 0
15+
max_right = 1
16+
for j=[mid+1:high]
17+
sum += A[j]
18+
if sum>right_sum
19+
right_sum = sum
20+
max_right = j
21+
end
22+
end
23+
return max_left,max_right,left_sum+right_sum
24+
end
25+
26+
function findMaxSubarray(A,low,high)
27+
if high == low
28+
return low,high,A[low]
29+
else
30+
mid = floor((low+high)/2)
31+
left_low,left_high,left_sum = findMaxSubarray(A,low,mid)
32+
right_low,right_high,right_sum = findMaxSubarray(A,mid+1,high)
33+
cross_low,cross_high,cross_sum = findMaxCrossingSubarray(A,low,mid,high)
34+
if left_sum>right_sum && left_sum>cross_sum
35+
return left_low,left_high,left_sum
36+
elseif right_sum>left_sum && right_sum>cross_sum
37+
return right_low,right_high,right_sum
38+
else
39+
return cross_low,cross_high,cross_sum
40+
end
41+
end
42+
end
43+
44+
function test()
45+
arr = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
46+
low,high,sum = findMaxSubarray(arr,1,length(arr))
47+
println(low)
48+
println(high)
49+
println(sum)
50+
end

raytracer1.jl

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1+
# 光线
12
type Ray
23
o::Vector{Float64}
34
d::Vector{Float64}
45
Ray(o,d)=if length(o)!=3 || length(d)!=3; error("only 3d"); else; new(o,d); end
56
end
67

8+
# 存储交点信息
9+
type ShadeRec
10+
n::Vector{Float64}
11+
hitp::Vector{Float64}
12+
ShadeRec(n,hitp)=if length(hitp)!=3 || length(n)!=3; error("only 3d"); else; new(n,hitp); end
13+
end
14+
15+
# 无限平面
716
type Plane
817
p::Vector{Float64}
918
n::Vector{Float64}
@@ -12,21 +21,29 @@ type Plane
1221
end
1322
Plane(p,n) = Plane(p,n,0.0)
1423

24+
# 平面相交测试
1525
function hit(pln::Plane, ray::Ray)
1626
t=dot((pln.p-ray.o),pln.n)/(dot(ray.d,pln.n))
1727
if t>pln.kEps
18-
return true
28+
sr = ShadeRec(ray.o+t*ray.d,pln.n)
29+
return true, sr # 相交时返回交点信息
1930
else
2031
return false
2132
end
2233
end
2334

35+
# 世界
36+
37+
38+
# 视平面
39+
40+
2441
function test()
2542
pln = Plane([0,0,-20.0],[0,0,1.0])
2643
ray1 = Ray([0,0,0],[0,0,-1])
2744
ray2 = Ray([0,0,0],[1,0,0])
2845
ray3 = Ray([0,0,0],[0,1,0])
29-
hit(pln,ray1)?println("hit"):println("not hit")
30-
hit(pln,ray2)?println("hit"):println("not hit")
31-
hit(pln,ray3)?println("hit"):println("not hit")
46+
hit(pln,ray1)[1]?println("hit"):println("not hit")
47+
hit(pln,ray2)[1]?println("hit"):println("not hit")
48+
hit(pln,ray3)[1]?println("hit"):println("not hit")
3249
end

0 commit comments

Comments
 (0)