Files @ f1f8a2421f92
Branch filter:

Location: OneEye/exp/tests/test_geometry.py - annotation

Laman
updated readme
import math
import random
from unittest import TestCase

import numpy as np

from geometry import Line,EPoint

random.seed(361)


class TestLine(TestCase):
	def testFromNormal(self):
		p=Line.fromNormal(1,0,-1) # x-1=0
		self.assertEqual(p._alpha,0)
		self.assertEqual(p._d,1)

		q=Line.fromNormal(1,1,-2) # x+y-2=0
		self.assertAlmostEqual(q._alpha,math.pi/4)
		self.assertAlmostEqual(q._d,math.sqrt(2))

		r=Line.fromNormal(0,1,1) # y+1=0
		self.assertAlmostEqual(r._alpha,math.pi*3/2)
		self.assertEqual(r._d,1)

	def testFromPoints(self):
		ab=Line.fromPoints(EPoint(1,3),EPoint(1,-1))
		self.assertEqual(ab._alpha,0)
		self.assertEqual(ab._d,1)

		cd=Line.fromPoints(EPoint(0,2),EPoint(-1,3))
		self.assertAlmostEqual(cd._alpha,math.pi/4)
		self.assertAlmostEqual(cd._d,math.sqrt(2))

		ef=Line.fromPoints(EPoint(-2,-1),EPoint(-4,-1))
		self.assertAlmostEqual(ef._alpha,math.pi*3/2)
		self.assertEqual(ef._d,1)

	def testIntersect(self):
		for i in range(10):
			a=EPoint(random.randint(-100,100),random.randint(-100,100))
			b=EPoint(random.randint(-100,100),random.randint(-100,100))
			c=EPoint(random.randint(-100,100),random.randint(-100,100))
			ab=Line.fromPoints(a,b)
			ac=Line.fromPoints(a,c)
			a_=ab.intersect(ac)
			self.assertAlmostEqual(a.x,a_.x)
			self.assertAlmostEqual(a.y,a_.y)

	def testDistanceTo(self):
		p=Line(0,1)
		q=Line(math.pi/4,math.sqrt(2))
		r=Line(math.pi*3/2,1)

		a=EPoint(0,0)
		b=EPoint(1,0)
		c=EPoint(-1,-1)

		self.assertAlmostEqual(p.distanceTo(a),1)
		self.assertAlmostEqual(p.distanceTo(b),0)
		self.assertAlmostEqual(p.distanceTo(c),2)

		self.assertAlmostEqual(q.distanceTo(a),math.sqrt(2))
		self.assertAlmostEqual(q.distanceTo(b),math.sqrt(2)/2)
		self.assertAlmostEqual(q.distanceTo(c),2*math.sqrt(2))

		self.assertAlmostEqual(r.distanceTo(a),1)
		self.assertAlmostEqual(r.distanceTo(b),1)
		self.assertAlmostEqual(r.distanceTo(c),0)

	def testShiftBasis(self):
		newBasis=EPoint(-200,150)
		r=Line(0,-100)
		r_=r.shiftBasis(newBasis)
		self.assertAlmostEqual(r_._alpha,0)
		self.assertAlmostEqual(r_._d,100)

		s=Line(0,100)
		s_=s.shiftBasis(newBasis)
		self.assertAlmostEqual(s_._alpha,0)
		self.assertAlmostEqual(s_._d,300)

		newBasis=EPoint(-100,100)
		diag=100*math.sqrt(2)
		p=Line(math.pi*3/4,diag/2)
		p_=p.shiftBasis(newBasis)
		self.assertAlmostEqual(p_._alpha,math.pi*7/4)
		self.assertAlmostEqual(p_._d,diag/2)

		q=Line(math.pi*3/4,-diag/2)
		q_=q.shiftBasis(newBasis)
		self.assertAlmostEqual(q_._alpha,math.pi*7/4)
		self.assertAlmostEqual(q_._d,3/2*diag)

	def testTransform(self):
		rot90=np.array([[0,-1,0],[1,0,0],[0,0,1]])
		p=Line(math.pi/4,10)
		p_=p.transform(rot90)
		self.assertAlmostEqual(p_.alpha,math.pi*3/4)
		self.assertAlmostEqual(p_.d,p.d)

		shiftXY10=np.array([[1,0,10],[0,1,10],[0,0,1]])
		p_=p.transform(shiftXY10)
		self.assertAlmostEqual(p_.alpha,p.alpha)
		self.assertAlmostEqual(p_.d,10+10*math.sqrt(2))