void GAWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (GAWorker.CancellationPending == true) Algo.Stop(); m_progBar.Value = e.ProgressPercentage; if (e.UserState == null) return; List<int> bestChromo = (List<int>)e.UserState; if (bestChromo.Count > 0) { List<double[]> gaPnts = new List<double[]>(); double[] result = EvalChromosome(ref bestChromo, ref gaPnts); CustomBasis GeneticBasis = new CustomBasis(16.383 / 2.0 - result[0], 16.383 / 2.0 - result[1], 16.383 / 2.0 - result[2], 16.383 / 2.0 - result[3]); List<double[]> fitpoints = new List<double[]>(gaPnts); //for (int i = 0; i < fitpoints.Count; i++) //fitpoints[i][2] += 15; //offset SurfaceRBF tmpSurf = new SurfaceRBF(null, "best", fitpoints, GeneticBasis, targetPoly, 0.0); double[] max = new double[3]; double[] min = new double[3]; max[0] = max[1] = max[2] = -1e9; //start max low min[0] = min[1] = min[2] = +1e9; //start min high fitpoints.ForEach((double[] v) => { for (int i = 0; i < v.Length; i++) //get fit points' bounding box { max[i] = Math.Max(v[i], Max[i]); min[i] = Math.Min(v[i], Min[i]); } }); double[] pnt1 = new double[3]; double[] pnt2 = new double[3]; List<double[]> errorSurfPnts = new List<double[]>(); double gridCount = 10.0; List<devDept.Eyeshot.Labels.TextOnly> labels = new List<devDept.Eyeshot.Labels.TextOnly>(); for (double i = 0; i < gridCount; i += 1.0) { for (double j = 0; j < gridCount; j += 1.0) { pnt1 = new double[] { (i / (gridCount - 1)) * (Max[0] - Min[0]) + Min[0], (j / (gridCount - 1)) * (Max[1] - Min[1]) + Min[1], 0 }; pnt2 = new double[] { (i / (gridCount - 1)) * (Max[0] - Min[0]) + Min[0], (j / (gridCount - 1)) * (Max[1] - Min[1]) + Min[1], 0 }; target.Value(ref pnt1); found.Value(ref pnt2); errorSurfPnts.Add(new double[] { (i / (gridCount - 1)) * (Max[0] - Min[0]) + Min[0], (j / (gridCount - 1)) * (Max[1] - Min[1]) + Min[1], Math.Pow(pnt2[2] - pnt1[2], 2) }); labels.Add(new devDept.Eyeshot.Labels.TextOnly(new Point3D((i / (gridCount - 1)) * (Max[0] - Min[0]) + Min[0] + GridSize * 20, (j / (gridCount - 1)) * (Max[1] - Min[1]) + Min[1], Math.Pow(pnt1[2] - pnt2[2], 2)), Math.Pow(((pnt1[2] - pnt2[2]) / pnt1[2]), 1).ToString("#0.00"), new Font(FontFamily.GenericSansSerif, 12.0f), Color.White, ContentAlignment.BottomCenter)); } } SurfaceRBF tmpSurf2 = new SurfaceRBF(null, "error", errorSurfPnts, targetBasis, targetPoly, 0.0); List<KeyValuePair<double[], double>> errorpts = tmpSurf2.GetMeshPointsCvt(50, 50, max, min, null); MulticolorOnVerticesMesh errorMesh = new MulticolorOnVerticesMesh(0); CreateMesh(errorpts, 50, ref errorMesh); errorMesh.RegenMode = devDept.Eyeshot.Standard.Entity.regenType.RegenAndCompile; errorMesh.EntityData = "errorSurface"; errorMesh.Translate(GridSize * 20, 0, 0); AddEntity(errorMesh, false); List<KeyValuePair<double[], double>> pts = tmpSurf.GetMeshPointsCvt(60, 60, max, min, null); MulticolorOnVerticesMesh bestMesh = new MulticolorOnVerticesMesh(0); CreateMesh(pts, 60, ref bestMesh); bestMesh.RegenMode = devDept.Eyeshot.Standard.Entity.regenType.RegenAndCompile; bestMesh.EntityData = "bestSurface"; bestMesh.Translate(-2 * GridSize * 10, 0, 0); devDept.Eyeshot.Labels.TextOnly bestBasis = new devDept.Eyeshot.Labels.TextOnly(new Point3D(((gridCount / 2.0) / (gridCount - 1)) * (Max[0] - Min[0]) + Min[0] - (2 * GridSize * 10), ((gridCount / 2.0) / (gridCount - 1)) * (Max[1] - Min[1]) + Min[1], 20), GeneticBasis.ToString(), new Font(FontFamily.GenericSansSerif, 12.0f), Color.White, ContentAlignment.BottomCenter); viewportProfessional1.Labels.Clear(); labels.ForEach((label) => { viewportProfessional1.Labels.Add(label); }); viewportProfessional1.Labels.Add(bestBasis); AddEntity(bestMesh, false); //for (int i = 0; i < fitpoints.Count; i++) //fitpoints[i][2] -= 15; //offset PointCloud fits = new PointCloud(doubleToPoint3d(fitpoints), 7.5f, Color.Blue); fits.EntityData = "bestpoints"; AddEntity(fits, true); pts.Clear(); bestChromo.Clear(); //GC.Collect(); } }
private void CreateNewTargetSurface() { targetPoly = new RBFPolynomials.Paraboloid(null); switch (TargetBasis) { case BasisType.Cubic: targetBasis = new RBFBasis.PolyHarmonic3(null); break; case BasisType.Gaussian: targetBasis = new RBFBasis.Gaussian(null); break; case BasisType.Line: targetBasis = new RBFBasis.CustomBasis(null, 0, 0, 1, 0); break; case BasisType.Parabolic: targetBasis = new RBFBasis.ThinPlateSpline2(null); break; case BasisType.CubicParabolic: targetBasis = new RBFBasis.CustomBasis(null, 1, 1, -1, 0); break; } List<double[]> pnts = RandomizePoints(GridSize); target = new SurfaceRBF(null, "target", pnts, targetBasis, targetPoly, 0.0); Max[0] = Max[1] = Max[2] = -1e9; //start max low Min[0] = Min[1] = Min[2] = +1e9; //start min high pnts.ForEach((double[] v) => { for (int i = 0; i < v.Length; i++) //get fit points' bounding box { Max[i] = Math.Max(v[i], Max[i]); Min[i] = Math.Min(v[i], Min[i]); } }); List<KeyValuePair<double[], double>> pts = target.GetMeshPointsCvt(60, 60, Max, Min, null); CreateMesh(pts, 60, ref m_targetMesh); TargetMesh.RegenMode = devDept.Eyeshot.Standard.Entity.regenType.RegenAndCompile; TargetMesh.EntityData = "targetSurface"; AddEntity(TargetMesh, false); PointCloud fits = new PointCloud(doubleToPoint3d(pnts), 5.0f, Color.Red); fits.EntityData = "fitpoints"; AddEntity(fits, true); GC.Collect(); }