def test_sang(self): p1,p2,p3,p4 = vec3(1,1,0),vec3(0,1,0),vec3(0,-1,0),vec3(0,0,1) pn = vec3(0,0,1) self.assertEqual(dpr.isnear(p1.sang(p2,pn), dpr.PI4),1) self.assertEqual(dpr.isnear(p2.sang(p1,pn), dpr.PI4),0) self.assertEqual(dpr.isnear(p2.sang(p1,pn),-dpr.PI4),1) self.assertEqual(dpr.isnear(p2.sang(p3,pn), dpr.PI ),1) self.assertEqual(dpr.isnear(p3.sang(p1,pn),dpr.threePI4),1)
def test_sang(self): p1, p2, p3, p4 = vec3(1, 1, 0), vec3(0, 1, 0), vec3(0, -1, 0), vec3(0, 0, 1) pn = vec3(0, 0, 1) self.assertEqual(dpr.isnear(p1.sang(p2, pn), dpr.PI4), 1) self.assertEqual(dpr.isnear(p2.sang(p1, pn), dpr.PI4), 0) self.assertEqual(dpr.isnear(p2.sang(p1, pn), -dpr.PI4), 1) self.assertEqual(dpr.isnear(p2.sang(p3, pn), dpr.PI), 1) self.assertEqual(dpr.isnear(p3.sang(p1, pn), dpr.threePI4), 1)
def test_dot(self): a1,v1 = dpr.PI4,vec3(0,0,1) a2,v2 = dpr.PI2,vec3(0,1,0) q1,q2 = quat(1,0,0,0).av(a1,v1),quat(1,1,1,0).av(a1,v1) q3 = quat(0,1,0,0).av(a2,v2) q4 = quat(0,1,0,0).av(0,v1) self.assertTrue(dpr.isnear(q1.dot(q2),q1.mag2())) self.assertFalse(dpr.isnear(q1.dot(q3),0)) self.assertTrue(dpr.isnear(q3.dot(q4),q3.w))
def test_pline(self): pline = self.origin.pline(self.one, 2) d1 = self.origin.d(pline[0]) d2 = pline[0].d(pline[1]) d3 = pline[1].d(self.one) self.assertEqual(len(pline), 2) self.assertTrue(dpr.isnear(d1, d2)) self.assertTrue(dpr.isnear(d2, d3)) self.assertTrue(self.origin.mid(self.one), pline[0].mid(pline[1]))
def test_pline(self): pline = self.origin.pline(self.one,2) d1 = self.origin.d(pline[0]) d2 = pline[0].d(pline[1]) d3 = pline[1].d(self.one) self.assertEqual(len(pline),2) self.assertTrue(dpr.isnear(d1,d2)) self.assertTrue(dpr.isnear(d2,d3)) self.assertTrue(self.origin.mid(self.one),pline[0].mid(pline[1]))
def test_adist(self): deg10 = gtl.rad(10) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 2, deg10 * 6), deg10 * 4), 1) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 6, deg10 * 2), deg10 * 4), 1) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 6, deg10 * 22), deg10 * 16), 1) self.assertEqual( gtl.isnear(gtl.adist(deg10 * 6, deg10 * 32), deg10 * 10), 1)
def test_nrm(self): q1,q2,q3 = quat(1,0,0,0),quat(1,1,1,0),quat(0,2,5,11) self.assertEqual(dpr.isnear(q1.cp().nrm().mag(),1),1) self.assertEqual(dpr.isnear(q2.cp().nrm().mag(),1),1) self.assertEqual(dpr.isnear(q3.cp().nrm().mag(),1),1) self.assertTrue(q1.cp().nrm().mag() == q1.mag()) self.assertTrue(q1.nrm() is q1) self.assertFalse(q2.cp().nrm().mag() == q2.mag()) self.assertTrue(q2.nrm() is q2) self.assertFalse(q3.cp().nrm().mag() == q3.mag()) self.assertTrue(q3.nrm() is q3)
def test_dot(self): v1,v2,v3,v4 = vec3(1,1,0),vec3(-1,1,0),vec3(-1,0,0),vec3(1,1,1) self.assertEqual(dpr.isnear(v1.dot(v1), 2),1) self.assertEqual(dpr.isnear(v1.dot(v2), 0),1) self.assertEqual(dpr.isnear(v1.dot(v3),-1),1) self.assertEqual(dpr.isnear(v1.dot(v4), 2),1) self.assertEqual(dpr.isnear(v2.dot(v2), 2),1) self.assertEqual(dpr.isnear(v2.dot(v3), 1),1) self.assertEqual(dpr.isnear(v2.dot(v4), 0),1) self.assertEqual(dpr.isnear(v3.dot(v3), 1),1) self.assertEqual(dpr.isnear(v3.dot(v4),-1),1) self.assertEqual(dpr.isnear(v4.dot(v4), 3),1)
def test_uu(self): u1,u2,u3 = vec3(1,0,0),vec3(0,-1,0),vec3(0,0,1) q1,q2 = quat(0,0,0,0).uu(u1,u2),quat(0,0,0,0).uu(u1,u3) q3,q4 = quat(0,0,0,0).uu(u2,u3),quat(0,0,0,0).uu(u3,u2) self.assertTrue(q1.w > 0.1) self.assertTrue(dpr.isnear(q1.x,0)) self.assertTrue(dpr.isnear(q1.y,0)) self.assertTrue(q1.z < -0.1) self.assertTrue(q2.w > 0.1) self.assertTrue(dpr.isnear(q2.x,0)) self.assertTrue(q2.y < -0.1) self.assertTrue(dpr.isnear(q2.z,0)) self.assertTrue(q3 == q4.cnj())
def test_dot(self): v1, v2, v3, v4 = vec3(1, 1, 0), vec3(-1, 1, 0), vec3(-1, 0, 0), vec3(1, 1, 1) self.assertEqual(dpr.isnear(v1.dot(v1), 2), 1) self.assertEqual(dpr.isnear(v1.dot(v2), 0), 1) self.assertEqual(dpr.isnear(v1.dot(v3), -1), 1) self.assertEqual(dpr.isnear(v1.dot(v4), 2), 1) self.assertEqual(dpr.isnear(v2.dot(v2), 2), 1) self.assertEqual(dpr.isnear(v2.dot(v3), 1), 1) self.assertEqual(dpr.isnear(v2.dot(v4), 0), 1) self.assertEqual(dpr.isnear(v3.dot(v3), 1), 1) self.assertEqual(dpr.isnear(v3.dot(v4), -1), 1) self.assertEqual(dpr.isnear(v4.dot(v4), 3), 1)
def ea(self, u, v, w): up = self.vs[u][1]['p'] vp = self.vs[v][1]['p'] wp = self.vs[w][1]['p'] e1 = vp.tov(up) e2 = vp.tov(wp) etn1 = e1.cp().nrm() etn2 = e2.cp().nrm() para = gtl.isnear(etn1.dot(etn2), 1) apara = gtl.isnear(etn1.dot(etn2), -1) if apara: sa = numpy.pi elif para: sa = 0 else: sa = e1.sang(e2, vec3(0, 0, 1)) if sa < 0: sa = 2 * numpy.pi + sa return sa
def ea(self,u,v,w): up = self.vs[u][1]['p'] vp = self.vs[v][1]['p'] wp = self.vs[w][1]['p'] e1 = vp.tov(up) e2 = vp.tov(wp) etn1 = e1.cp().nrm() etn2 = e2.cp().nrm() para = gtl.isnear(etn1.dot(etn2), 1) apara = gtl.isnear(etn1.dot(etn2),-1) if apara:sa = numpy.pi elif para:sa = 0 else:sa = e1.sang(e2,vec3(0,0,1)) if sa < 0:sa = 2*numpy.pi+sa return sa
def defuv(self,p,n): if n.isnear(vec3(1,0,0)) or n.isnear(vec3(-1,0,0)):u = vec3(p.y,p.z,0) elif n.isnear(vec3(0,1,0)) or n.isnear(vec3(0,-1,0)):u = vec3(p.x,p.z,0) elif n.isnear(vec3(0,0,1)) or n.isnear(vec3(0,0,-1)):u = vec3(p.x,p.y,0) elif gtl.isnear(n.z,0):u = vec3(p.x,p.z,0) else:u = vec3(p.x,p.y,0) return u
def contract(b, ds, epsilon=0.1): if not type(ds) is type([]): dss = ds ds = [1 for x in range(len(b))] else: dss = 1 fbnd = [] pns = [] for x in range(len(b)): p1, p2, p3 = b[x - 2], b[x - 1], b[x] w1t = p1.tov(p2).nrm() w2t = p2.tov(p3).nrm() w1n = vec3(0, 0, 1).crs(w1t).nrm().uscl(ds[x - 2]) w2n = vec3(0, 0, 1).crs(w2t).nrm().uscl(ds[x - 1]) s11 = p1.cp().trn(w1n).trn(w1t.cp().uscl(-10000)) s12 = p2.cp().trn(w1n).trn(w1t.cp().uscl(10000)) s21 = p2.cp().trn(w2n).trn(w2t.cp().uscl(-10000)) s22 = p3.cp().trn(w2n).trn(w2t.cp().uscl(10000)) ip = sintsxyp(s11, s12, s21, s22, ie=False, col=False) #if ip is None: if ip is None or gtl.isnear(abs(w1t.dot(w2t)), 1): pn = p2.cp().trn(w1n) else: pn = ip.cp() pns.append(pn) for x in range(len(b)): p1, p2, p3 = b[x - 2], b[x - 1], b[x] fbnd.append(p2.lerp(pns[x], dss)) #fbnd.append(p2.lerp(pns[x],random.uniform(0.5*ds,ds))) '''# print('amen5') ax = dtl.plot_axes_xy(500) ax = dtl.plot_polygon_xy(fbnd,ax,lw = 2) ax = dtl.plot_point_xy_annotate(p1,ax,'p1') ax = dtl.plot_point_xy(p1,ax) ax = dtl.plot_point_xy_annotate(p2,ax,'p2') ax = dtl.plot_point_xy(p2,ax) ax = dtl.plot_point_xy_annotate(p3,ax,'p3') ax = dtl.plot_point_xy(p3,ax) plt.show() print('amen6') '''# fbnd.append(fbnd.pop(0)) '''# print('amen3') ax = dtl.plot_axes_xy(500) ax = dtl.plot_polygon_xy(fbnd,ax,lw = 2) plt.show() print('amen4') '''# #if len(fbnd) > 3:fbnd = pinchb(fbnd,epsilon) return fbnd
def test_pring(self): p,r,n = vec3(0,0,0),4,8 ps = p.pring(r,n) pm = ps[0].mid(ps[1]) alpha = numpy.pi*(2.0/n) self.assertTrue(len(ps) == n) self.assertTrue(p.d(ps[0].mid(ps[1])) == r) self.assertTrue(dpr.isnear(ps[0].d(ps[1]),2*r*numpy.tan(alpha/2.0)))
def contract(b,ds,epsilon = 0.1): if not type(ds) is type([]): dss = ds ds = [1 for x in range(len(b))] else:dss = 1 fbnd = [] pns = [] for x in range(len(b)): p1,p2,p3 = b[x-2],b[x-1],b[x] w1t = p1.tov(p2).nrm() w2t = p2.tov(p3).nrm() w1n = vec3(0,0,1).crs(w1t).nrm().uscl(ds[x-2]) w2n = vec3(0,0,1).crs(w2t).nrm().uscl(ds[x-1]) s11 = p1.cp().trn(w1n).trn(w1t.cp().uscl(-10000)) s12 = p2.cp().trn(w1n).trn(w1t.cp().uscl( 10000)) s21 = p2.cp().trn(w2n).trn(w2t.cp().uscl(-10000)) s22 = p3.cp().trn(w2n).trn(w2t.cp().uscl( 10000)) ip = sintsxyp(s11,s12,s21,s22,ie = False,col = False) #if ip is None: if ip is None or gtl.isnear(abs(w1t.dot(w2t)),1): pn = p2.cp().trn(w1n) else:pn = ip.cp() pns.append(pn) for x in range(len(b)): p1,p2,p3 = b[x-2],b[x-1],b[x] fbnd.append(p2.lerp(pns[x],dss)) #fbnd.append(p2.lerp(pns[x],random.uniform(0.5*ds,ds))) '''# print('amen5') ax = dtl.plot_axes_xy(500) ax = dtl.plot_polygon_xy(fbnd,ax,lw = 2) ax = dtl.plot_point_xy_annotate(p1,ax,'p1') ax = dtl.plot_point_xy(p1,ax) ax = dtl.plot_point_xy_annotate(p2,ax,'p2') ax = dtl.plot_point_xy(p2,ax) ax = dtl.plot_point_xy_annotate(p3,ax,'p3') ax = dtl.plot_point_xy(p3,ax) plt.show() print('amen6') '''# fbnd.append(fbnd.pop(0)) '''# print('amen3') ax = dtl.plot_axes_xy(500) ax = dtl.plot_polygon_xy(fbnd,ax,lw = 2) plt.show() print('amen4') '''# #if len(fbnd) > 3:fbnd = pinchb(fbnd,epsilon) return fbnd
def test_pring(self): p, r, n = vec3(0, 0, 0), 4, 8 ps = p.pring(r, n) pm = ps[0].mid(ps[1]) alpha = numpy.pi * (2.0 / n) self.assertTrue(len(ps) == n) self.assertTrue(p.d(ps[0].mid(ps[1])) == r) self.assertTrue( dpr.isnear(ps[0].d(ps[1]), 2 * r * numpy.tan(alpha / 2.0)))
def test_dxy(self): v1,v2,v3,v4 = vec3(1,1,0),vec3(1,1,2),vec3(1,2,1),vec3(1,2,4) self.assertTrue(dpr.isnear(v1.dxy(v1),0)) self.assertTrue(dpr.isnear(v1.dxy(v2),0)) self.assertTrue(dpr.isnear(v1.dxy(v3),1)) self.assertTrue(dpr.isnear(v1.dxy(v4),1)) self.assertTrue(dpr.isnear(v2.dxy(v3),1)) self.assertTrue(dpr.isnear(v2.dxy(v4),1)) self.assertTrue(dpr.isnear(v3.dxy(v4),0))
def test_angxy(self): v1,v2,v3,v4 = vec3(1,1,2),vec3(-1,1,-1),vec3(-1,0,0),vec3(1,1,1) self.assertTrue(dpr.isnear(v1.angxy(v1),0)) self.assertTrue(dpr.isnear(v1.angxy(v2),dpr.PI2)) self.assertTrue(dpr.isnear(v2.angxy(v1),dpr.PI2)) self.assertTrue(dpr.isnear(v1.angxy(v3),3*dpr.PI4)) self.assertTrue(dpr.isnear(v3.angxy(v1),3*dpr.PI4)) self.assertTrue(dpr.isnear(v1.angxy(v4),0)) self.assertTrue(dpr.isnear(v4.angxy(v1),0))
def bnrm(b): pcnt = len(b) pn = vec3(0, 0, 0) for px in range(pcnt): c1, c2, c3 = b[px - 2], b[px - 1], b[px] c1c2 = c1.tov(c2) c2c3 = c2.tov(c3) #if gtl.isnear(c2c3.mag(),0) or gtl.isnear(c1c2.mag(),0): if c2c3.mag() == 0 or c1c2.mag() == 0: print('bnrm adjacency error!!', c1c2, c2c3) #ax = dtl.plot_axes_xy(200) #ax = dtl.plot_polygon_xy(b,ax,lw = 2,col = 'g') #ax = dtl.plot_points_xy(b,ax,number = True) #plt.show() raise ValueError cang = c1c2.ang(c2c3) if not gtl.isnear(cang, 0) and not gtl.isnear(cang, gtl.PI): if cang > -numpy.pi + 0.001 and cang < numpy.pi - 0.001: pn.trn(c1c2.crs(c2c3).nrm()) return pn.nrm()
def bnrm(b): pcnt = len(b) pn = vec3(0,0,0) for px in range(pcnt): c1,c2,c3 = b[px-2],b[px-1],b[px] c1c2 = c1.tov(c2) c2c3 = c2.tov(c3) #if gtl.isnear(c2c3.mag(),0) or gtl.isnear(c1c2.mag(),0): if c2c3.mag() == 0 or c1c2.mag() == 0: print('bnrm adjacency error!!',c1c2,c2c3) #ax = dtl.plot_axes_xy(200) #ax = dtl.plot_polygon_xy(b,ax,lw = 2,col = 'g') #ax = dtl.plot_points_xy(b,ax,number = True) #plt.show() raise ValueError cang = c1c2.ang(c2c3) if not gtl.isnear(cang,0) and not gtl.isnear(cang,gtl.PI): if cang > -numpy.pi+0.001 and cang < numpy.pi-0.001: pn.trn(c1c2.crs(c2c3).nrm()) return pn.nrm()
def test_dxy(self): v1, v2, v3, v4 = vec3(1, 1, 0), vec3(1, 1, 2), vec3(1, 2, 1), vec3(1, 2, 4) self.assertTrue(dpr.isnear(v1.dxy(v1), 0)) self.assertTrue(dpr.isnear(v1.dxy(v2), 0)) self.assertTrue(dpr.isnear(v1.dxy(v3), 1)) self.assertTrue(dpr.isnear(v1.dxy(v4), 1)) self.assertTrue(dpr.isnear(v2.dxy(v3), 1)) self.assertTrue(dpr.isnear(v2.dxy(v4), 1)) self.assertTrue(dpr.isnear(v3.dxy(v4), 0))
def test_ang(self): v1,v2,v3,v4 = vec3(1,1,0),vec3(-1,1,0),vec3(-1,0,0),vec3(1,1,1) self.assertTrue(dpr.isnear(v1.ang(v1),0)) self.assertTrue(dpr.isnear(v1.ang(v2),dpr.PI2)) self.assertTrue(dpr.isnear(v2.ang(v1),dpr.PI2)) self.assertTrue(dpr.isnear(v1.ang(v3),3*dpr.PI4)) self.assertTrue(dpr.isnear(v3.ang(v1),3*dpr.PI4)) self.assertTrue(dpr.isnear(v1.ang(v4),numpy.arctan(1.0/math.sqrt(2)))) self.assertTrue(dpr.isnear(v4.ang(v1),numpy.arctan(1.0/math.sqrt(2)))) v1.ang(vec3(0,0,0))
def test_angxy(self): v1, v2, v3, v4 = vec3(1, 1, 2), vec3(-1, 1, -1), vec3(-1, 0, 0), vec3(1, 1, 1) self.assertTrue(dpr.isnear(v1.angxy(v1), 0)) self.assertTrue(dpr.isnear(v1.angxy(v2), dpr.PI2)) self.assertTrue(dpr.isnear(v2.angxy(v1), dpr.PI2)) self.assertTrue(dpr.isnear(v1.angxy(v3), 3 * dpr.PI4)) self.assertTrue(dpr.isnear(v3.angxy(v1), 3 * dpr.PI4)) self.assertTrue(dpr.isnear(v1.angxy(v4), 0)) self.assertTrue(dpr.isnear(v4.angxy(v1), 0))
def test_ang(self): v1, v2, v3, v4 = vec3(1, 1, 0), vec3(-1, 1, 0), vec3(-1, 0, 0), vec3(1, 1, 1) self.assertTrue(dpr.isnear(v1.ang(v1), 0)) self.assertTrue(dpr.isnear(v1.ang(v2), dpr.PI2)) self.assertTrue(dpr.isnear(v2.ang(v1), dpr.PI2)) self.assertTrue(dpr.isnear(v1.ang(v3), 3 * dpr.PI4)) self.assertTrue(dpr.isnear(v3.ang(v1), 3 * dpr.PI4)) self.assertTrue( dpr.isnear(v1.ang(v4), numpy.arctan(1.0 / math.sqrt(2)))) self.assertTrue( dpr.isnear(v4.ang(v1), numpy.arctan(1.0 / math.sqrt(2)))) v1.ang(vec3(0, 0, 0))
def test_av(self): a = 3*dpr.PI4 u1,u2,u3 = vec3(1,0,0),vec3(0,-1,0),vec3(0,0,1) q1,q2 = quat(0,0,0,0).av(a,u1),quat(0,0,0,0).av(a,u2) q3,q4 = quat(0,0,0,0).av(-a,u3),quat(0,0,0,0).av(-a,u2) self.assertTrue(q1.w > 0.1) self.assertTrue(q1.x > 0.1) self.assertTrue(dpr.isnear(q1.y,0)) self.assertTrue(dpr.isnear(q1.z,0)) self.assertTrue(q2.w > 0.1) self.assertTrue(dpr.isnear(q2.x,0)) self.assertTrue(q2.y < -0.1) self.assertTrue(dpr.isnear(q2.z,0)) self.assertTrue(q3.w > 0.1) self.assertTrue(dpr.isnear(q3.x,0)) self.assertTrue(dpr.isnear(q3.y,0)) self.assertTrue(q3.z < -0.1) self.assertFalse(q2 == q4.cp().flp()) self.assertTrue(q2 == q4.cnj())
def test_deg(self): self.assertEqual(gtl.isnear(gtl.deg(gtl.PI),180),1)
def test_mag(self): v1, v2, v3 = vec3(1, 0, 0), vec3(1, 1, 1), vec3(2, 5, 11) self.assertEqual(dpr.isnear(v1.mag(), 1), 1) self.assertEqual(dpr.isnear(v2.mag(), math.sqrt(3)), 1) self.assertEqual(dpr.isnear(v3.mag(), math.sqrt(150)), 1)
def comp(self, op, one, res, *args, **kwargs): cp = one.cp() opres = one.__getattribute__(op)(*args, **kwargs) self.assertTrue(dpr.isnear(opres, res)) self.assertEqual(one, cp)
def comp(self,op,one,res,*args,**kwargs): cp = one.cp() opres = one.__getattribute__(op)(*args,**kwargs) self.assertTrue(dpr.isnear(opres,res)) self.assertEqual(one,cp)
def test_mag(self): v1,v2,v3 = vec3(1,0,0),vec3(1,1,1),vec3(2,5,11) self.assertEqual(dpr.isnear(v1.mag(),1),1) self.assertEqual(dpr.isnear(v2.mag(),math.sqrt(3)),1) self.assertEqual(dpr.isnear(v3.mag(),math.sqrt(150)),1)
def test_mag2(self): v1,v2,v3 = vec3(1,0,0),vec3(1,1,1),vec3(2,5,11) self.assertEqual(dpr.isnear(v1.mag2(),1),1) self.assertEqual(dpr.isnear(v2.mag2(),3),1) self.assertEqual(dpr.isnear(v3.mag2(),150),1)
def test_mag2(self): v1, v2, v3 = vec3(1, 0, 0), vec3(1, 1, 1), vec3(2, 5, 11) self.assertEqual(dpr.isnear(v1.mag2(), 1), 1) self.assertEqual(dpr.isnear(v2.mag2(), 3), 1) self.assertEqual(dpr.isnear(v3.mag2(), 150), 1)
def test_deg(self): self.assertEqual(gtl.isnear(gtl.deg(gtl.PI), 180), 1)
def test_adist(self): deg10 = gtl.rad(10) self.assertEqual(gtl.isnear(gtl.adist(deg10*2,deg10*6),deg10*4),1) self.assertEqual(gtl.isnear(gtl.adist(deg10*6,deg10*2),deg10*4),1) self.assertEqual(gtl.isnear(gtl.adist(deg10*6,deg10*22),deg10*16),1) self.assertEqual(gtl.isnear(gtl.adist(deg10*6,deg10*32),deg10*10),1)
def test_mag2(self): q1,q2,q3 = quat(1,0,0,0),quat(1,1,1,0),quat(0,2,5,11) self.assertEqual(dpr.isnear(q1.mag2(),1),1) self.assertEqual(dpr.isnear(q2.mag2(),3),1) self.assertEqual(dpr.isnear(q3.mag2(),150),1)
def test_rad(self): self.assertEqual(gtl.isnear(gtl.rad(180),gtl.PI),1)
def test_mag(self): q1,q2,q3 = quat(1,0,0,0),quat(1,1,1,0),quat(0,2,5,11) self.assertEqual(dpr.isnear(q1.mag(),1),1) self.assertEqual(dpr.isnear(q2.mag(),math.sqrt(3)),1) self.assertEqual(dpr.isnear(q3.mag(),math.sqrt(150)),1)
def test_near(self): self.assertEqual(gtl.near(0.0001,0),0) self.assertEqual(gtl.isnear(gtl.near(0.1,0),0.1),1)
def test_near(self): self.assertEqual(gtl.near(0.0001, 0), 0) self.assertEqual(gtl.isnear(gtl.near(0.1, 0), 0.1), 1)
def test_rad(self): self.assertEqual(gtl.isnear(gtl.rad(180), gtl.PI), 1)