2022-05-25 19:00:00 ~ 2038-01-19 11:14:07
邀请码:reo5。
这是 THUSC2021 Day2《光线追踪渲染》的工程题组,由 tiger2005 和 yzhang 合作完成并构造民间数据。
个人题解。
提示:你可以将题目链接中 ?contestId=70408 删掉,前往与比赛无关的题目界面提交,此时你可以看到 diff 的数值。
你可以在第一题的题面中下载到这道题所需要的所有文件。其中包含:
docs 文件夹:学习资料、函数列表、计算几何知识介绍include 文件夹:工程代码头文件的所在地src 文件夹:工程代码已经实现完毕的函数定义文件夹bitmap_samples 文件夹:第一个问题的样例compile-???.sh:Linux 下可用的编译指令文件Light???.cpp/h:你需要完善的代码文件???.cpp:子任务的类型调用位置Makefile:Linux 下编译所需链接文件的构造方式earth.bmp:第六个问题所需要的贴图converter:Linux 下可用的 image 转 bmp 可执行程序由于考试的时候统一使用 NOI Linux 系统,因此这道题目在 Windows 等系统下编译运行会稍微不友好。在这里给出编译方式:
#!/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!
g++。如果不行,请将电脑上 g++.exe 所在的文件夹加入到环境变量中。同时,请保证版本不要太旧,否则会编译失败。liblight.a 修改为 ./src/*,同时保证 src 文件夹中只有 cpp 文件。对于第一题而言,请使用:
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 的方向迈进。