private static void test02() //****************************************************************************80 // // Purpose: // // TEST02 tests the improved distributed hypercube sampling algorithm. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 10 April 2003 // // Author: // // John Burkardt // { const int dim_num = 2; const int point_num = 10; Console.WriteLine(); Console.WriteLine("TEST02"); Console.WriteLine(" IHS implements the IHS Algorithm"); Console.WriteLine(" (Improved Distributed Hypercube Sampling)"); Console.WriteLine(); Console.WriteLine(" Demonstrate the code for a fixed number of points"); Console.WriteLine(" and dimension, but vary the duplication value."); double opt = point_num / Math.Pow(point_num, 1.0E+00 / dim_num); Console.WriteLine(); Console.WriteLine(" Spatial dimension = " + dim_num); Console.WriteLine(" Number of points = " + point_num); Console.WriteLine(" Desired minimum distance = " + opt); for (int duplication = 1; duplication <= 5; duplication++) { int seed = 17; Console.WriteLine(); Console.WriteLine(" Random number seed = " + seed); Console.WriteLine(" Duplication factor = " + duplication); // // Get the points. // int[] x = IHS.ihs(dim_num, point_num, duplication, ref seed); // // Compute the covariance. // covariance c = new(dim_num, point_num, x); Console.WriteLine(); Console.WriteLine(" Average minimum distance " + c.average); Console.WriteLine(" Standard deviation: " + c.std); Console.WriteLine(" Covariance: " + c.covc); typeMethods.i4mat_transpose_print(dim_num, point_num, x, " X:"); } }
private static void Main() //****************************************************************************80 // // Purpose: // // MAIN is the main program for IHS_DATASET. // // Discussion: // // IHS_DATASET generates an IHS dataset and writes it to a file. // // This program is meant to be used interactively. It's also // possible to prepare a simple input file beforehand and use it // in batch mode. // // The program requests input values from the user: // // * M, the spatial dimension, // * N, the number of points to generate, // * D, the duplication factor, // * SEED, a seed for the random number generator. // // The program generates the data, writes it to the file // // ihs_M_N_D_SEED.txt // // where "M" and "N" are the numeric values specified by the user, // and then asks the user for more input. To indicate that no further // computations are desired, it is enough to input a nonsensical // value, such as -1. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 12 April 2007 // // Author: // // John Burkardt // { string output_filename = ""; // // Print introduction and options. // Console.WriteLine(""); Console.WriteLine("IHS_DATASET"); Console.WriteLine(" Generate an IHS dataset."); Console.WriteLine(""); Console.WriteLine(" This program is meant to be used interactively."); Console.WriteLine(" It is also possible to prepare a simple input"); Console.WriteLine(" file beforehand and use it in batch mode."); Console.WriteLine(""); Console.WriteLine(" The program requests input values from the user:"******""); Console.WriteLine(" * M, the spatial dimension,"); Console.WriteLine(" * N, the number of points to generate,"); Console.WriteLine(" * D, the duplication factor,"); Console.WriteLine(" * SEED, a seed for the random number generator."); Console.WriteLine(""); Console.WriteLine(" The program generates the data, writes it to the file"); Console.WriteLine(""); Console.WriteLine(" ihs_M_N_D_SEED.txt"); Console.WriteLine(""); Console.WriteLine(" where \"M\" and \"N\" are the numeric values specified"); Console.WriteLine(" by the user, and then asks the user for more input."); Console.WriteLine(""); Console.WriteLine(" To indicate that no further computations are"); Console.WriteLine(" desired, it is enough to input a nonsensical value,"); Console.WriteLine(" such as -1."); for (;;) { Console.WriteLine(" *"); Console.WriteLine(" *"); Console.WriteLine("* Ready to generate a new dataset:"); Console.WriteLine(" *"); Console.WriteLine(" *"); Console.WriteLine(" Enter M, the spatial dimension:"); Console.WriteLine(" (2 is a small typical value)."); Console.WriteLine(" (0 or any negative value terminates execution)."); int m; try { m = Convert.ToInt32(Console.ReadLine()); } catch (Exception) { Console.WriteLine(""); Console.WriteLine("IHS_DATASET - Fatal error!"); Console.WriteLine(" An I/O error occurred while trying to read M."); Console.WriteLine(" Abnormal end of execution."); return; } Console.WriteLine(" User input M = " + m + ""); switch (m) { case < 1: Console.WriteLine(""); Console.WriteLine("IHS_DATASET"); Console.WriteLine(" The input value of M = " + m + ""); Console.WriteLine(" is interpreted as a request for termination."); Console.WriteLine(" Normal end of execution."); return; } Console.WriteLine(""); Console.WriteLine(" Enter N, the number of points to generate:"); Console.WriteLine(" (10 is a small typical value)."); Console.WriteLine(" (0 or any negative value terminates execution)."); int n; try { n = Convert.ToInt32(Console.ReadLine()); } catch (Exception) { Console.WriteLine(""); Console.WriteLine("IHS_DATASET - Fatal error!"); Console.WriteLine(" An I/O error occurred while trying to read N."); Console.WriteLine(" Abnormal end of execution."); break; } Console.WriteLine(" User input N = " + n + ""); switch (n) { case < 1: Console.WriteLine(""); Console.WriteLine("IHS_DATASET"); Console.WriteLine(" The input value of N = " + n + ""); Console.WriteLine(" is interpreted as a request for termination."); Console.WriteLine(" Normal end of execution."); return; } Console.WriteLine(""); Console.WriteLine(" Enter D, the duplication factor:"); Console.WriteLine(" This must be at least 1, but not too large."); Console.WriteLine(" (5 is a typical value)."); Console.WriteLine(" (0 or any negative value terminates execution)."); int d; try { d = Convert.ToInt32(Console.ReadLine()); } catch (Exception) { Console.WriteLine(""); Console.WriteLine("IHS_DATASET - Fatal error!"); Console.WriteLine(" An I/O error occurred while trying to read D."); Console.WriteLine(" Abnormal end of execution."); return; } Console.WriteLine(" User input D = " + d + ""); if (d < 1) { Console.WriteLine(""); Console.WriteLine("IHS_DATASET"); Console.WriteLine(" The input value of D = " + d + ""); Console.WriteLine(" is interpreted as a request for termination."); Console.WriteLine(" Normal end of execution."); break; } Console.WriteLine(""); Console.WriteLine(" Enter SEED, a seed for the random number generator:"); Console.WriteLine(" (Try '123456789' if you have no preference.)"); Console.WriteLine(" (0 indicates you want a seed to be chosen for you.)"); Console.WriteLine(" (Any negative value terminates execution)."); int seed; try { seed = Convert.ToInt32(Console.ReadLine()); } catch (Exception) { Console.WriteLine(""); Console.WriteLine("IHS_DATASET - Fatal error!"); Console.WriteLine(" An I/O error occurred while trying to read SEED."); Console.WriteLine(" Abnormal end of execution."); return; } Console.WriteLine(" User input SEED = " + seed + ""); switch (seed) { case < 0: Console.WriteLine(""); Console.WriteLine("IHS_DATASET"); Console.WriteLine(" The input value of SEED = " + seed + ""); Console.WriteLine(" is interpreted as a request for termination."); Console.WriteLine(" Normal end of execution."); return; case 0: seed = entropyRNG.RNG.nextint(); Console.WriteLine(""); Console.WriteLine(" The actual value of SEED will be = " + seed + ""); break; } // // Compute the integer data. // int seed_init = seed; int[] i4_ihs = IHS.ihs(m, n, d, ref seed); // // Convert from integer to real. // double[] r8_ihs = new double[m * n]; int j; for (j = 0; j < n; j++) { int i; for (i = 0; i < m; i++) { r8_ihs[i + j * m] = (2 * i4_ihs[i + j * m] - 1) / (double)(2 * n); } } // // Write the data to a file. // output_filename += "ihs_" + m + "_" + n + "_" + d + "_" + seed_init + ".txt"; typeMethods.r8mat_write(output_filename, m, n, r8_ihs); Console.WriteLine(""); Console.WriteLine(" The data was written to the file \"" + output_filename + "\""); } Console.WriteLine(""); }
private static void test03( ) //****************************************************************************80 // // Purpose: // // TEST03 tests the improved distributed hypercube sampling algorithm. // // Licensing: // // This code is distributed under the GNU LGPL license. // // Modified: // // 10 April 2003 // // Author: // // John Burkardt // { const int dim_num = 2; const int duplication = 5; Console.WriteLine(); Console.WriteLine("TEST03"); Console.WriteLine(" IHS implements the IHS Algorithm"); Console.WriteLine(" (Improved Distributed Hypercube Sampling)"); Console.WriteLine(); Console.WriteLine(" Demonstrate the code for a fixed dimension"); Console.WriteLine(" and duplication value, and increasing number of points."); Console.WriteLine(); Console.WriteLine(" Spatial dimension = " + dim_num); Console.WriteLine(" Duplication factor = " + duplication); int point_num = 5; for (int k = 1; k <= 5; k++) { point_num = 2 * point_num; double opt = point_num / Math.Pow(point_num, 1.0E+00 / dim_num); int seed = 17; Console.WriteLine(); Console.WriteLine(" Random number seed = " + seed); Console.WriteLine(" Number of points = " + point_num); Console.WriteLine(" Desired minimum distance = " + opt); // // Get the points. // int[] x = IHS.ihs(dim_num, point_num, duplication, ref seed); // // Compute the covariance. // covariance c = new(dim_num, point_num, x); Console.WriteLine(); Console.WriteLine(" Average minimum distance " + c.average); Console.WriteLine(" Standard deviation: " + c.std); Console.WriteLine(" Covariance: " + c.covc); Console.WriteLine(); for (int j = 0; j < point_num; j++) { if (j <= 10 || point_num - 10 <= j) { string t = j + 1 + " "; string line = t.PadLeft(4); for (int i = 0; i < dim_num; i++) { t = x[i + j * dim_num] + " "; line += t.PadLeft(4); } Console.WriteLine(line); Console.WriteLine(); } else { switch (j) { case 11: Console.WriteLine(".... ........"); break; } } } } }
//RGB色彩空间转IHS色彩空间 private IHS[] IHSImage(System.Drawing.Bitmap bitmap) { int height = bitmap.Height; int width = bitmap.Width; IHS[] imageIHS = new IHS[height * width]; System.Drawing.Bitmap newBitmap = new System.Drawing.Bitmap(width, height); pointBitmap pointBitMap = new pointBitmap(bitmap); pointBitmap newPointBitMap = new pointBitmap(newBitmap); pointBitMap.LockBits(); newPointBitMap.LockBits(); System.Drawing.Color pixel; double theta; double round = 180 / Math.PI; for (int i = 1; i < width; i++) { for (int j = 1; j < height; j++) { pixel = pointBitMap.GetPixel(i, j); double RGB_R = (pixel.R / 255.0); double RGB_G = (pixel.G / 255.0); double RGB_B = (pixel.B / 255.0); double Max = Math.Max(RGB_R, Math.Max(RGB_G, RGB_B)); double Min = Math.Min(RGB_R, Math.Min(RGB_G, RGB_B)); ////////////////////////////////////////////////////////// imageIHS[i * height + j].I = (RGB_R + RGB_G + RGB_B) / 3; if (RGB_R == RGB_G && RGB_R == RGB_B) { theta = 0; } else { theta = Math.Acos((((RGB_R - RGB_G) + (RGB_R - RGB_B)) / 2) / Math.Sqrt((RGB_R - RGB_G) * (RGB_R - RGB_G) + (RGB_R - RGB_B) * (RGB_G - RGB_B))) * round; } if (RGB_B <= RGB_G) { imageIHS[i * height + j].H = theta / 360; } else { imageIHS[i * height + j].H = 1 - theta / 360; } imageIHS[i * height + j].S = 1 - 3 * Min / (RGB_R + RGB_G + RGB_B); ////////////////////////////////////////////////////////// //imageIHS[10 * i + j].H = 0.0; //if (Max == RGB_R && RGB_G >= RGB_B) //{ // if (Max - Min == 0) imageIHS[10 * i + j].H = 0.0; // else imageIHS[10 * i + j].H = 60 * (RGB_G - RGB_B) / (Max - Min); //} //else if (Max == RGB_R && RGB_G < RGB_B) //{ // imageIHS[10 * i + j].H = 60 * (RGB_G - RGB_B) / (Max - Min) + 360; //} //else if (Max == RGB_G) //{ // imageIHS[10 * i + j].H = 60 * (RGB_B - RGB_R) / (Max - Min) + 120; //} //else if (Max == RGB_B) //{ // imageIHS[10 * i + j].H = 60 * (RGB_R - RGB_G) / (Max - Min) + 240; //} //imageIHS[10 * i + j].S = (Max == 0) ? 0.0 : (1.0 - ((double)Min / (double)Max)); //imageIHS[10 * i + j].I = Max; ////////////////////////////////////////////////////////// } } pointBitMap.UnlockBits(); newPointBitMap.UnlockBits(); return(imageIHS); }