Guest User

Untitled

a guest
Oct 19th, 2015
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.59 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import math
  4.  
  5. def normal(v):
  6.     n = np.array([8 * v[0], 2 * v[1]])
  7.     return n / np.linalg.norm(n)
  8.  
  9. def plot_normal(v):
  10.     u = v - normal(v)
  11.     plt.plot([u[0], v[0]], [u[1], v[1]])
  12.  
  13. def draw_ellipse():
  14.     plt.figure(figsize=(4,5))
  15.    
  16.     X = np.linspace(-5, 5, 256)
  17.    
  18.     Y = [math.sqrt(100-4*x*x) for x in X]
  19.     plt.plot(X, Y, color="red")
  20.  
  21.     Y = [-y for y in Y]
  22.     plt.plot(X, Y, color="black")
  23.  
  24. def veclen(u):
  25.     return (u[0] * u[0] + u[1] * u[1]) ** 0.5
  26.  
  27. def angle(u, v):
  28.     dot = u[0] * v[1] - u[1] * v[0]
  29.     sin = dot / veclen(u) / veclen(v)
  30.     return math.asin(sin)
  31.  
  32. def rotate_vector(v, angle, origin):
  33.     x, y = v
  34.     x = x - origin[0]
  35.     y = y - origin[1]
  36.     cos_theta = math.cos(angle)
  37.     sin_theta = math.sin(angle)
  38.     nx = x*cos_theta - y*sin_theta
  39.     ny = x*sin_theta + y*cos_theta
  40.     nx = nx + origin[0]
  41.     ny = ny + origin[1]
  42.     return np.array([nx, ny])
  43.  
  44. def solve_quad(a, b, c):
  45.     D = (b * b - 4 * a * c) ** 0.5
  46.     x1 = (-b + D) / (2 * a)
  47.     x2 = (-b - D) / (2 * a)
  48.     return x1 + x2
  49.  
  50. def reflect(p, q):
  51.     alpha = 2*angle(q-p,normal(q))
  52.     p = rotate_vector(p, alpha, q)
  53.     dx, dy = p - q
  54.     x0, y0 = q
  55.  
  56.     a = 4 * dx * dx + dy * dy
  57.     b = 8 * x0 * dx + 2 * y0 * dy
  58.     c = -100 + 4 * x0 * x0 + y0 * y0;
  59.     t = solve_quad(a, b, c)
  60.     p = np.array([x0+dx*t, y0+dy*t])
  61.     return q, p
  62.  
  63. draw_ellipse()
  64. p = np.array([0, 10.1])
  65. q = np.array([1.4, -9.6])
  66. for i in xrange(6):
  67.     plt.plot([p[0], q[0]], [p[1], q[1]])
  68.     p, q = reflect(p, q)
  69. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment