28 #include <rl_Polarization.h> 32 #include <mathconst/mathconst.h> 35 #include <rl_raylib/rl_ReflectionCoefPOD.h> 41 static double alpha[] = {51.2, 46.2, 41.2, 36.4, 31.7, 27.0};
54 make_Triad( dvm3_Vector& x,
56 dvm3_Vector
const& s );
64 dvm3_Vector
const& norm,
65 dvm3_Vector
const& v1,
82 double cpsi = cos(psi * M_DEG2RAD);
83 double spsi = sin(psi * M_DEG2RAD);
85 double sqre = sqrt(1.0 + b_over_a * b_over_a );
91 s2_[0] = b_over_a * ctmp;
94 s2_[1] = b_over_a * ctmp;
102 + c2_[1] * conj( s2_[1] ) );
103 double rfl = norm(c2_[0]) + norm(s2_[0]) + norm(c2_[1]) + norm(s2_[1])
104 + 2.0 * crossterms.real();
106 #ifdef OSAC_WEIGHT_KLUDGE 113 return 1.e-8 * ((int)(1.0e8 * rfl + 0.5));
123 const double fac = sqrt(factor);
137 os <<
"[(" << c2_[0].real() <<
"," << c2_[0].imag() <<
")(" 138 << c2_[1].real() <<
"," << c2_[1].imag() <<
")][(" 139 << s2_[0].real() <<
"," << s2_[0].imag() <<
")(" 140 << s2_[1].real() <<
"," << s2_[1].imag() <<
")]";
151 fprintf(of,
"\nc2: [(%.15e, %.15e)(%.15e, %.15e)]",
152 c2_[0].real(), c2_[0].imag(),
153 c2_[1].real(), c2_[1].imag() );
154 fprintf(of,
"\ns2: [(%.15e, %.15e)(%.15e, %.15e)]",
155 s2_[0].real(), s2_[0].imag(),
156 s2_[1].real(), s2_[1].imag() );
157 fprintf(of,
"\n%.15e\n", intensity());
183 make_Triad( x1, y1, dir );
197 C_r_.lincomb( cs.
c2_[0].real(), x1, cs.
c2_[1].real(), y1 );
198 C_i_.lincomb( cs.
c2_[0].imag(), x1, cs.
c2_[1].imag(), y1 );
199 S_r_.lincomb( cs.
s2_[0].real(), x1, cs.
s2_[1].real(), y1 );
200 S_i_.lincomb( cs.
s2_[0].imag(), x1, cs.
s2_[1].imag(), y1 );
210 return dot(C_r_, C_r_) + dot(C_i_, C_i_) + dot(S_r_, S_r_) + dot(S_i_, S_i_)
211 + 2.0 * ( dot(C_i_, S_r_) - dot(C_r_, S_i_) );
225 make_Triad( x2, y2, dir );
230 double d1 = dot( x2, C_r_);
231 double d2 = dot( x2, C_i_);
245 const double fac = sqrt(factor);
263 dvm3_Vector
const& normal,
264 dvm3_Vector
const& dir_in,
265 dvm3_Vector
const& dir_out,
272 #ifdef CONST_SINGRAZE 273 sg = sin(alpha[CONST_SINGRAZE-1] * 0.0002908882);
287 pol_perp_par( perp, parvi, parvo, normal,
300 T_par.dyad_product( parvo, parvi );
301 T_prp.dyad_product( perp, perp );
308 T_re.lincomb( rflcoef.
para().real(), T_par,
309 rflcoef.
perp().real(), T_prp );
310 T_im.lincomb( rflcoef.
para().imag(), T_par,
311 rflcoef.
perp().imag(), T_prp );
316 dvm3_Vector Tr_Cr; T_re.mvmult( Tr_Cr, C_r_ );
317 dvm3_Vector Tr_Ci; T_re.mvmult( Tr_Ci, C_i_ );
318 dvm3_Vector Ti_Cr; T_im.mvmult( Ti_Cr, C_r_ );
319 dvm3_Vector Ti_Ci; T_im.mvmult( Ti_Ci, C_i_ );
321 dvm3_Vector Tr_Sr; T_re.mvmult( Tr_Sr, S_r_ );
322 dvm3_Vector Tr_Si; T_re.mvmult( Tr_Si, S_i_ );
323 dvm3_Vector Ti_Sr; T_im.mvmult( Ti_Sr, S_r_ );
324 dvm3_Vector Ti_Si; T_im.mvmult( Ti_Si, S_i_ );
328 C_r_ = Tr_Cr - Ti_Ci;
329 C_i_ = Tr_Ci + Ti_Cr;
330 S_r_ = Tr_Sr - Ti_Si;
331 S_i_ = Tr_Si + Ti_Sr;
341 os << C_r_ << C_i_ << S_r_ << S_i_;
352 double* vec =
new double[3];
353 C_r_.copy_to_cvec( vec );
354 fprintf(of,
"\nC_r_: [%.15e, %.15e %.15e]\n",
355 vec[0], vec[1], vec[2]);
356 C_i_.copy_to_cvec( vec );
357 fprintf(of,
"\nC_i_: [%.15e, %.15e %.15e]\n",
358 vec[0], vec[1], vec[2]);
359 S_r_.copy_to_cvec( vec );
360 fprintf(of,
"\nS_r_: [%.15e, %.15e %.15e]\n",
361 vec[0], vec[1], vec[2]);
362 S_i_.copy_to_cvec( vec );
363 fprintf(of,
"\nS_i_: [%.15e, %.15e %.15e]\n",
364 vec[0], vec[1], vec[2]);
368 #define TINY_VALUE (100.0 * DBL_EPSILON) 380 dvm3_Vector
const& norm,
381 dvm3_Vector
const& v1,
382 dvm3_Vector
const& v2
387 if ( fabs(dot(v1, v2)) < 0.99999 )
389 perp.cross( v2, v1 );
393 if ( fabs(dot(norm,v1)) < 0.99999 )
395 perp.cross( norm, v1 );
399 if ( fabs(1.0 - fabs( norm[0] )) < TINY_VALUE )
401 perp.init( norm[2], 0.0, -norm[0] );
405 perp.init( 0.0, -norm[2], -norm[1] );
413 parv1.cross( v1, perp );
414 parv2.cross( v2, perp );
419 make_Triad( dvm3_Vector& x,
421 dvm3_Vector
const& s )
427 if ( fabs(1.0 - fabs( s[1] )) > TINY_VALUE )
429 x.init( s[2], 0.0, -s[0] );
433 x.init( 1.0, 0.0, 0.0 );
446 #undef CONST_SINGRAZE std::complex< double > complex
Typedef for the complex type.
void cprint_on(std::FILE *of) const
Write the polarization amplitude to FILE* of.
rl_Traits::complex c2_[2]
polarization amplitude (cosine component)
void init(double b_over_a=1.0, double psi=0.0)
Initialization method.
void cprint_on(FILE *of) const
Write the polarization amplitude to FILE* of.
double intensity() const
Evaluate the intensity.
std::ostream & print_on(std::ostream &os) const
Write the polarization vectors to stream os.
std::ostream & print_on(std::ostream &os) const
Write the polarization amplitude to stream os.
rl_Traits::complex s2_[2]
polarization amplitude (sine component)
A Plain Ol' Data class representing complex reflection coefficients.
A Plain Ol' Data struct (POD) encapsulating the OSAC-style complex polarization amplitudes.
void attenuate(double factor)
Attenuate intensity by a factor.
void attenuate(double factor)
Attenuate reflectivity by a factor.
void init(rl_PolCSPOD const &cs, dvm3_Vector const &dir)
Initialize the polarization state.
void get_PolCSPOD(rl_PolCSPOD &cs, dvm3_Vector const &dir) const
Evaluate rl_PolCSPOD corresponding to this polarization state.
double intensity() const
Evaluate intensity.
void reflect(dvm3_Vector const &normal, dvm3_Vector const &dir_in, dvm3_Vector const &dir_out, rl_ReflectionCoefPOD const &rflcoef)
Evaluate the reflected polarization vectors.
rl_Traits::complex para() const
rl_Traits::complex perp() const