1921. RayTracing

时间限制 6000 ms   内存限制 256 MB

最近小H在做一款名为"球"的游戏,这是一款3D游戏,球体是该游戏中唯一存在的几何体,该游戏中存在两种材质的球体,漫反射球折射球,同时每一个球体都会有自己的颜色. 现在这个游戏是不完善的,小H还没有实现该游戏的显示系统,因此现在他需要你的帮助。

你在游戏空间的位置 $\vec{o}=(0,0,0)$ 处,给定方向 $\vec{d}=(x,y,-1)$,你需要计算你在沿这个方向上所看到的颜色(注:颜色为一个三元组 $(R,G,B)$)。

计算方法如下:

  1. 如果沿射线 $\vec{o}+ t \cdot \vec{d}$ 方向不存在物体,那么你所观察到的颜色即为背景颜色;
  2. 如果沿射线 $\vec{o}+ t \cdot \vec{d}$ 方向会首先碰到漫反射球,那么你观察到的颜色即为漫反射球的颜色;
  3. 如果沿射线 $\vec{o}+ t \cdot \vec{d}$ 方向会首先碰到折射球, 定义 入射光线球面与入射光线交点处法向量 夹角为 $\theta$, 球体本身的颜色为 $c$, 沿反射光线观察到的颜色为 $c'$, 那么观察到颜色为 $c\cdot cos(\theta)+c'\cdot(1-cos(\theta))$。

输入数据

第一行两个正整数$n, m\ (1 \le n \le 10, 1 \le m \le 255 \times 255)$,表示空间内球体的数量以及观测次数。

第二行输入三个浮点数 $R, G, B(0 \le R,G,B \le 1.0)$ 表示背景颜色。

接下来 $n$ 行,每行输入
$x,y,z\ (-10 \le x,y \le 10, -10 \le z \le -30), r\ (1.0 \le r \le 3.0), t\ (t \in \{1, 2\}), R,G,B\ (0 \le R,G,B \le 1.0)$

$x,y,z,r$ 是浮点数,表示球心坐标以及球体的半径。
若 $t=1$ 表示该球体为漫反射球,否则为折射球
$R,G,B$ 为浮点数,表示球体的颜色。

接下来 $m$ 行,每行输入两个浮点数 $x,y$,
表示观测方向为 $\vec{d}=(x, y,-1)$。

保证任意两球体之间距离大于等于 $1.0$, 光线反射次数不会很多

输出数据

输出 $m$ 行,每行输出三个整数 $R,G,B$,代表每次观测的结果(请使用以下代码将颜色从浮点数转化为值域从0~255的整数)。

颜色转换(C/C++):

double clamp(double lo, double hi, double v) {
    return v < lo ? lo : (v > hi ? hi : v);
}

color_int = (int)(255 * clamp(0, 1, color_double));

颜色转换(Java):

static double clamp(double lo, double hi, double v) {
    return Math.max(lo, Math.min(v, hi));
}

color_int = (int)(255 * clamp(0, 1, color_double));

颜色转换 (Python):

def clamp(lo, hi, v):
    return max(lo, min(v, hi))

color_int = int(255 * clamp(0, 1, color_double))

样例输入

复制
2 10
0.235294 0.67451 0.843137
0.757812 0.521484 -16.0156 2.34766 2 0.931641 0.945312 0.776367
0.201172 -0.373047 -24.8047 1.61719 1 0.307617 0.161133 0.224609
0 0.0393701
0 0.0314961
0 0.023622
0 0.015748
0 0.00787402
0 0
0 -0.00787402
0 -0.015748
0 -0.023622
0 -0.0314961 ·  \n
        ·       ·        \n
        ·        ·        ·       · ·        ·        ·        \n
        ·         ·        ·       · ·        ·        ·        \n
 ·         \n
 ·         \n
 ·        \n
 ·        \n
 ·          \n
 · \n
 ·           \n
 ·         \n
 ·         \n
 ·          \n

样例输出

复制
227 237 198
228 237 198
227 237 198
226 236 199
225 236 199
223 235 199
220 234 199
217 233 199
213 231 200
209 229 200   ·   ·   \n
   ·   ·   \n
   ·   ·   \n
   ·   ·   \n
   ·   ·   \n
   ·   ·   \n
   ·   ·   \n
   ·   ·   \n
   ·   ·   \n
   ·   ·   \n

提交

请先 登录

© 2024 FAQs Contact About