Skip to content

Commit

Permalink
Add sphere and quad intersection logic
Browse files Browse the repository at this point in the history
  • Loading branch information
NickyMateev committed Nov 21, 2018
1 parent 84ef317 commit f5f4781
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 3 deletions.
15 changes: 13 additions & 2 deletions Homework3/solution.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func NewSphere(origin geom.Vector, r float64) Sphere {
}

func (triangle Triangle) Intersect(ray geom.Ray) bool {
// Find vectors for two edges sharing vertex 0
// Find vectors for two edges sharing the first vertex
edge1 := geom.Sub(triangle.b, triangle.a)
edge2 := geom.Sub(triangle.c, triangle.a)

Expand Down Expand Up @@ -85,9 +85,20 @@ func (triangle Triangle) Intersect(ray geom.Ray) bool {
}

func (quad Quad) Intersect(ray geom.Ray) bool {
return true
firstTriangle := Triangle{a: quad.a, b: quad.b, c: quad.c}
secondTriangle := Triangle{a: quad.a, b: quad.c, c: quad.d}

return firstTriangle.Intersect(ray) || secondTriangle.Intersect(ray)
}

func (sphere Sphere) Intersect(ray geom.Ray) bool {
L := geom.Sub(sphere.origin, ray.Origin)
tc := geom.Dot(L, ray.Direction)

d := geom.Dot(L, L) - (tc * tc)
if d > sphere.r {
return false
}

return true
}
26 changes: 25 additions & 1 deletion Homework3/solution_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"github.com/fmi/go-homework/geom"
)

func TestSampleSimpleOperations(t *testing.T) {
func TestSampleSimpleTriangle(t *testing.T) {
var prim geom.Intersectable

a, b, c := geom.NewVector(-1, -1, 0), geom.NewVector(1, -1, 0), geom.NewVector(0, 1, 0)
Expand All @@ -18,6 +18,30 @@ func TestSampleSimpleOperations(t *testing.T) {
}
}

func TestSampleSimpleSphere(t *testing.T) {
var prim geom.Intersectable

origin, r := geom.NewVector(0, 0, 0), 2.0
prim = NewSphere(origin, r)
ray := geom.NewRay(geom.NewVector(0, 0, 2.5), geom.NewVector(0, 0, 0))

if !prim.Intersect(ray) {
t.Errorf("Expected ray %#v to intersect sphere %#v but it did not.", ray, prim)
}
}

func TestSampleSimpleQuad(t *testing.T) {
var prim geom.Intersectable

a, b, c, d := geom.NewVector(0, -2, 0), geom.NewVector(3, 0, 0), geom.NewVector(0, 1, 0), geom.Vector{-1, 0, 0}
prim = NewQuad(a, b, c, d)
ray := geom.Ray{geom.NewVector(0, 0, 2), geom.NewVector(0, 0, -1)}

if !prim.Intersect(ray) {
t.Errorf("Expected ray %#v to intersect quad %#v but it did not.", ray, prim)
}
}

func TestSampleIntersectableImplementations(t *testing.T) {
var prim geom.Intersectable

Expand Down

0 comments on commit f5f4781

Please sign in to comment.