예제 #1
0
    def test_XY_directions(self):
        a = xyz.XY(0, 0)

        left = xyz.XY(-1, 0)
        right = xyz.XY(1, 0)
        nearer = xyz.XY(0, -1)
        farther = xyz.XY(0, 1)

        self.assertTrue(a.rightof(left))
        self.assertFalse(a.leftof(left))
        self.assertFalse(a.nearer(left))
        self.assertFalse(a.farther(left))

        self.assertTrue(a.leftof(right))
        self.assertFalse(a.rightof(right))
        self.assertFalse(a.nearer(right))
        self.assertFalse(a.farther(right))

        self.assertFalse(a.leftof(nearer))
        self.assertTrue(a.farther(nearer))
        self.assertFalse(a.rightof(nearer))
        self.assertFalse(a.nearer(nearer))

        self.assertFalse(a.leftof(farther))
        self.assertFalse(a.farther(farther))
        self.assertFalse(a.rightof(farther))
        self.assertTrue(a.nearer(farther))

        self.assertTrue(a.xlinear(nearer))
        self.assertTrue(a.xlinear(farther))
        self.assertFalse(a.xlinear(left))
        self.assertFalse(a.xlinear(right))

        self.assertFalse(a.ylinear(nearer))
        self.assertFalse(a.ylinear(farther))
        self.assertTrue(a.ylinear(left))
        self.assertTrue(a.ylinear(right))

        b = xyz.XY(3, 4)

        self.assertEqual(a.distance(b), Decimal('5.00000'))
        self.assertEqual(a.slope(b), Decimal(4.0) / Decimal(3.0))
        self.assertEqual(b.slope(a), Decimal(4.0) / Decimal(3.0))

        for p in (a, left, right, nearer, farther):
            with self.assertRaises(ValueError):
                x = p.quadrant

        self.assertEqual(xyz.XY(1, 1).quadrant, 1)
        self.assertEqual(xyz.XY(-1, 1).quadrant, 2)
        self.assertEqual(xyz.XY(-1, -1).quadrant, 3)
        self.assertEqual(xyz.XY(1, -1).quadrant, 4)

        with self.assertRaises(RuntimeError):
            a.yzquadrant
        with self.assertRaises(RuntimeError):
            a.xzquadrant
예제 #2
0
    def test_XY_add(self):
        a = xyz.XY(0, 1)
        b = xyz.XY(1, 1)
        c = xyz.XY(1, 2)
        self.assertEqual(a + b, c)

        b = xyz.XY(-3, -4)
        c = xyz.XY(-3, -3)
        self.assertEqual(a + b, c)
예제 #3
0
    def test_Line_bisections(self):
        a = xyz.Line(xyz.XY(0, 0), xyz.XY(4, 5))

        self.assertEqual(a.middle, xyz.XY(2, 2.5))

        self.assertEqual(a.top, xyz.Line(xyz.XY(2, 2.5), xyz.XY(4, 5)))
        self.assertEqual(a.bottom, xyz.Line(xyz.XY(0, 0), xyz.XY(2, 2.5)))

        self.assertEqual(a.xybisector,
                         xyz.Line(xyz.XY(-0.499, 4.499), xyz.XY(4.5, 0.5)))
예제 #4
0
    def test_Line_sort(self):
        a = xyz.XY(0, 0)
        b = xyz.XY(3, 0)
        c = xyz.XY(3, 4)

        AB = xyz.Line(a, b)
        BC = xyz.Line(b, c)
        AC = xyz.Line(a, c)

        good = [AB, BC, AC]

        for abc in ([AB, BC, AC], [AB, AC, BC], [BC, AB, AC], [BC, AC, AB],
                    [AC, AB, BC], [AC, BC, AB]):
            abc.sort()
            self.assertEqual(good, abc)
예제 #5
0
 def test_Line_atD(self):
     a = xyz.Line(xyz.XY(0, 0), xyz.XY(4, 5))
     d = a.length * 2
     self.assertNotEqual(a.atD(d), xyz.XY(7, 10))
     self.assertEqual(a.atD(d), xyz.XY(8, 10))
     self.assertNotEqual(a.atD(d), xyz.XY(9, 10))
     d = 0 - d
     self.assertNotEqual(a.atD(d), xyz.XY(-7, -10))
     self.assertEqual(a.atD(d), xyz.XY(-8, -10))
     self.assertNotEqual(a.atD(d), xyz.XY(-9, -10))
예제 #6
0
    def test_XYZ_identity(self):
        a = xyz.XY(0, 0)
        b = xyz.XYZ(0, 0, 0)
        self.assertEqual(a, b)

        c = xyz.XYZ(1, 1, 1)
        self.assertEqual(c.yzquadrant, 1)
        self.assertEqual(c.xzquadrant, 1)

        d = xyz.XYZ(-1, -1, -1)
        self.assertEqual(c.distance(d), Decimal('3.46410', quant="10000.000"))
