In [5]:
import sys,os
import numpy as np
import math as m
import matplotlib as mpl
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import matplotlib.colors as colors
#this works apparently only for savefig stuff
mpl.rcParams['figure.figsize']=(16.0,8.0) #(6.0,4.0)
mpl.rcParams['font.size']=12 #10
mpl.rcParams['savefig.dpi']=100 #72
mpl.rcParams['figure.subplot.bottom']=.1 #.125
mpl.rcParams['legend.numpoints'] = 1
plt.rc('font', family='serif')
plt.rc('text', usetex=True)
#inline Shit
%matplotlib inline
%config InlineBackend.figure_format='svg'
%config InlineBackend.rc = {'figure.facecolor': 'white', 'figure.subplot.bottom': 0.125, 'figure.edgecolor': 'white', 'savefig.dpi': 300, 'figure.figsize': (12.0, 8.0), 'font.size': 10}
#GUi shit
%matplotlib tk
mpl.get_configdir()
Out[5]:
In [245]:
import numpy as np
from fractions import Fraction
def create_pi_labels(a, b, step):
max_denominator = int(1/step)
# i added this line and the .limit_denominator to solve an
# issue with floating point precision
# because of floataing point precision Fraction(1/3) would be
# Fraction(6004799503160661, 18014398509481984)
values = np.arange(a, b+step/10, step)
fracs = [Fraction(x).limit_denominator(max_denominator) for x in values]
ticks = values*np.pi
labels = []
for frac in fracs:
if frac.numerator==0:
labels.append(r"$0$")
elif frac.numerator<0:
if frac.denominator==1 and abs(frac.numerator)==1:
labels.append(r"$-\pi$")
elif frac.denominator==1:
labels.append(r"$-{}\pi$".format(abs(frac.numerator)))
else:
labels.append(r"$-\frac{{{}}}{{{}}} \pi$".format(abs(frac.numerator), frac.denominator))
else:
if frac.denominator==1 and frac.numerator==1:
labels.append(r"$\pi$")
elif frac.denominator==1:
labels.append(r"${}\pi$".format(frac.numerator))
else:
labels.append(r"$\frac{{{}}}{{{}}} \pi$".format(frac.numerator, frac.denominator))
return ticks, labels
#Test of Angle functions
def clampToPi(angle):
return angle - m.floor(angle/m.pi + 0.5)*m.pi
clampToPiv = np.vectorize(clampToPi);
def clampTo2Pi(angle):
k = m.trunc(angle/(2*m.pi));
rest = angle - 2*k*m.pi
return rest
clampTo2Piv = np.vectorize(clampTo2Pi);
def relativeAngle(a1,a2):
return clampToPi(a2-a1);
def leftRight(angle):
k=m.floor(angle/m.pi)
if(k%2==0):
return 1 # left
else:
return 0 # right
leftRightv = np.vectorize(leftRight);
def leftColinear(angle):
k=m.floor(angle/m.pi)
r = angle - k*m.pi;
if(k%2==0 and r>=0.0):
return 1 # left
else:
if(r==0.0):
return 1
return 0 # right
leftColinearv = np.vectorize(leftColinear);
def colinear(angle):
k=m.floor(angle/m.pi)
r = angle - k*m.pi;
if(abs(r)<=1e-3):
return 1;
return 0;
colinearv = np.vectorize(colinear);
def toDeg(a):
return a / m.pi*180;
toDegv = np.vectorize(toDeg);
In [243]:
clampToPi(0.4 + 10*2*m.pi - 0.6)
Out[243]:
In [266]:
relativeAngle( m.pi-0.5 , 0.0 )
Out[266]:
In [228]:
anglesRad = np.linspace(-m.pi*3,m.pi*3,1000);
anglesDeg = toDegv(anglesRad)
In [262]:
def relAngleTest(t):
a = m.pi-0.001;
return relativeAngle( a + t, 0.0 + t)
relAngleTestv = np.vectorize(relAngleTest);
In [267]:
y =clampToPiv(anglesRad);
plt.plot(anglesDeg,toDegv(y),'.')
y =relAngleTestv(anglesRad);
plt.plot(anglesDeg,toDegv(y),'.')
# y=leftColinearv(anglesRad)
# plt.plot(anglesDeg,toDegv(y),'o')
# y=leftRightv(anglesRad)
# plt.plot(anglesDeg,toDegv(y),'.')
# plt.grid(True)
# plt.figure()
# y = clampTo2Piv(anglesRad);
# plt.plot(anglesDeg,toDegv(y),'.')
# plt.grid(True)
Out[267]:
In [71]:
print(leftColinear(m.pi) == 1, leftColinear(9*m.pi) == 1, leftColinear(0) == 1)
print(leftColinear(-m.pi) == 1, leftColinear(-10*m.pi) == 1, leftColinear(0) == 1)
print(colinear(m.pi)==1,colinear(2*m.pi)==1,colinear(3*m.pi)==1,
colinear(-m.pi)==1,colinear(-2*m.pi)==1,colinear(-3*m.pi)==1)
In [239]:
m.trunc(-1.2)
Out[239]:
In [161]:
def intersectLines(p1,ang1,p2,ang2):
a = np.array([m.cos(ang1),m.sin(ang1)]);
b = np.array([m.cos(ang2),m.sin(ang2)]);
p = p1 - p2;
nom = p[0]*b[1]-p[1]*b[0];
det = a[1]*b[0]-a[0]*b[1];
if(det == 0.0):
if(abs(nom) < 1e-8 ): # if
return p1;
t = float('Inf')
else:
t = nom / (det)
return t*a + p1;
def intersectLines2(p1,ang1,p2,ang2):
c1 = colinear(ang1-m.pi/2);
c2 = colinear(ang2-m.pi/2);
a = m.tan(ang1);
c = m.tan(ang2);
b = p1[1] - a*p1[0];
d = p2[1] - c*p2[0];
x = 0;
if(c1 and not c2): # first collinear
print("first")
x = p1[0];
y = a*x+b;
elif(c2 and not c1): # second collinear
print("second")
x = p2[0];
y = a*x+b;
elif(c1 and c2): # both collinear
print("both")
if(abs(p1[0] - p2[0])<1e-3):
print("same x")
x = p1[0];
y = a*x+b;
else:
x=float('inf')
y=float('inf')
else: # both not collinear
print("both not collinear")
if(abs(clampTo2Pi(ang1-ang2))<1e-3):
print("angle the same")
angle = m.atan2(p2[1]-p1[1],p2[0]-p1[0]);
if(angle<0.0):
angle += 2*m.pi;
print("angle:",toDeg(angle))
print(toDeg(abs(clampTo2Pi(angle-ang1))))
if( abs(clampTo2Pi(angle-ang1))<1e-3 ):
print("lines the same")
x=p1[0];
y = a*x+b;
else:
x=float('inf')
y=float('inf')
else:
print("normal case")
x=(d-b)/(a-c);
y = a*x+b;
return np.array([x,y])
def plotLine(p1,ang1):
a = np.array([m.cos(ang1),m.sin(ang1)]);
t = np.linspace(-10,10,2);
p=p1
for r in t:
p=np.vstack((p,p1 + r*a));
plt.plot(p[:,0],p[:,1])
In [165]:
p1 = np.array([0,0.1])
ang1 = 0;
p2 = np.array([1,1])
ang2 = m.pi/2;
print(intersectLines(p1,ang1,p2,ang2))
print(intersectLines2(p1,ang1,p2,ang2))
plotLine(p1,ang1);
plotLine(p2,ang2);
plt.grid(True)
In [124]:
colinear(m.pi/2 +10*2*m.pi-m.pi/2)
Out[124]:
In [48]:
10.2 - m.floor(10.2/(2*m.pi))
Out[48]:
In [106]:
m.pi/2+2*m.pi
Out[106]:
In [108]:
m.pi/2 +2*m.pi
Out[108]:
In [156]:
ang = m.pi/2.0 +10.0*2.0*m.pi;
f = (ang-m.pi/2.0)/m.pi;
print(f)
k = m.floor(f)
print(k)
In [ ]: