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]:
'/home/zfmgpu/.config/matplotlib'

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]:
-0.20000000000000284

In [266]:
relativeAngle( m.pi-0.5 , 0.0 )


Out[266]:
0.5

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]:
[<matplotlib.lines.Line2D at 0x7f194a128d68>]

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)


True True True
True True True
True True True True True True

In [239]:
m.trunc(-1.2)


Out[239]:
-1

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)


[ 1.   0.1]
second
[ 1.   0.1]

In [124]:
colinear(m.pi/2 +10*2*m.pi-m.pi/2)


Out[124]:
0

In [48]:
10.2 - m.floor(10.2/(2*m.pi))


Out[48]:
9.2

In [106]:
m.pi/2+2*m.pi


Out[106]:
7.853981633974483

In [108]:
m.pi/2 +2*m.pi


Out[108]:
7.853981633974483

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)


19.999999999999996
19

In [ ]: