import matplotlib.pyplot as plt
# x 값을 직접 생성하는 함수 (numpy 없이)
def generate_x(start, end, step):
data = []
v = start
while v <= end:
data.append(v)
v += step
return data
# 포물선 y = x^2
x = generate_x(-2, 2, 0.01)
y = [v**2 for v in x]
# 여러 광선을 시작할 x 좌표
ray_starts = [-1.5, -1.0, -0.5, 0.5, 1.0, 1.5]
plt.figure(figsize=(6,6))
# 포물선 그리기
plt.plot(x, y)
for xs in ray_starts:
# 포물선과 만나는 점 (px, py)
px = xs
py = px**2
# 포물선의 접선 기울기 m = 2x
m_tan = 2 * px
# 반사된 광선 기울기 (단순 반사용)
m_ref = -m_tan
# 들어오는 광선: y = 1에서 포물선으로 내려오는 선
plt.plot([xs, px], [1, py])
# 반사된 광선을 직접 생성 (x축 방향으로 1만큼)
rx = generate_x(px, px + 1, 0.02)
ry = [py + m_ref * (r - px) for r in rx]
plt.plot(rx, ry)
plt.xlim(-2, 2)
plt.ylim(-0.2, 2)
plt.xlabel("x")
plt.ylabel("y")
plt.title("포물선 반사 시뮬레이션")
plt.show()
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAoKIyB4IOqwkuydhCDsp4HsoJEg7IOd7ISx7ZWY64qUIO2VqOyImCAobnVtcHkg7JeG7J20KQpkZWYgZ2VuZXJhdGVfeChzdGFydCwgZW5kLCBzdGVwKToKICAgIGRhdGEgPSBbXQogICAgdiA9IHN0YXJ0CiAgICB3aGlsZSB2IDw9IGVuZDoKICAgICAgICBkYXRhLmFwcGVuZCh2KQogICAgICAgIHYgKz0gc3RlcAogICAgcmV0dXJuIGRhdGEKCiMg7Y+s66y87ISgIHkgPSB4XjIKeCA9IGdlbmVyYXRlX3goLTIsIDIsIDAuMDEpCnkgPSBbdioqMiBmb3IgdiBpbiB4XQoKIyDsl6zrn6wg6rSR7ISg7J2EIOyLnOyeke2VoCB4IOyijO2RnApyYXlfc3RhcnRzID0gWy0xLjUsIC0xLjAsIC0wLjUsIDAuNSwgMS4wLCAxLjVdCgpwbHQuZmlndXJlKGZpZ3NpemU9KDYsNikpCgojIO2PrOusvOyEoCDqt7jrpqzquLAKcGx0LnBsb3QoeCwgeSkKCmZvciB4cyBpbiByYXlfc3RhcnRzOgogICAgIyDtj6zrrLzshKDqs7wg66eM64KY64qUIOygkCAocHgsIHB5KQogICAgcHggPSB4cwogICAgcHkgPSBweCoqMgoKICAgICMg7Y+s66y87ISg7J2YIOygkeyEoCDquLDsmrjquLAgbSA9IDJ4CiAgICBtX3RhbiA9IDIgKiBweAoKICAgICMg67CY7IKs65CcIOq0keyEoCDquLDsmrjquLAgKOuLqOyInCDrsJjsgqzsmqkpCiAgICBtX3JlZiA9IC1tX3RhbgoKICAgICMg65Ok7Ja07Jik64qUIOq0keyEoDogeSA9IDHsl5DshJwg7Y+s66y87ISg7Jy866GcIOuCtOugpOyYpOuKlCDshKAKICAgIHBsdC5wbG90KFt4cywgcHhdLCBbMSwgcHldKQoKICAgICMg67CY7IKs65CcIOq0keyEoOydhCDsp4HsoJEg7IOd7ISxICh47LaVIOuwqe2WpeycvOuhnCAx66eM7YG8KQogICAgcnggPSBnZW5lcmF0ZV94KHB4LCBweCArIDEsIDAuMDIpCiAgICByeSA9IFtweSArIG1fcmVmICogKHIgLSBweCkgZm9yIHIgaW4gcnhdCgogICAgcGx0LnBsb3QocngsIHJ5KQoKcGx0LnhsaW0oLTIsIDIpCnBsdC55bGltKC0wLjIsIDIpCnBsdC54bGFiZWwoIngiKQpwbHQueWxhYmVsKCJ5IikKcGx0LnRpdGxlKCLtj6zrrLzshKAg67CY7IKsIOyLnOuurOugiOydtOyFmCIpCnBsdC5zaG93KCkK