/* * Copyright 2006, United States Government as represented by the Administrator * for the National Aeronautics and Space Administration. No copyright is * claimed in the United States under Title 17, U.S. Code. All Other Rights * Reserved. */ package gov.nasa.ial.mde.solver.numeric; import gov.nasa.ial.mde.math.MultiPointXY; import java.util.Arrays; import java.util.Comparator; /** * A Polar model builder. * * @author Dr. Robert Shelton * @version 1.0 * @since 1.0 */ public class PolarModelBuilder extends DataModelBuilder { private final static int MAX_GENERATORS = 12; private final static int NUM_RS = 4, NUM_THETAS = 4; /** * Default constructor. */ public PolarModelBuilder() { super(); } // end PolarModelBuilder /** * Adds a new Polar point. * * @param r the radial coordinate. * @param theta the angular coordinate. */ public void addNewPoint(double r, double theta) { int i, j; double[] tempData = new double[MAX_GENERATORS]; tempData[0] = 1.0; tempData[1] = r; tempData[2] = 1.0 / r; tempData[3] = r * r; for (i = 1, j = NUM_RS; i <= NUM_THETAS; i++) { double phi = i * theta; tempData[j++] = Math.cos(phi); tempData[j++] = Math.sin(phi); } // end for i data.add(tempData); } // end addNewPoint /** * Adds a new multiple point. * * @param rt a multiple point in r and theta. */ public void addNewPoint(MultiPointXY rt) { double[] r = rt.yArray; int i, n = r.length; for (i = 0; i < n; i++) addNewPoint(r[i], rt.x); } // end addNewPoint /** * Returns the ranked models. * * @return the ranked models. */ public PolarModel[] getRankedModels() { PolarModel[] rpm = { new PolarEnchiladaModel(this), new PolarTrochoidModel(this), new PolarConicModel(this), new PolarRoseModel(this), new PolarLineModel(this), new PolarLemniscateModel(this) }; Arrays.sort(rpm, new Comparator<PolarModel>() { public int compare(PolarModel o1, PolarModel o2) { PolarModel p1 = (PolarModel)o1, p2 = (PolarModel)o2; if (p1.fit > p2.fit) { return 1; } if (p1.fit < p2.fit) { return -1; } return 0; } // end compare } // end new Comparator ); // end sort return rpm; } // end getRankedModels } // end class PolarModelBuilder