|
Isis 3.0 Application Source Code Reference |
Home |
00001 #include <cmath> 00002 #include "Isis.h" 00003 #include "ProcessByLine.h" 00004 #include "SpecialPixel.h" 00005 #include "iException.h" 00006 00007 using namespace std; 00008 using namespace Isis; 00009 00010 void cubefunc (Buffer &in, 00011 Buffer &out); 00012 00013 double bad=0; 00014 double y; 00015 00016 enum function { 00017 COS, 00018 SIN, 00019 TAN, 00020 ACOS, 00021 ASIN, 00022 ATAN, 00023 INV, 00024 SQRT, 00025 POW10, 00026 EXP, 00027 XTOY, 00028 LOG10, 00029 LN, 00030 ABS 00031 } Function; 00032 00033 00034 void IsisMain() { 00035 // We will be processing by line 00036 ProcessByLine p; 00037 00038 // Setup the input and output cubes 00039 p.SetInputCube("FROM"); 00040 p.SetOutputCube ("TO"); 00041 00042 UserInterface &ui = Application::GetUserInterface(); 00043 00044 // Which function is it to be? 00045 string func = ui.GetString ("FUNCTION"); 00046 if (func == "COS") Function = COS; 00047 if (func == "SIN") Function = SIN; 00048 if (func == "TAN") Function = TAN; 00049 if (func == "ACOS") Function = ACOS; 00050 if (func == "ASIN") Function = ASIN; 00051 if (func == "ATAN") Function = ATAN; 00052 if (func == "INV") Function = INV; 00053 if (func == "SQRT") Function = SQRT; 00054 if (func == "POW10") Function = POW10; 00055 if (func == "EXP") Function = EXP; 00056 if (func == "XTOY") Function = XTOY; 00057 if (func == "LOG10") Function = LOG10; 00058 if (func == "LN") Function = LN; 00059 if (func == "ABS") Function = ABS; 00060 00061 if (Function == XTOY) { 00062 if (ui.WasEntered ("Y")) { 00063 y = ui.GetDouble("Y"); 00064 } 00065 else { 00066 string message = "For the XTOY function, you must enter a value for y"; 00067 throw iException::Message(iException::User,message,_FILEINFO_); 00068 } 00069 } 00070 00071 // Start the processing 00072 p.StartProcess(cubefunc); 00073 00074 if (bad != 0) { 00075 PvlGroup results ("Results"); 00076 string message = "Invalid input pixels converted to Isis NULL values"; 00077 results += PvlKeyword ("Error", message); 00078 results += PvlKeyword ("Count",bad); 00079 Application::Log (results); 00080 } 00081 p.EndProcess(); 00082 } 00083 00084 // Line processing routine 00085 void cubefunc (Buffer &in, 00086 Buffer &out) 00087 { 00088 00089 // Loop for each pixel in the line. 00090 for (int i=0; i<in.size(); i++) { 00091 00092 if (IsSpecial (in[i])) { 00093 out[i] = in[i]; 00094 } 00095 else { 00096 double deg; 00097 switch (Function) { 00098 case COS: 00099 if (in[i] < (-(2*PI)) || in[i] > (2*PI)) { 00100 out[i] = NULL8; 00101 bad++; 00102 } 00103 out[i] = cos (in[i]); 00104 break; 00105 case SIN: 00106 if (in[i] < (-(2*PI)) || in[i] > (2*PI)) { 00107 out[i] = NULL8; 00108 bad++; 00109 } 00110 out[i] = sin (in[i]); 00111 break; 00112 case TAN: 00113 // Check for invalid input values. Check within a certain 00114 // tolerance since the radiance value will probably never be 00115 // exactly 90, 270, -90 or -270 degrees due to round off. 00116 // First convert input value from radians to degrees. 00117 deg = in[i] * (180./PI); 00118 if ( abs(abs(in[i]) - 90.0) <= .0001 || 00119 abs(abs(in[i]) - 270.0) <= .0001) { 00120 out[i] = NULL8; 00121 bad++; 00122 } 00123 else { 00124 out[i] = tan (in[i]); 00125 } 00126 break; 00127 case ACOS: 00128 if (in[i] < -1.0 || in[i] > 1.0) { 00129 out[i] = NULL8; 00130 bad++; 00131 } 00132 else { 00133 out[i] = acos (in[i]); 00134 } 00135 break; 00136 case ASIN: 00137 if (in[i] < -1.0 || in[i] > 1.0) { 00138 out[i] = NULL8; 00139 bad++; 00140 } 00141 else { 00142 out[i] = asin (in[i]); 00143 } 00144 break; 00145 case ATAN: 00146 out[i] = atan (in[i]); 00147 break; 00148 case INV: 00149 if (in[i] == 0) { 00150 out[i] = NULL8; 00151 bad++; 00152 } 00153 else { 00154 out[i] = 1 / in[i]; 00155 } 00156 break; 00157 case SQRT: 00158 if (in[i] <= 0) { 00159 out[i] = NULL8; 00160 bad++; 00161 } 00162 else { 00163 out[i] = sqrt (in[i]); 00164 } 00165 break; 00166 case POW10: 00167 out[i] = pow (10,in[i]); 00168 break; 00169 case EXP: 00170 out[i] = exp (in[i]); 00171 break; 00172 case XTOY: 00173 out[i] = pow (in[i],y); 00174 break; 00175 case LOG10: 00176 if (in[i] <= 0) { 00177 out[i] = NULL8; 00178 bad++; 00179 } 00180 else { 00181 out[i] = log10 (in[i]); 00182 } 00183 break; 00184 case LN: 00185 if (in[i] <= 0) { 00186 out[i] = NULL8; 00187 bad++; 00188 } 00189 else { 00190 out[i] = log (in[i]); 00191 } 00192 break; 00193 case ABS: 00194 out[i] = abs (in[i]); 00195 break; 00196 } 00197 } 00198 } 00199 }