import math
import numpy as np
import matplotlib.pyplot as plt
#from fractions import Fraction
from quantum_computer_math_guide_trigonometric_intro_exercise_answer import *

ans1 =  1/2 # こちらに値を書いてください
print(check_answer_exercise(ans1,"ans1"))

ans2 = 0#　こちらに値を書いてください。
print(check_answer_exercise(ans2,"ans2"))

ans3 = 1#　こちらに値を書いてください。
print(check_answer_exercise(ans3,"ans3"))

ans4 = 1/2 #　こちらに値を書いてください。
print(check_answer_exercise(ans4,"ans4"))

ans5 = 0 #　こちらに値を書いてください。
print(check_answer_exercise(ans5,"ans5"))

ans6 = -1/2 #　こちらに値を書いてください。
print(check_answer_exercise(ans6,"ans6"))

ans7 = -1 #　こちらに値を書いてください。
print(check_answer_exercise(ans7,"ans7"))

ans8 =  -1#　こちらに値を書いてください。
print(check_answer_exercise(ans8,"ans8"))

ans9 =  -1/2#　こちらに値を書いてください。
print(check_answer_exercise(ans9,"ans9"))

ans10 =  0 #　こちらに値を書いてください。
print(check_answer_exercise(ans10,"ans10"))

ans11 =  1 #　こちらに値を書いてください。
print(check_answer_exercise(ans11,"ans11"))

ans12 =  45 #　こちらに値を書いてください（「°」は省略してください。）
print(check_answer_exercise(ans12,"ans12"))

ans13 =  60 #　こちらに値を書いてください（「°」は省略してください。）
print(check_answer_exercise(ans13,"ans13"))

ans14 =  45 #　こちらに値を書いてください（「°」は省略してください。）
print(check_answer_exercise(ans14,"ans14"))

ans15 =  1 #　こちらに値を書いてください
print(check_answer_exercise(ans15,"ans15"))

ans16 =  1 #　こちらに値を書いてください
print(check_answer_exercise(ans16,"ans16"))

ans1_deg = math.sin(math.radians(30)) # こちらに度数法の計算式を書いてください。
ans1_rad = math.sin(np.pi*(1/6)) # こちらに弧度法の計算式を書いてください。 
print("ans1 =", round(ans1,3)," : ans1_deg = ", round(ans1_deg,3)," : ans1_rad = ", round(ans1_rad,3))

ans2_deg = math.cos(math.radians(90)) # 度数法
ans2_rad = math.cos(np.pi*(1/2)) # 弧度法
print("ans2 =", round(ans2,3)," : ans2_deg = ", round(ans2_deg,3)," : ans2_rad = ", round(ans2_rad,3))

ans3_deg = math.tan(math.radians(45)) # 度数法
ans3_rad = math.tan(np.pi*(1/4)) # 弧度法
print("ans3 =", round(ans3,3)," : ans3_deg = ", round(ans3_deg,3)," : ans3_rad = ", round(ans3_rad,3))

ans4_deg = math.cos(math.radians(60)) # 度数法
ans4_rad = math.cos(np.pi*(1/3)) # 弧度法
print("ans4 =", round(ans4,3)," : ans4_deg = ", round(ans4_deg,3)," : ans4_rad = ", round(ans4_rad,3))

ans5_deg = math.sin(math.radians(0)) # 度数法
ans5_rad = math.sin(np.pi*(0)) # 弧度法
print("ans5 =", round(ans5,3)," : ans5_deg = ", round(ans5_deg,3)," : ans5_rad = ", round(ans5_rad,3))

ans6_deg = math.cos(math.radians(120)) # 度数法
ans6_rad = math.cos(np.pi*(2/3)) # 弧度法
print("ans6 =", round(ans6,3)," : ans6_deg = ", round(ans6_deg,3)," : ans6_rad = ", round(ans6_rad,3))

ans7_deg = math.tan(math.radians(135)) # 度数法
ans7_rad = math.tan(np.pi*(3/4)) # 弧度法
print("ans7 =", round(ans7,3)," : ans7_deg = ", round(ans7_deg,3)," : ans7_rad = ", round(ans7_rad,3))

ans8_deg = math.cos(math.radians(180)) # 度数法
ans8_rad = math.cos(np.pi*(1)) # 弧度法
print("ans8 =", round(ans8,3)," : ans8_deg = ", round(ans8_deg,3)," : ans8_rad = ", round(ans8_rad,3))

ans9_deg = math.sin(math.radians(-30)) # 度数法
ans9_rad = math.sin(np.pi*(-1/6)) # 弧度法
print("ans9 =", round(ans9,3)," : ans9_deg = ", round(ans9_deg,3)," : ans9_rad = ", round(ans9_rad,3))

ans10_deg = math.cos(math.radians(-90)) # 度数法
ans10_rad = math.cos(np.pi*(-1/2)) # 弧度法
print("ans10 =", round(ans10,3)," : ans10_deg = ", round(ans10_deg,3)," : ans10_rad = ", round(ans10_rad,3))

ans11_deg = math.sin(math.radians(450)) # 度数法
ans11_rad = math.sin(np.pi*(5/2)) # 弧度法
print("ans11 =", round(ans11,3)," : ans11_deg = ", round(ans11_deg,3)," : ans11_rad = ", round(ans11_rad,3))

ans12_deg = math.degrees(math.asin(1/math.sqrt(2))) # 度数法
print("ans12 =", round(ans12,3)," : ans12_deg = ", round(ans12_deg,3))

ans13_deg = math.degrees(math.acos(1/2)) # 度数法
print("ans13 =", round(ans13,3)," : ans13_deg = ", round(ans13_deg,3))

ans14_deg = math.degrees(math.atan(1)) # 度数法
print("ans14 =", round(ans14,3)," : ans14_deg = ", round(ans14_deg,3))

ans15_deg = math.sin(math.radians(30))**2 + math.cos(math.radians(30))**2 # 度数法
ans15_rad = (math.sin(np.pi*(1/2)))**2+(math.cos(np.pi*(1/2)))**2 # 弧度法
print("ans15 =", round(ans15,3)," : ans15_deg = ", round(ans15_deg,3)," : ans15_rad = ", round(ans15_rad,3))

ans16_deg = math.sin(math.radians(-45))**2 + math.cos(math.radians(-45))**2 # 度数法
ans16_rad = (math.sin(np.pi*(-1/4)))**2+(math.cos(np.pi*(-1/4)))**2 # 弧度法
print("ans16 =", round(ans16,3)," : ans16_deg = ", round(ans16_deg,3)," : ans16_rad = ", round(ans16_rad,3))

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi)
plt.plot(x, np.sin(x), color='b', label='sin')    # color = 'r': red, 'g': green
plt.xlim(-np.pi, np.pi)
plt.ylim(-1.5, 1.5)

plt.axhline(0, ls='-', c='b', lw=0.5)
plt.axvline(0, ls='-', c='b', lw=0.5)

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graphs')

plt.show()

x = np.linspace(-np.pi, np.pi)
plt.plot(x, np.cos(x), color='r', label='cos')

plt.xlim(-np.pi, np.pi)
plt.ylim(-1.5, 1.5)

plt.axhline(0, ls='-', c='b', lw=0.5)
plt.axvline(0, ls='-', c='b', lw=0.5)

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graphs')

plt.show()

x = np.linspace(-np.pi, np.pi)
plt.plot(x, np.sin(x), color='b', label='sin')   
plt.plot(x, np.cos(x), color='r', label='cos')

plt.xlim(-np.pi, np.pi)
plt.ylim(-1.5, 1.5)

plt.axhline(0, ls='-', c='b', lw=0.5)
plt.axvline(0, ls='-', c='b', lw=0.5)

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graphs')

plt.show()

x = np.linspace(-2*np.pi, 2*np.pi)
plt.plot(x, np.tan(x), color='r', label='tan')

plt.xlim(-2*np.pi, 2*np.pi)
plt.ylim(-1.5, 1.5)

plt.axhline(0, ls='-', c='b', lw=0.5)
plt.axvline(0, ls='-', c='b', lw=0.5)

plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Graphs')

plt.show()

class GraphClass:
    # x_start:x軸の最小値
    # x_end:x軸の最大値
    # x_start、x_endは表示する関数のデフォルトの定義域
    # y_start:y軸の最小値
    # y_end:y軸の最大値
    def __init__(self, x_start, x_end, y_start , y_end):
        self.x_start = x_start
        self.x_end = x_end
        self.y_start = y_start
        self.y_end = y_end
        self.x = np.linspace(x_start,x_end)
        self.plt = plt
    
    # オーバーライドする。自分が表示したいグラフを定義する
    def setGraph(self):
        pass
    
    # グラフを表示する
    def displayGraph(self):
        self.setGraph()
        self.__setBasicConfig()
        self.plt.show()
    
    # sinグラフを表示する
    def displaySin(self):
        self.plt.plot(self.x, np.sin(self.x), color='b', label='sin')
        self.__setBasicConfig()
        self.plt.show()
    
    # cosグラフを表示する
    def displayCos(self):
        self.plt.plot(self.x, np.cos(self.x), color='r', label='cos')
        self.__setBasicConfig()
        self.plt.show()
    
    # tanグラフを表示する
    def displayTan(self):
        self.plt.plot(self.x, np.tan(self.x), color='y', label='tan')
        self.__setBasicConfig()
        self.plt.show()
    
    # 基本的な設定
    def __setBasicConfig(self):
        self.plt.xlim(self.x_start, self.x_end)
        self.plt.ylim(self.y_start, self.y_end)
        self.plt.gca().set_aspect('equal', adjustable='box')
        self.plt.axhline(0, ls='-', c='b', lw=0.5)
        self.plt.axvline(0, ls='-', c='b', lw=0.5)
        self.plt.xticks(rotation=45)
        self.plt.legend()
        self.plt.xlabel('x')
        self.plt.ylabel('y')
        self.plt.title('Graphs')


# 自分のクラスを定義する 以下はサンプル

class MyGraphClass(GraphClass):
    def __init__(self, x_start, x_end, y_start , y_end):
        super().__init__(x_start, x_end, y_start , y_end)

    # オーバーライドする
    def setGraph(self):
        #sin
        self.plt.plot(self.x, 2*np.sin(self.x), color='b', label='sin')
        #cos
        self.plt.plot(self.x, np.cos(self.x), color='g', label='cos')
        
        #単位円 デフォルトとは異なる定義域にする。
        r=1
        x = np.linspace(-r, r)
        self.plt.plot(x, np.sqrt(r ** 2 - x ** 2), color='r', label='x^2+y^2')
        self.plt.plot(x, -np.sqrt(r ** 2 - x ** 2), color='r', label='x^2+y^2')
        
        # 点を入れる
        self.plt.plot(np.cos(math.radians(30)), np.sin(math.radians(30)), marker='X', markersize=20) 
        
        #tan
        #self.plt.plot(self.x, np.tan(self.x), color='y', label='tan')
        
        #exp
        #self.plt.plot(self.x, np.exp(self.x), color='m', label='exp')


myGraphClass = MyGraphClass(-1,1,-1,1)
myGraphClass.displayGraph()
#myGraphClass.displaySin()
#myGraphClass.displayCos()
#myGraphClass.displayTan()

