⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algebra3.c

📁 This contains Graphic gems code
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "algebra3.h"#include <ctype.h>/*****************************************************************								**		    vec2 Member functions			**								*****************************************************************/// CONSTRUCTORSvec2::vec2() {}vec2::vec2(const double x, const double y){ n[VX] = x; n[VY] = y; }vec2::vec2(const double d){ n[VX] = n[VY] = d; }vec2::vec2(const vec2& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; }vec2::vec2(const vec3& v) // it is up to caller to avoid divide-by-zero{ n[VX] = v.n[VX]/v.n[VZ]; n[VY] = v.n[VY]/v.n[VZ]; };vec2::vec2(const vec3& v, int dropAxis) {    switch (dropAxis) {	case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; break;	case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; break;	default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; break;    }}// ASSIGNMENT OPERATORSvec2& vec2::operator = (const vec2& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; return *this; }vec2& vec2::operator += ( const vec2& v ){ n[VX] += v.n[VX]; n[VY] += v.n[VY]; return *this; }vec2& vec2::operator -= ( const vec2& v ){ n[VX] -= v.n[VX]; n[VY] -= v.n[VY]; return *this; }vec2& vec2::operator *= ( const double d ){ n[VX] *= d; n[VY] *= d; return *this; }vec2& vec2::operator /= ( const double d ){ double d_inv = 1./d; n[VX] *= d_inv; n[VY] *= d_inv; return *this; }double& vec2::operator [] ( int i) {    if (i < VX || i > VY)	V_ERROR("vec2 [] operator: illegal access; index = " << i << '\n')    return n[i];}// SPECIAL FUNCTIONSdouble vec2::length(){ return sqrt(length2()); }double vec2::length2(){ return n[VX]*n[VX] + n[VY]*n[VY]; }vec2& vec2::normalize() // it is up to caller to avoid divide-by-zero{ *this /= length(); return *this; }vec2& vec2::apply(V_FCT_PTR fct){ n[VX] = (*fct)(n[VX]); n[VY] = (*fct)(n[VY]); return *this; }// FRIENDSvec2 operator - (const vec2& a){ return vec2(-a.n[VX],-a.n[VY]); }vec2 operator + (const vec2& a, const vec2& b){ return vec2(a.n[VX]+ b.n[VX], a.n[VY] + b.n[VY]); }vec2 operator - (const vec2& a, const vec2& b){ return vec2(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY]); }vec2 operator * (const vec2& a, const double d){ return vec2(d*a.n[VX], d*a.n[VY]); }vec2 operator * (const double d, const vec2& a){ return a*d; }vec2 operator * (const mat3& a, const vec2& v) {    vec3 av;    av.n[VX] = a.v[0].n[VX]*v.n[VX] + a.v[0].n[VY]*v.n[VY] + a.v[0].n[VZ];    av.n[VY] = a.v[1].n[VX]*v.n[VX] + a.v[1].n[VY]*v.n[VY] + a.v[1].n[VZ];    av.n[VZ] = a.v[2].n[VX]*v.n[VX] + a.v[2].n[VY]*v.n[VY] + a.v[2].n[VZ];    return av;}vec2 operator * (const vec2& v, mat3& a){ return a.transpose() * v; }double operator * (const vec2& a, const vec2& b){ return (a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY]); }vec2 operator / (const vec2& a, const double d){ double d_inv = 1./d; return vec2(a.n[VX]*d_inv, a.n[VY]*d_inv); }vec3 operator ^ (const vec2& a, const vec2& b){ return vec3(0.0, 0.0, a.n[VX] * b.n[VY] - b.n[VX] * a.n[VY]); }int operator == (const vec2& a, const vec2& b){ return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]); }int operator != (const vec2& a, const vec2& b){ return !(a == b); }ostream& operator << (ostream& s, vec2& v){ return s << "| " << v.n[VX] << ' ' << v.n[VY] << " |"; }istream& operator >> (istream& s, vec2& v) {    vec2	v_tmp;    char	c = ' ';    while (isspace(c))	s >> c;    // The vectors can be formatted either as x y or | x y |    if (c == '|') {	s >> v_tmp[VX] >> v_tmp[VY];	while (s >> c && isspace(c)) ;	if (c != '|')	    s.set(_bad);	}    else {	s.putback(c);	s >> v_tmp[VX] >> v_tmp[VY];	}    if (s)	v = v_tmp;    return s;}void swap(vec2& a, vec2& b){ vec2 tmp(a); a = b; b = tmp; }vec2 min(const vec2& a, const vec2& b){ return vec2(MIN(a.n[VX], b.n[VX]), MIN(a.n[VY], b.n[VY])); }vec2 max(const vec2& a, const vec2& b){ return vec2(MAX(a.n[VX], b.n[VX]), MAX(a.n[VY], b.n[VY])); }vec2 prod(const vec2& a, const vec2& b){ return vec2(a.n[VX] * b.n[VX], a.n[VY] * b.n[VY]); }/*****************************************************************								**		    vec3 Member functions			**								*****************************************************************/// CONSTRUCTORSvec3::vec3() {}vec3::vec3(const double x, const double y, const double z){ n[VX] = x; n[VY] = y; n[VZ] = z; }vec3::vec3(const double d){ n[VX] = n[VY] = n[VZ] = d; }vec3::vec3(const vec3& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; }vec3::vec3(const vec2& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = 1.0; }vec3::vec3(const vec2& v, double d){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = d; }vec3::vec3(const vec4& v) // it is up to caller to avoid divide-by-zero{ n[VX] = v.n[VX] / v.n[VW]; n[VY] = v.n[VY] / v.n[VW];  n[VZ] = v.n[VZ] / v.n[VW]; }vec3::vec3(const vec4& v, int dropAxis) {    switch (dropAxis) {	case VX: n[VX] = v.n[VY]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break;	case VY: n[VX] = v.n[VX]; n[VY] = v.n[VZ]; n[VZ] = v.n[VW]; break;	case VZ: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VW]; break;	default: n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; break;    }}// ASSIGNMENT OPERATORSvec3& vec3::operator = (const vec3& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; return *this; }vec3& vec3::operator += ( const vec3& v ){ n[VX] += v.n[VX]; n[VY] += v.n[VY]; n[VZ] += v.n[VZ]; return *this; }vec3& vec3::operator -= ( const vec3& v ){ n[VX] -= v.n[VX]; n[VY] -= v.n[VY]; n[VZ] -= v.n[VZ]; return *this; }vec3& vec3::operator *= ( const double d ){ n[VX] *= d; n[VY] *= d; n[VZ] *= d; return *this; }vec3& vec3::operator /= ( const double d ){ double d_inv = 1./d; n[VX] *= d_inv; n[VY] *= d_inv; n[VZ] *= d_inv;  return *this; }double& vec3::operator [] ( int i) {    if (i < VX || i > VZ)	V_ERROR("vec3 [] operator: illegal access; index = " << i << '\n')    return n[i];}// SPECIAL FUNCTIONSdouble vec3::length(){  return sqrt(length2()); }double vec3::length2(){  return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ]; }vec3& vec3::normalize() // it is up to caller to avoid divide-by-zero{ *this /= length(); return *this; }vec3& vec3::apply(V_FCT_PTR fct){ n[VX] = (*fct)(n[VX]); n[VY] = (*fct)(n[VY]); n[VZ] = (*fct)(n[VZ]);return *this; }// FRIENDSvec3 operator - (const vec3& a){  return vec3(-a.n[VX],-a.n[VY],-a.n[VZ]); }vec3 operator + (const vec3& a, const vec3& b){ return vec3(a.n[VX]+ b.n[VX], a.n[VY] + b.n[VY], a.n[VZ] + b.n[VZ]); }vec3 operator - (const vec3& a, const vec3& b){ return vec3(a.n[VX]-b.n[VX], a.n[VY]-b.n[VY], a.n[VZ]-b.n[VZ]); }vec3 operator * (const vec3& a, const double d){ return vec3(d*a.n[VX], d*a.n[VY], d*a.n[VZ]); }vec3 operator * (const double d, const vec3& a){ return a*d; }vec3 operator * (const mat4& a, const vec3& v){ return a * vec4(v); }vec3 operator * (const vec3& v, mat4& a){ return a.transpose() * v; }double operator * (const vec3& a, const vec3& b){ return (a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY] + a.n[VZ]*b.n[VZ]); }vec3 operator / (const vec3& a, const double d){ double d_inv = 1./d; return vec3(a.n[VX]*d_inv, a.n[VY]*d_inv,  a.n[VZ]*d_inv); }vec3 operator ^ (const vec3& a, const vec3& b) {    return vec3(a.n[VY]*b.n[VZ] - a.n[VZ]*b.n[VY],		a.n[VZ]*b.n[VX] - a.n[VX]*b.n[VZ],		a.n[VX]*b.n[VY] - a.n[VY]*b.n[VX]);}int operator == (const vec3& a, const vec3& b){ return (a.n[VX] == b.n[VX]) && (a.n[VY] == b.n[VY]) && (a.n[VZ] == b.n[VZ]);}int operator != (const vec3& a, const vec3& b){ return !(a == b); }ostream& operator << (ostream& s, vec3& v){ return s << "| " << v.n[VX] << ' ' << v.n[VY] << ' ' << v.n[VZ] << " |"; }istream& operator >> (istream& s, vec3& v) {    vec3	v_tmp;    char	c = ' ';    while (isspace(c))	s >> c;    // The vectors can be formatted either as x y z or | x y z |    if (c == '|') {	s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ];	while (s >> c && isspace(c)) ;	if (c != '|')	    s.set(_bad);	}    else {	s.putback(c);	s >> v_tmp[VX] >> v_tmp[VY] >> v_tmp[VZ];	}    if (s)	v = v_tmp;    return s;}void swap(vec3& a, vec3& b){ vec3 tmp(a); a = b; b = tmp; }vec3 min(const vec3& a, const vec3& b){ return vec3(MIN(a.n[VX], b.n[VX]), MIN(a.n[VY], b.n[VY]), MIN(a.n[VZ],  b.n[VZ])); }vec3 max(const vec3& a, const vec3& b){ return vec3(MAX(a.n[VX], b.n[VX]), MAX(a.n[VY], b.n[VY]), MAX(a.n[VZ],  b.n[VZ])); }vec3 prod(const vec3& a, const vec3& b){ return vec3(a.n[VX] * b.n[VX], a.n[VY] * b.n[VY], a.n[VZ] * b.n[VZ]); }/*****************************************************************								**		    vec4 Member functions			**								*****************************************************************/// CONSTRUCTORSvec4::vec4() {}vec4::vec4(const double x, const double y, const double z, const double w){ n[VX] = x; n[VY] = y; n[VZ] = z; n[VW] = w; }vec4::vec4(const double d){  n[VX] = n[VY] = n[VZ] = n[VW] = d; }vec4::vec4(const vec4& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; n[VW] = v.n[VW]; }vec4::vec4(const vec3& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; n[VW] = 1.0; }vec4::vec4(const vec3& v, const double d){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ];  n[VW] = d; }// ASSIGNMENT OPERATORSvec4& vec4::operator = (const vec4& v){ n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; n[VW] = v.n[VW];return *this; }vec4& vec4::operator += ( const vec4& v ){ n[VX] += v.n[VX]; n[VY] += v.n[VY]; n[VZ] += v.n[VZ]; n[VW] += v.n[VW];return *this; }vec4& vec4::operator -= ( const vec4& v ){ n[VX] -= v.n[VX]; n[VY] -= v.n[VY]; n[VZ] -= v.n[VZ]; n[VW] -= v.n[VW];return *this; }vec4& vec4::operator *= ( const double d ){ n[VX] *= d; n[VY] *= d; n[VZ] *= d; n[VW] *= d; return *this; }vec4& vec4::operator /= ( const double d ){ double d_inv = 1./d; n[VX] *= d_inv; n[VY] *= d_inv; n[VZ] *= d_inv;  n[VW] *= d_inv; return *this; }double& vec4::operator [] ( int i) {    if (i < VX || i > VW)	V_ERROR("vec4 [] operator: illegal access; index = " << i << '\n')    return n[i];}// SPECIAL FUNCTIONSdouble vec4::length(){ return sqrt(length2()); }double vec4::length2(){ return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ] + n[VW]*n[VW]; }vec4& vec4::normalize() // it is up to caller to avoid divide-by-zero{ *this /= length(); return *this; }vec4& vec4::apply(V_FCT_PTR fct){ n[VX] = (*fct)(n[VX]); n[VY] = (*fct)(n[VY]); n[VZ] = (*fct)(n[VZ]);n[VW] = (*fct)(n[VW]); return *this; }// FRIENDSvec4 operator - (const vec4& a){ return vec4(-a.n[VX],-a.n[VY],-a.n[VZ],-a.n[VW]); }vec4 operator + (const vec4& a, const vec4& b){ return vec4(a.n[VX] + b.n[VX], a.n[VY] + b.n[VY], a.n[VZ] + b.n[VZ],  a.n[VW] + b.n[VW]); }vec4 operator - (const vec4& a, const vec4& b){  return vec4(a.n[VX] - b.n[VX], a.n[VY] - b.n[VY], a.n[VZ] - b.n[VZ],   a.n[VW] - b.n[VW]); }vec4 operator * (const vec4& a, const double d){ return vec4(d*a.n[VX], d*a.n[VY], d*a.n[VZ], d*a.n[VW] ); }vec4 operator * (const double d, const vec4& a){ return a*d; }vec4 operator * (const mat4& a, const vec4& v) {    #define ROWCOL(i) a.v[i].n[0]*v.n[VX] + a.v[i].n[1]*v.n[VY] \    + a.v[i].n[2]*v.n[VZ] + a.v[i].n[3]*v.n[VW]    return vec4(ROWCOL(0), ROWCOL(1), ROWCOL(2), ROWCOL(3));    #undef ROWCOL}vec4 operator * (const vec4& v, mat4& a){ return a.transpose() * v; }double operator * (const vec4& a, const vec4& b){ return (a.n[VX]*b.n[VX] + a.n[VY]*b.n[VY] + a.n[VZ]*b.n[VZ] +  a.n[VW]*b.n[VW]); }vec4 operator / (const vec4& a, const double d){ double d_inv = 1./d; return vec4(a.n[VX]*d_inv, a.n[VY]*d_inv, a.n[VZ]*d_inv,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -