public boolean intersectsWith(LineSegment<Vector2> segment) { float r2 = radius * radius; return (segment.asLine().distanceToSquared(center) < r2 && segment.isInsideInterval(center)) || center.distanceQuad(segment.getStart()) < r2 || center.distanceQuad(segment.getEnd()) < r2; }
@Override public LineSegment<E> next() { prev = next; next = iter.next(); return new LineSegment(prev, next); }
public <E extends Vector<E>> Collection<ImmutableVector<E>> buildExtrudedPolygon( Path<E> path, float extrude) { if (path.size() < 2) { throw new RuntimeException("The path is not complete, at least two elements have to exist!"); } Deque<ImmutableVector<E>> poly = new LinkedList<>(); Iterator<LineSegment<E>> iter = path.getLineSegmentIterator(); LineSegment<E> accLine = iter.next(); //Start poly punkte erstellen ImmutableVector[] p = generateExtrudedEndPoints(accLine.getStart(), accLine.getEnd(), extrude); poly.addFirst(p[0]); poly.addLast(p[1]); while (iter.hasNext()) { LineSegment<E> newLine = iter.next(); p = generateExtrudedPoints(accLine.getStart(), accLine.getEnd(), newLine.getEnd(), extrude); poly.addFirst(p[0]); poly.addLast(p[1]); accLine = newLine; } //end poly punkte erstellen p = generateExtrudedEndPoints(accLine.getEnd(), accLine.getStart(), extrude); poly.addFirst(p[1]); poly.addLast(p[0]); return poly; }
ImmutableVector<E> start = last.getStart(); newPath.addPathElement(last.getStart().clone()); last = segments.next(); E dir1 = start.clone().sub(last.getStart()); E dir2 = start.clone().sub(last.getEnd()); E dir3 = last.getStart().clone().sub(last.getEnd()); newPath.addPathElement(last.getStart().clone()); break; newPath.addPathElement(last.getEnd().clone()); return newPath;
public LineSegment<E> getClosingSegment() { return new LineSegment<>(positions.get(positions.size() - 1), positions.get(0)); }
public Iterator<LineSegment<E>> getLineSegmentIterator() { return new Iterator<LineSegment<E>>() { Iterator<E> iter = positions.iterator(); E prev, next = iter.next(); @Override public boolean hasNext() { return iter.hasNext(); } @Override public LineSegment<E> next() { prev = next; next = iter.next(); return new LineSegment(prev, next); } @Override public void remove() { throw new UnsupportedOperationException("Not supported yet."); } }; }
public LineSegment<E> offset(ImmutableVector<E> offset) { return new LineSegment<>(start.clone().add(offset), end.clone().add(offset)); }
/** * @param line < p/> * <p/> * @return <b>null</b> if the line does not intersect with the circle */ public LineSegment<Vector2> getIntersection(Line<Vector2> line) { assert !contains(line.getStartingPoint()); Vector2 toCircle = center.clone().sub(line.getStartingPoint()); float distSquare = (float) toCircle.lengthQuad(); if (distSquare == 0) { toCircle = center.clone().sub(line.getStartingPoint().clone().add(line.getDirection())); distSquare = (float) toCircle.lengthQuad(); } float t = toCircle.dot(line.getDirection()); float tmp = radius * radius - distSquare + t * t; if (tmp < 0) { return null;//no intersection } float f = (float) sqrt(tmp); return new LineSegment<>(line.getDirection().clone().mul(t - f).add(line.getStartingPoint()), line.getDirection().clone().mul(t + f).add(line.getStartingPoint())); }