hcsg.cpp | hcsg_modeler.cpp | collision.cpp | camera.cpp | vector.cpp | main.cpp | ||||||
hcsg.h | hcsg_modeler.h | collision.h | camera.h | vector.h |
// ************************************************************************** // HCSG Demo // (c) Bernie Freidin, 1999-2000 // ************************************************************************** #include "vector.h" // Inter-Dimensional Vector Assignment // Hyperbolic Midpoint vec2 vec2::hmidpoint(vec2& p1, vec2& p2) { // EXAMPLE: vec2 m = vec2::hmidpoint(p1, p2); double q1 = sqrt(1.0 - p1*p1); double q2 = sqrt(1.0 - p2*p2); return (p1*q2 + p2*q1) / (q1 + q2); } vec3 vec3::hmidpoint(vec3& p1, vec3& p2) { // EXAMPLE: vec3 m = vec3::hmidpoint(p1, p2); double q1 = sqrt(1.0 - p1*p1); double q2 = sqrt(1.0 - p2*p2); return (p1*q2 + p2*q1) / (q1 + q2); } // Hyperbolic Translation (2D) mat3 mat3::htranslate(vec2& p) { // EXAMPLE: mat3 m = mat3::translate(p); double c, s, t = 1.0 / (1.0 + sqrt(1.0 - p*p)); c = 1.0 - p.y*p.y*t; s = 1.0 - p.x*p.x*t; t = p.x*p.y*t; return mat3(c, t, +p.x, t, s, +p.y, +p.x, +p.y, 1.0); } mat3 mat3::hntranslate(vec2& p) { // EXAMPLE: mat3 m = mat3::translate(p); double c, s, t = 1.0 / (1.0 + sqrt(1.0 - p*p)); c = 1.0 - p.y*p.y*t; s = 1.0 - p.x*p.x*t; t = p.x*p.y*t; return mat3(c, t, -p.x, t, s, -p.y, -p.x, -p.y, 1.0); } // Hyperbolic Rotation (2D) mat3 mat3::hrotate(vec2& p, double theta) { // EXAMPLE: mat3 m = mat3::hrotate(p, theta); double c = cos(theta); double s = sin(theta); double t = 1.0 / (1.0 + sqrt(1.0 - p*p)); mat3 r(c, -s, 0.f, s, c, 0.0, 0.0, 0.0, 1.0); c = 1.0 - p.y*p.y*t; s = 1.0 - p.x*p.x*t; t = p.x*p.y*t; mat3 t1(c, t, -p.x, t, s, -p.y, -p.x, -p.y, 1.0); mat3 t2(c, t, +p.x, t, s, +p.y, +p.x, +p.y, 1.0); return t2*r*t1; }
This page © Bernie Freidin, 2000.