125 lines
5.4 KiB
C
125 lines
5.4 KiB
C
|
/***************************************************************************
|
||
|
* SphTri.h *
|
||
|
* *
|
||
|
* This file defines the SphericalTriangle class definition, which *
|
||
|
* supports member functions for Monte Carlo sampling, point containment, *
|
||
|
* and other basic operations on spherical triangles. *
|
||
|
* *
|
||
|
* Changes: *
|
||
|
* 01/01/2000 arvo Added New_{Alpha,Beta,Gamma} methods. *
|
||
|
* 12/30/1999 arvo Added VecIrrad method for "Vector Irradiance". *
|
||
|
* 04/08/1995 arvo Further optimized sampling algorithm. *
|
||
|
* 10/11/1994 arvo Added analytic sampling algorithm. *
|
||
|
* 06/14/1994 arvo Initial implementation. *
|
||
|
* *
|
||
|
*--------------------------------------------------------------------------*
|
||
|
* Copyright (C) 1995, 2000, James Arvo *
|
||
|
* *
|
||
|
* This program is free software; you can redistribute it and/or modify it *
|
||
|
* under the terms of the GNU General Public License as published by the *
|
||
|
* Free Software Foundation. See http://www.fsf.org/copyleft/gpl.html *
|
||
|
* *
|
||
|
* This program is distributed in the hope that it will be useful, but *
|
||
|
* WITHOUT EXPRESS OR IMPLIED WARRANTY of merchantability or fitness for *
|
||
|
* any particular purpose. See the GNU General Public License for more *
|
||
|
* details. *
|
||
|
* *
|
||
|
***************************************************************************/
|
||
|
#ifndef __SPHTRI_INCLUDED__
|
||
|
#define __SPHTRI_INCLUDED__
|
||
|
|
||
|
#include "Vec3.h"
|
||
|
#include "Vec2.h"
|
||
|
|
||
|
namespace ArvoMath {
|
||
|
|
||
|
/*
|
||
|
* The (Oblique) Spherical Triangle ABC. Edge lengths (segments of great
|
||
|
* circles) are a, b, and c. The (dihedral) angles are Alpha, Beta, and Gamma.
|
||
|
*
|
||
|
* B
|
||
|
* o
|
||
|
* / \
|
||
|
* / \
|
||
|
* /Beta \
|
||
|
* / \
|
||
|
* c / \ a
|
||
|
* / \
|
||
|
* / \
|
||
|
* / \
|
||
|
* / \
|
||
|
* / \
|
||
|
* /Alpha Gamma \
|
||
|
* o-----------------------o
|
||
|
* A b C
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
class SphericalTriangle {
|
||
|
|
||
|
public: // methods
|
||
|
SphericalTriangle() { Init(); }
|
||
|
SphericalTriangle( const SphericalTriangle &T ) { *this = T; }
|
||
|
SphericalTriangle( const Vec3 &, const Vec3 &, const Vec3 & );
|
||
|
SphericalTriangle & operator()( const Vec3 &, const Vec3 &, const Vec3 & );
|
||
|
~SphericalTriangle( ) {}
|
||
|
void operator=( const SphericalTriangle &T ) { *this = T; }
|
||
|
Vec3 Chart ( float x, float y ) const; // Const-Jacobian map from square.
|
||
|
Vec2 Coord ( const Vec3 &P ) const; // Get 2D coords of a point.
|
||
|
int Orient( ) const { return orient; }
|
||
|
int Inside( const Vec3 & ) const;
|
||
|
float SolidAngle() const { return area; }
|
||
|
float SignedSolidAngle() const { return -orient * area; } // CC is pos.
|
||
|
const Vec3 &A() const { return A_ ; }
|
||
|
const Vec3 &B() const { return B_ ; }
|
||
|
const Vec3 &C() const { return C_ ; }
|
||
|
float a() const { return a_ ; }
|
||
|
float b() const { return b_ ; }
|
||
|
float c() const { return c_ ; }
|
||
|
float Cos_a() const { return cos_a ; }
|
||
|
float Cos_b() const { return cos_b ; }
|
||
|
float Cos_c() const { return cos_c ; }
|
||
|
float Alpha() const { return alpha ; }
|
||
|
float Beta () const { return beta ; }
|
||
|
float Gamma() const { return gamma ; }
|
||
|
float CosAlpha() const { return cos_alpha; }
|
||
|
float CosBeta () const { return cos_beta ; }
|
||
|
float CosGamma() const { return cos_gamma; }
|
||
|
Vec3 VecIrrad() const; // Returns the vector irradiance.
|
||
|
SphericalTriangle Dual() const;
|
||
|
SphericalTriangle New_Alpha( float alpha ) const;
|
||
|
SphericalTriangle New_Beta ( float beta ) const;
|
||
|
SphericalTriangle New_Gamma( float gamma ) const;
|
||
|
|
||
|
private: // methods
|
||
|
void Init( );
|
||
|
void Init( const Vec3 &A, const Vec3 &B, const Vec3 &C );
|
||
|
|
||
|
private: // data
|
||
|
Vec3 A_, B_, C_, U; // The vertices (and a temp vector).
|
||
|
float a_, b_, c_; // The edge lengths.
|
||
|
float alpha, beta, gamma; // The angles.
|
||
|
float cos_a, cos_b, cos_c;
|
||
|
float cos_alpha, cos_beta, cos_gamma;
|
||
|
float area;
|
||
|
float sin_alpha, product; // Used in sampling algorithm.
|
||
|
int orient; // Orientation.
|
||
|
};
|
||
|
|
||
|
inline double CosDihedralAngle( const Vec3 &A, const Vec3 &B, const Vec3 &C )
|
||
|
{
|
||
|
float x = Unit( A ^ B ) * Unit( C ^ B );
|
||
|
if( x < -1.0 ) x = -1.0;
|
||
|
if( x > 1.0 ) x = 1.0;
|
||
|
return x;
|
||
|
}
|
||
|
|
||
|
inline double DihedralAngle( const Vec3 &A, const Vec3 &B, const Vec3 &C )
|
||
|
{
|
||
|
return acos( CosDihedralAngle( A, B, C ) );
|
||
|
}
|
||
|
|
||
|
extern std::ostream &operator<<( std::ostream &out, const SphericalTriangle & );
|
||
|
};
|
||
|
#endif
|