[民间数据练习场] THUSC 2021 Day2 光线追踪渲染

2022-05-25 19:00:00 ~ 2038-01-19 11:14:07

邀请码:reo5

这是 THUSC2021 Day2《光线追踪渲染》的工程题组,由 tiger2005 和 yzhang 合作完成并构造民间数据。

个人题解。

提示:你可以将题目链接中 ?contestId=70408 删掉,前往与比赛无关的题目界面提交,此时你可以看到 diff 的数值。

你可以在第一题的题面中下载到这道题所需要的所有文件。其中包含:

由于考试的时候统一使用 NOI Linux 系统,因此这道题目在 Windows 等系统下编译运行会稍微不友好。在这里给出编译方式:

  1. 找到你需要运行的 .sh 文件,编辑并选择第四行。sh 文件示例如下,你需要选择的就是 g++ 开头的编译指令。
#!/bin/sh
set -v
rm -f ./accelerate
g++ -o accelerate LightMeshAccelerate.cpp LightBitmap.cpp LightTriangleIntersection.cpp LightPathTrace.cpp accelerate.cpp liblight.a -O3 -std=c++11 -pthread -I include
echo Accelerate Compilation Finished!
  1. 打开命令行,确保可以直接在命令行运行 g++。如果不行,请将电脑上 g++.exe 所在的文件夹加入到环境变量中。同时,请保证版本不要太旧,否则会编译失败。
  2. 将命令中 liblight.a 修改为 ./src/*,同时保证 src 文件夹中只有 cpp 文件。
  3. 把这个指令 复制出来,在工程文件夹下运行指令,就可以得到所需的可执行程序。

对于第一题而言,请使用:

g++ -o bitmap LightBitmap.cpp bitmap.cpp ./src/* LightTriangleIntersection.cpp -O3 -std=c++11 -pthread -I include

图片比较使用矢量夹角的形式,所以可能会导致结果超出预想。如果你觉得你的答案是正确的但是差异过高,或者图片是错的但是给对了,请联系 tiger2005 更换 SPJ 实现。

目前的 SPJ 实现:

#include "testlib.h"

using namespace std;
int main(int argc, char** argv){
    registerTestlibCmd(argc, argv);
    int W = ans.readInt();
    int H = ans.readInt();
    int w = ouf.readInt();
    if(w != W)
        quitf(_wa, "Photo width doesn't match!");
    int h = ouf.readInt();
    if(h != H)
        quitf(_wa, "Photo height doesn't match!");
    double lenX = 0, lenY = 0, Dot = 0;
    for(int i = 0; i < W * H; i ++){
        vector<int> cols(3), ocol(3);
        for(int j = 0; j < 3; j ++){
            cols[j] = ans.readInt();
            int a = ouf.readInt(0, 255, "COLOR");
            ocol[j] = a;
            lenX += cols[j] * cols[j];
            lenY += ocol[j] * ocol[j];
            Dot += cols[j] * ocol[j];
        }
    }
    double diff = 0;
    if(lenY == 0)
        diff = 0;
    else
        diff = Dot / sqrt(lenX) / sqrt(lenY);
    diff = max(0.0, min(diff, 1.0));
    diff = acos(diff) / acos(-1.0) * 2;
    if(diff > 0.03)
        quitf(_wa, "diff = %lf", diff);
    quitf(_ok, "diff = %lf", diff);
}

实际上这个限制已经相当宽松了,但是还是希望大家可以朝着 0.01 的方向迈进。