예제 #7
0
    def test_Line_xyBLAH(self):
        a = xyz.Line(xyz.XY(0, 0), xyz.XY(4, 5))
        self.assertEqual(a.xyb, 0)
        self.assertEqual(a.xym, 1.25)
        self.assertEqual(a.xybisector.xyb, Decimal("4.1"))
        self.assertEqual(a.xybisector.xym, Decimal("-0.8"))

        self.assertEqual(a.xyYAtX(-4), -5)
        self.assertEqual(a.xyYAtX(0), 0)
        self.assertEqual(a.xyYAtX(2), 2.5)
        self.assertEqual(a.xyYAtX(4), 5)
        self.assertEqual(a.xyYAtX(8), 10)

        self.assertEqual(a.xyXAtY(-5), -4)
        self.assertEqual(a.xyXAtY(0), 0)
        self.assertEqual(a.xyXAtY(2.5), 2)
        self.assertEqual(a.xyXAtY(5), 4)
        self.assertEqual(a.xyXAtY(10), 8)

        self.assertEqual(a.atX(4), xyz.XY(4, 5))
예제 #8
0
    def test_Line_length(self):
        a = xyz.Line(xyz.XY(0, 0), xyz.XY(1, 1))
        self.assertEqual(a.length, Decimal('1.414'))

        a = xyz.Line(xyz.XY(1, -3), xyz.XY(-5, -7))
        self.assertEqual(a.length, Decimal('7.211'))

        self.assertEqual(list(a.points), [xyz.XY(1, -3), xyz.XY(-5, -7)])
예제 #9
0
 def test_XY_str(self):
     a = xyz.XY(0, 1)
     self.assertEqual(str(a), "XY(0,1)")
     a = xyz.XY(0, 0)
     self.assertEqual(str(a), "XY(0,0)")
     a = xyz.XY(-0, 0)
     self.assertEqual(str(a), "XY(0,0)")
     a = xyz.XY(0, -0)
     self.assertEqual(str(a), "XY(0,0)")
     a = xyz.XY(0, -1)
     self.assertEqual(str(a), "XY(0,-1)")
     a = xyz.XY(-0, -1)
     self.assertEqual(str(a), "XY(0,-1)")
     a = xyz.XY(-1, -1)
     self.assertEqual(str(a), "XY(-1,-1)")
예제 #10
0
    def test_Line(self):
        a = xyz.XY(0,0)
        b = xyz.XY(0.5, 0.86603)
        l = xyz.Line(a, b)
        self.assertEqual(l.xy_min.x, Decimal('0'))
        self.assertEqual(l.xy_min.y, Decimal('0'))
        self.assertEqual(l.xy_max.x, Decimal('0.5'))
        self.assertEqual(l.xy_max.y, Decimal('0.866'))
        self.assertEqual(l.xym, Decimal('1.732'))
        self.assertEqual(l.xyb, Decimal('0'))

        l = xyz.Line(b, a)
        self.assertEqual(l.xym, Decimal('1.732'))
        self.assertEqual(l.xyb, Decimal('0'))

        a = xyz.XY(0,0)
        b = xyz.XY(0.5, -0.86603)
        l = xyz.Line(a, b)
        self.assertEqual(l.xym, Decimal('-1.732'))
        self.assertEqual(l.xyb, Decimal('0'))

        l = xyz.Line(b, a)
        self.assertEqual(l.xym, Decimal('-1.732'))
        self.assertEqual(l.xyb, Decimal('0'))

        a = xyz.XY(1,0)
        b = xyz.XY(1.5, 0.86603)
        l = xyz.Line(a, b)
        self.assertEqual(l.xym, Decimal('1.732'))
        self.assertEqual(l.xyb, Decimal('-1.732'))

        a = xyz.XY(3,0)
        b = xyz.XY(4,5)
        l = xyz.Line(a, b)
        self.assertEqual(l.xym, Decimal('5'))
        self.assertEqual(l.xyb, Decimal('-15'))
예제 #11
0
    def test_RightTriangle_angles(self):
        a = xyz.XY(0,0)
        b = xyz.XY(3,0)
        c = xyz.XY(3,3)

        for abc in ((a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)):
            t = shapes.RightTriangle(abc[0], abc[1], abc[2])

            self.assertTrue(t.a in [xyz.Line(xyz.XY(0,0), xyz.XY(3,0)),
                                    xyz.Line(xyz.XY(3,0), xyz.XY(3,3))])
            self.assertEqual(t.b, xyz.Line(xyz.XY(0,0), xyz.XY(3,3)))
            self.assertTrue(t.c in [xyz.Line(xyz.XY(0,0), xyz.XY(3,0)),
                                    xyz.Line(xyz.XY(3,0), xyz.XY(3,3))])
            self.assertTrue(t.b.length >= t.a.length)
            self.assertTrue(t.b.length >= t.c.length)
            self.assertTrue(t.a.length >= t.c.length)

            self.assertEqual(t.a.length, 3)
            self.assertEqual(t.b.length, Decimal('4.243'))
            self.assertEqual(t.c.length, 3)

            self.assertEqual(t.BAC, 45)
            self.assertEqual(t.ABC, 90)
            self.assertEqual(t.ACB, 45)

            self.assertEqual(t.Bmid, xyz.XY(1.5, 1.5))

        a = xyz.XY(0,0)
        b = xyz.XY(3,0)
        c = xyz.XY(3,4)

        AB = xyz.Line(a,b)
        AC = xyz.Line(a,c)
        BC = xyz.Line(b,c)

        for abc in ((a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)):
            t = shapes.RightTriangle(abc[0], abc[1], abc[2])

            self.assertTrue(t.a in [BC, BC.reverse])
            self.assertEqual(t.b, AC)
            self.assertTrue(t.c in [AB, AB.reverse])
            self.assertTrue(t.b.length >= t.a.length)
            self.assertTrue(t.b.length >= t.c.length)
            self.assertTrue(t.a.length >= t.c.length)

            self.assertEqual(t.a.length, 4)
            self.assertEqual(t.b.length, 5)
            self.assertEqual(t.c.length, 3)

            self.assertEqual(t.BAC, Decimal('36.87'))
            self.assertEqual(t.ABC, 90)
            self.assertEqual(t.ACB, Decimal('53.13000'))

            self.assertEqual(t.Bmid, xyz.XY(1.5, 2))
