package edu.stanford.rsl.conrad.geometry.shapes.simple; import edu.stanford.rsl.conrad.geometry.AbstractShape; import edu.stanford.rsl.conrad.geometry.transforms.Transform; import edu.stanford.rsl.conrad.numerics.SimpleVector; import edu.stanford.rsl.conrad.utils.CONRAD; public class Edge extends StraightLine { /** * */ private static final long serialVersionUID = 3399981161692525136L; protected double end; protected PointND endPoint; private double length; public Edge(PointND point, PointND point2) { super(point, point2); end = 1; endPoint = point2; length = point.euclideanDistance(point2); this.min = new PointND(point); this.max = new PointND(point); for (int i=0; i < point.getDimension();i++){ min.set(i, Math.min(point.get(i), point2.get(i))); max.set(i, Math.max(point.get(i), point2.get(i))); } } public Edge(Edge e){ super(e); end = e.end; length = e.length; endPoint = (e.endPoint != null) ? e.endPoint.clone() : null; } public void setEnds(PointND point, PointND point2){ super.init(point, point2); end = 1; endPoint = point2; length = point.euclideanDistance(point2); for (int i=0; i < point.getDimension();i++){ min.set(i, Math.min(point.get(i), point2.get(i))); max.set(i, Math.max(point.get(i), point2.get(i))); } } public double getLastInternalIndex(){ return end; } public PointND getEnd(){ return endPoint; } @Override public boolean isBounded() { return true; } @Override public PointND intersect(StraightLine line) { try { SimpleVector lambda = computeIntersectionCoefficients(line); if (!((lambda.getElement(0) < -CONRAD.FLOAT_EPSILON) || (lambda.getElement(0) >= end + CONRAD.FLOAT_EPSILON))){ PointND p1 = evaluate(lambda.getElement(0)); PointND p2 = line.evaluate(lambda.getElement(1)); if (p1 != null) { if (p1.euclideanDistance(p2) < CONRAD.SMALL_VALUE){ return p1; } } } } catch (IllegalArgumentException e){ System.err.println("edu.stanford.rsl.conrad.geometry.shapes.simple.Edge Line 69: Intersection with degenerated triangle produced no intersection" + e.getMessage()); } return null; } @Override public PointND evaluate(double u){ if (u <= end){ return super.evaluate(u); } else { return null; } } @Override public boolean equals(Object o) { if (o instanceof Edge) { Edge e = (Edge) o; return ((getEnd().equals(e.getEnd()) && getPoint().equals(e.getPoint())) || (getPoint().equals(e.getEnd()) && getEnd().equals(e.getPoint()))); //return (point == e.endPoint && endPoint == e.point) || //(endPoint == e.endPoint && point == e.point); } else { return false; } } @Override public String toString(){ return getPoint() + " " + getEnd(); } public PointND[] getRasterPoints(int number){ PointND [] points = new PointND [number]; double step = end / (number - 1.0); //System.out.println(step + " " + number); points[0] = new PointND(point); points[number-1] = new PointND(endPoint); //SimpleVector increment = direction.multipliedBy(step); for (int i = number -2; i > 0; i--){ //System.out.println(i + " " + step + " "+ i*step + "points[i] = " + evaluate(i*step)); points[i] = evaluate(i*step); } return points; } @Override public void applyTransform(Transform t){ super.applyTransform(t); endPoint = t.transform(endPoint); this.min = t.transform(this.min); this.max = t.transform(this.max); } /** * Returns length of edge in mm * @return the length */ public double getLength(){ return length; } @Override public AbstractShape clone() { return new Edge(this); } } /* * Copyright (C) 2010-2014 Andreas Maier, Rotimi X Ojo * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */