package org.geogebra.common.kernel.geos; import java.util.ArrayList; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.MatrixTransformable; import org.geogebra.common.kernel.MyPoint; import org.geogebra.common.kernel.SegmentType; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.common.kernel.Matrix.Coords; import org.geogebra.common.kernel.discrete.tsp.impl.Point; import org.geogebra.common.plugin.GeoClass; /** * Class for polylines created using pen * * @author Zbynek */ public class GeoLocusStroke extends GeoLocus implements MatrixTransformable, Translateable { /** * @param cons * construction */ public GeoLocusStroke(Construction cons) { super(cons); setVisibleInView3D(false); } @Override public GeoClass getGeoClassType() { return GeoClass.PENSTROKE; } @Override public String toString(StringTemplate tpl) { return label; } @Override public boolean isPinnable() { return true; } @Override final public boolean isAlgebraViewEditable() { return false; } @Override public boolean isLabelVisible() { return false; } @Override public boolean needToShowBothRowsInAV() { return false; } @Override public GeoElement copy() { GeoLocusStroke ret = new GeoLocusStroke(cons); ret.set(this); return ret; } @Override public ArrayList<MyPoint> getPointsWithoutControl() { ArrayList<MyPoint> points = new ArrayList<MyPoint>(); for (MyPoint pt : getPoints()) { if (pt.getSegmentType() != SegmentType.CONTROL) { // also ignore third point added to simple segment // to able to calc control points if (!(!points.isEmpty() && points.get(points.size() - 1).getSegmentType() == pt .getSegmentType() && Kernel.isZero(points.get(points.size() - 1) .distance((Point) pt)))) { points.add(pt); } } } return points; } @Override public void matrixTransform(double a00, double a01, double a10, double a11) { for (MyPoint pt : getPoints()) { double x = pt.x; double y = pt.y; pt.x = a00 * x + a01 * y; pt.y = a10 * x + a11 * y; } } @Override public void matrixTransform(double a00, double a01, double a02, double a10, double a11, double a12, double a20, double a21, double a22) { for (MyPoint pt : getPoints()) { double x = pt.x; double y = pt.y; double z = a20 * x + a21 * y + a22; pt.x = (a00 * x + a01 * y + a02) / z; pt.y = (a10 * x + a11 * y + a12) / z; } } /** * @return the definitng points */ public MyPoint[] getPointsND() { // if (getParentAlgorithm() instanceof AlgoLocusStroke) { // return ((AlgoLocusStroke) getParentAlgorithm()).getPointsND(); // } MyPoint[] pts = new MyPoint[getPoints().size()]; int i = 0; for (MyPoint pt : getPoints()) { pts[i++] = pt; } return pts; } @Override public boolean isTranslateable() { return true; } @Override public void translate(Coords v) { for (MyPoint pt : getPoints()) { pt.x += v.getX(); pt.y += v.getY(); } resetPointsWithoutControl(); } @Override public boolean isMoveable() { return true; } @Override public boolean isFillable() { return false; } @Override public boolean isIndependent() { return true; } @Override public boolean isAlgebraDuplicateable() { return false; } }