예제 #12
0
    def test_Triangle_subsets(self):
        a = xyz.XY(0,0)
        b = xyz.XY(1,0)
        c = xyz.XY(0.5, math.sqrt(Decimal("0.75")))

        for abc in ((a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)):
            t = shapes.Triangle(abc[0], abc[1], abc[2])
            self.assertEqual(t.A, a)
            self.assertEqual(t.B, b)
            self.assertEqual(t.C, c)

            self.assertFalse(isinstance(t, shapes.RightTriangle))

            self.assertTrue(t.b.length >= t.a.length)
            self.assertTrue(t.b.length >= t.c.length)
            self.assertTrue(t.a.length >= t.c.length)

            l = t.a.length + t.c.length
            l = t.a.length / l
            l = t.b.length * l

            self.assertEqual(t.a, xyz.Line(a, c))
            self.assertEqual(t.b, xyz.Line(b, c))
            self.assertEqual(t.c, xyz.Line(a, b))

            self.assertEqual(t.a.length, 1)
            self.assertEqual(t.b.length, 1)
            self.assertEqual(t.c.length, 1)

            mids = [xyz.XY(Decimal("0.25000"), Decimal("0.43301")),
                    xyz.XY(0.5, 0),
                    xyz.XY(Decimal("0.75000"), Decimal("0.43301"))]
            self.assertTrue(t.Bmid in mids)

            self.assertTrue(t.ABC > Decimal('59.001') and \
                            t.ABC < Decimal('60.001'))
            self.assertTrue(t.BAC > Decimal('59.001') and \
                            t.ABC < Decimal('60.001'))
            self.assertTrue(t.ACB > Decimal('59.001') and \
                            t.ABC < Decimal('60.001'))

        a = xyz.XY(0,0)
        b = xyz.XY(3,0)
        c = xyz.XY(4,5)

        for abc in ((a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)):
            t = shapes.Triangle(abc[0], abc[1], abc[2])

            self.assertFalse(isinstance(t, shapes.RightTriangle))

            self.assertTrue(t.b.length >= t.a.length)
            self.assertTrue(t.b.length >= t.c.length)
            self.assertTrue(t.a.length >= t.c.length)

            self.assertEqual(t.Bmid, xyz.XY(1.170, 1.464))

            l = t.a.length + t.c.length
            l = t.a.length / l
            l = t.b.length * l

            self.assertEqual(t.a, xyz.Line(xyz.XY(3,0), xyz.XY(4,5)))
            self.assertEqual(t.b, xyz.Line(xyz.XY(0,0), xyz.XY(4,5)))
            self.assertEqual(t.c, xyz.Line(xyz.XY(0,0), xyz.XY(3,0)))

            self.assertEqual(t.a.length, Decimal('5.099'))
            self.assertEqual(t.b.length, Decimal('6.403'))
            self.assertEqual(t.c.length, 3)

            self.assertEqual(t.thetaA, Decimal('51.340'))
            self.assertEqual(t.thetaC, Decimal('-27.350'))

            self.assertEqual(t.ABC, Decimal('101.31'))
            self.assertEqual(t.BAC, Decimal('51.340'))
            self.assertEqual(t.ACB, Decimal('27.35'))
예제 #13
0
 def test_Line_distance(self):
     a = xyz.Line(xyz.XY(0, 0), xyz.XY(4, 5))
     A = xyz.XY(0, 4)
     self.assertEqual(a.distance(A), Decimal('4.0615'))
예제 #14
0
    def test_Line_reverse(self):
        a = xyz.Line(xyz.XY(0, 0), xyz.XY(4, 5))
        b = xyz.Line(xyz.XY(4, 5), xyz.XY(0, 0))

        self.assertEqual(a.reverse, b)
예제 #15
0
 def test_Line_str(self):
     a = xyz.Line(xyz.XY(0, 0), xyz.XY(1, 1))
     self.assertEqual(str(a), "Line(XY(0,0),XY(1,1))")