2014-07-16 18:57:53 -04:00
|
|
|
describe 'LineSegment', ->
|
|
|
|
LineSegment = require 'lib/world/line_segment'
|
|
|
|
Vector = require 'lib/world/vector'
|
|
|
|
|
|
|
|
v00 = new Vector(0, 0)
|
|
|
|
v11 = new Vector(1, 1)
|
|
|
|
v22 = new Vector(2, 2)
|
|
|
|
v34 = new Vector(3, 4)
|
|
|
|
v04 = new Vector(0, 4)
|
|
|
|
v30 = new Vector(3, 0)
|
|
|
|
vneg = new Vector(-1, -1)
|
|
|
|
|
|
|
|
it 'intersects itself', ->
|
|
|
|
lineSegment = new LineSegment v00, v34
|
|
|
|
expect(lineSegment.intersectsLineSegment lineSegment).toBe true
|
|
|
|
|
|
|
|
it 'intersects other segments properly', ->
|
|
|
|
l1 = new LineSegment v00, v34
|
|
|
|
l2 = new LineSegment v04, v30
|
|
|
|
l3 = new LineSegment v00, v11
|
|
|
|
expect(l1.intersectsLineSegment l2).toBe true
|
|
|
|
expect(l2.intersectsLineSegment l1).toBe true
|
|
|
|
expect(l1.intersectsLineSegment l3).toBe true
|
|
|
|
expect(l3.intersectsLineSegment l1).toBe true
|
|
|
|
expect(l2.intersectsLineSegment l3).toBe false
|
|
|
|
expect(l3.intersectsLineSegment l2).toBe false
|
|
|
|
|
|
|
|
it 'can tell when a point is on a line or segment', ->
|
|
|
|
lineSegment = new LineSegment v00, v11
|
|
|
|
expect(lineSegment.pointOnLine v22, false).toBe true
|
2014-07-16 19:30:57 -04:00
|
|
|
expect(lineSegment.pointOnLine v22, true).toBe false
|
|
|
|
expect(lineSegment.pointOnLine v00, false).toBe true
|
|
|
|
expect(lineSegment.pointOnLine v00, true).toBe true
|
|
|
|
expect(lineSegment.pointOnLine v11, true).toBe true
|
|
|
|
expect(lineSegment.pointOnLine v11, false).toBe true
|
|
|
|
expect(lineSegment.pointOnLine v34, false).toBe false
|
|
|
|
expect(lineSegment.pointOnLine v34, true).toBe false
|
2014-07-16 18:57:53 -04:00
|
|
|
|
|
|
|
it 'correctly calculates distance to points', ->
|
|
|
|
lineSegment = new LineSegment v00, v11
|
|
|
|
expect(lineSegment.distanceToPoint v00).toBe 0
|
|
|
|
expect(lineSegment.distanceToPoint v11).toBe 0
|
|
|
|
expect(lineSegment.distanceToPoint v22).toBeCloseTo Math.SQRT2
|
|
|
|
expect(lineSegment.distanceToPoint v34).toBeCloseTo Math.sqrt(2 * 2 + 3 * 3)
|
|
|
|
expect(lineSegment.distanceToPoint v04).toBeCloseTo Math.sqrt(1 * 1 + 3 * 3)
|
|
|
|
expect(lineSegment.distanceToPoint v30).toBeCloseTo Math.sqrt(2 * 2 + 1 * 1)
|
|
|
|
expect(lineSegment.distanceToPoint vneg).toBeCloseTo Math.SQRT2
|
|
|
|
|
|
|
|
nullSegment = new LineSegment v11, v11
|
|
|
|
expect(lineSegment.distanceToPoint v11).toBe 0
|
|
|
|
expect(lineSegment.distanceToPoint v22).toBeCloseTo Math.SQRT2
|