package org.geogebra.common.kernel.algos; import java.util.ArrayList; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.MyPoint; import org.geogebra.common.kernel.commands.Commands; import org.geogebra.common.kernel.geos.GeoLocusable; import org.geogebra.common.kernel.geos.GeoNumeric; import org.geogebra.common.kernel.geos.GeoPoint; public class AlgoFirstLocus extends AlgoFirst { public AlgoFirstLocus(Construction cons, String label, GeoLocusable inputLocus, GeoNumeric n) { super(cons, label, inputLocus.toGeoElement(), n); } @Override public Commands getClassName() { return Commands.First; } @Override public final void compute() { ArrayList<MyPoint> points = ((GeoLocusable) inputList).getPoints(); size = points.size(); int outsize = n == null ? 1 : (int) n.getDouble(); if (!inputList.isDefined() || size == 0 || outsize < 0 || outsize > size) { outputList.setUndefined(); return; } outputList.setDefined(true); if (outsize == 0) { outputList.clear(); return; // return empty list } int outputListSize = outputList.size(); // remove extra elements if (outputList.size() > outsize) { for (int i = outputListSize - 1; i >= outsize; i--) { outputList.remove(i); } } // avoid label creation for (int i = 0; i < outsize; i++) { MyPoint mp = points.get(i); if (i < outputList.size()) { // recycle existing GeoPoint // important to avoid memory problems // (and quicker?) GeoPoint p = (GeoPoint) outputList.get(i); p.setCoords(mp.x, mp.y, 1.0); p.updateRepaint(); } else { outputList.addPoint(mp.x, mp.y, 1.0, null); } } } }