一个方向的平行光,射向二维平面椭圆后随机反射,仅统计一定角度上的反射结果并画出散点图
时间: 2024-03-01 14:50:41 浏览: 136
好的,以下是一个基于Python的程序,用于模拟一个方向的平行光射向二维平面椭圆后随机反射,并统计一定角度上的反射结果并画出散点图:
```
import numpy as np
import matplotlib.pyplot as plt
# 定义反射函数
def reflect(in_vec, norm_vec):
return in_vec - 2 * np.dot(in_vec, norm_vec) * norm_vec
# 定义入射光线方向向量
inc_vec = np.array([1, 0])
# 定义椭圆长轴和短轴长度
a = 5
b = 3
# 定义椭圆中心点
center = np.array([0, 0])
# 对椭圆进行采样,计算反射光线
sample_num = 1000
scatter_x = []
scatter_y = []
for i in range(sample_num):
x = -a + 2*a/sample_num*i
y = -b + 2*b/sample_num*i
if (x/a)**2 + (y/b)**2 <= 1:
norm_vec = np.array([x/a**2, y/b**2])
out_vec = reflect(inc_vec, norm_vec)
if np.abs(out_vec[1]) <= np.tan(np.pi/6): # 只统计一定角度的反射光线
scatter_x.append(out_vec[0])
scatter_y.append(out_vec[1])
# 绘制散点图
fig, ax = plt.subplots()
ax.scatter(scatter_x, scatter_y)
ax.axhline(y=np.tan(np.pi/6), color='r', linestyle='--')
ax.axhline(y=-np.tan(np.pi/6), color='r', linestyle='--')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
```
上述程序中,我们首先定义了一个反射函数 `reflect`,用于计算入射光线经过一个法向量的反射光线方向。然后定义了一个入射光线方向向量 `inc_vec`,这里我们默认入射光线方向为 x 轴正方向。然后定义了椭圆长轴和短轴长度和中心点。接着通过采样的方式对椭圆进行采样,计算反射光线,只统计一定角度反射光线的光线输出,并将其保存到散点图中。在散点图中,我们通过添加两条水平线来限制一定角度的反射光线。
阅读全文