20 PhotoModel::PhotoModel(
Pvl &pvl) {
21 PvlGroup &algorithm = pvl.
findObject(
"PhotometricModel").findGroup(
"Algorithm", Pvl::Traverse);
26 p_photoAlgorithmName = algorithm[
"PhtName"][0];
29 p_photoAlgorithmName = algorithm[
"Name"][0];
32 IString msg =
"Keyword [Name] or keyword [PhtName] must ";
33 msg +=
"exist in [Group = Algorithm]";
37 p_standardConditions =
false;
44 void PhotoModel::SetStandardConditions(
bool standard) {
45 p_standardConditions = standard;
58 double PhotoModel::PhtTopder(
double phase,
double incidence,
67 double inc1, inc2, inc3, inc4;
69 double ema1, ema2, ema3, ema4;
77 xi = sin((
Isis::PI / 180.0) * incidence);
78 zi = cos((
Isis::PI / 180.0) * incidence);
83 if((incidence == 0.0) || (emission == 0.0)) {
87 cphi = (cos((
Isis::PI / 180.0) * phase) -
88 cos((
Isis::PI / 180.0) * incidence) *
89 cos((
Isis::PI / 180.0) * emission)) /
90 (sin((
Isis::PI / 180.0) * incidence) *
95 phi = PhtAcos(cphi) * (180.0 /
Isis::PI);
96 xe = cphi * sin((
Isis::PI / 180.0) * emission);
98 ze = cos((
Isis::PI / 180.0) * emission);
102 xy = sin((
Isis::PI / 180.0) * epsh);
105 cinc = max(-1.0, min(xy * xi + z * zi, 1.0));
106 inc1 = PhtAcos(cinc) * (180.0 /
Isis::PI);
107 cema = max(-1.0, min(xy * xe + z * ze, 1.0));
108 ema1 = PhtAcos(cema) * (180.0 /
Isis::PI);
110 cinc = max(-1.0, min(-xy * xi + z * zi, 1.0));
111 inc2 = PhtAcos(cinc) * (180.0 /
Isis::PI);
112 cema = max(-1.0, min(-xy * xe + z * ze, 1.0));
113 ema2 = PhtAcos(cema) * (180.0 /
Isis::PI);
115 cinc = max(-1.0, min(z * zi, 1.0));
116 inc3 = PhtAcos(cinc) * (180.0 /
Isis::PI);
117 cema = max(-1.0, min(xy * ye + z * ze, 1.0));
118 ema3 = PhtAcos(cema) * (180.0 /
Isis::PI);
120 cinc = max(-1.0, min(z * zi, 1.0));
121 inc4 = PhtAcos(cinc) * (180.0 /
Isis::PI);
122 cema = max(-1.0, min(-xy * ye + z * ze, 1.0));
123 ema4 = PhtAcos(cema) * (180.0 /
Isis::PI);
125 d1 = (CalcSurfAlbedo(phase, inc1, ema1) - CalcSurfAlbedo(phase, inc2, ema2)) / eps;
126 d2 = (CalcSurfAlbedo(phase, inc3, ema3) - CalcSurfAlbedo(phase, inc4, ema4)) / eps;
129 result = sqrt(max(1.0e-30, d1 * d1 + d2 * d2));
144 double PhotoModel::PhtAcos(
double cosang) {
147 if(fabs(cosang) <= 1.0) {
148 result = acos(cosang);
171 double PhotoModel::CalcSurfAlbedo(
double pha,
double inc,
double ema) {
181 double albedo = PhotoModelAlgorithm(pha, inc, ema);