diff --git a/shapes/Cyl.cc b/shapes/Cyl.cc index 5e287b6..66f23e5 100644 --- a/shapes/Cyl.cc +++ b/shapes/Cyl.cc @@ -16,6 +16,7 @@ Cyl::Cyl(double bottom_radius, double top_radius, double height) m_height = fabs(height); if (m_height == 0.0) m_height = 1.0; + m_slope = (m_top_radius - m_bottom_radius) / m_height; /* rise over run */ } Shape::IntersectList Cyl::intersect(const Ray & ray) @@ -28,9 +29,33 @@ Shape::IntersectList Cyl::intersect(const Ray & ray) * x = R0x + tRdx * y = R0y + tRdy * z = R0z + tRdz - * Side equation: x^2 + y^2 = - * Combined: + * Side equation: x^2 + y^2 = (m*z + b)^2 + * Combined: (R0x+t*Rdx)^2 + (R0y+t*Rdy)^2 = (m*(R0z+t*Rdz) + b)^2 + * Expanded: (R0x*R0x + (t*t)*Rdx*Rdx + 2*R0x*t*Rdx) + * + (R0y*R0y + (t*t)*Rdy*Rdy + 2*R0y*t*Rdy) + * = ((m*R0z+m*t*Rdz)^2 + b*b + 2*m*(R0z+t*Rdz)*b) + * = ((m*R0z*m*R0z + m*m*t*t*Rdz*Rdz + 2*m*R0z*m*t*Rdz) + * + b*b + 2*m*R0z*b + 2*m*t*Rdz*b) + * Quadratic form: (t*t)(Rdx*Rdx + Rdy*Rdy - m*m*Rdz*Rdz) + * + (t)(2*R0x*Rdx + 2*R0y*Rdy - 2*m*R0z*m*Rdz - 2*m*Rdz*b) + * + (R0x*R0x + R0y*R0y - m*m*R0z*R0z - b*b - 2*m*R0z*b) + * = 0 */ + double Rdx = ray_inv.getDirection()[0]; + double Rdy = ray_inv.getDirection()[1]; + double Rdz = ray_inv.getDirection()[2]; + double R0x = ray_inv.getOrigin()[0]; + double R0y = ray_inv.getOrigin()[1]; + double R0z = ray_inv.getOrigin()[2]; + double m = m_m; + double m2 = m*m; + QuadraticSolver solver(Rdx * Rdx + Rdy * Rdy - m2 * Rdz * Rdz, + 2.0 * (R0x*Rdx + R0y*Rdy - m2*R0z*Rdz - m*Rdz*m_b), + R0x*R0x + R0y*R0y + - m2*R0z*R0z - m_b*m_b - 2*m*R0z*m_b + ); + + Solver::Results results = solver.solve(); return res; } diff --git a/shapes/Cyl.h b/shapes/Cyl.h index ad1afcf..89f5894 100644 --- a/shapes/Cyl.h +++ b/shapes/Cyl.h @@ -17,6 +17,7 @@ class Cyl : public Shape double m_top_radius; double m_top_radius_2; double m_height; + double m_slope; }; #endif