36.4 圆柱面Inverse Mapping
36.4.1 数学推导
36.4.2 看C++代码实现
----------------------------------------------quadratic.cpp ------------------------------------------
quadratic.cpp
#include "quadratic.h"
#include <iostream>
using namespace std;
bool quadratic::hit(const ray& r, float t_min, float t_max, hit_record& rec) const {
#if QUADRATIC_LOG == 1
std::cout << "-------------quadratic::hit----------------" << endl;
#endif // QUADRATIC_LOG
float ab_square = intercept_x*intercept_x*intercept_y*intercept_y;
float bc_square = intercept_y*intercept_y*intercept_z*intercept_z;
float ac_square = sign1*intercept_x*intercept_x*intercept_z*intercept_z;
float abc_square = sign2*intercept_x*intercept_x*intercept_y*intercept_y*intercept_z*intercept_z;
vec3 inter_square = vec3(bc_square, ac_square, ab_square);
vec3 rd_square = vec3(r.direction().x()*r.direction().x(),
r.direction().y()*r.direction().y(),
r.direction().z()*r.direction().z());
float A = dot(inter_square, rd_square);
vec3 r0_c = r.origin() - center;
vec3 r0_c_rd = vec3(r0_c.x()*r.direction().x(),
r0_c.y()*r.direction().y(),
r0_c.z()*r.direction().z());
float B = 2*dot(r0_c_rd, inter_square);
vec3 r0_c_square = vec3(r0_c.x()*r0_c.x(),
r0_c.y()*r0_c.y(),