@Override // from interface IArc public Arc clone () { return new Arc(x(), y(), width(), height(), angleStart(), angleExtent(), arcType()); }
@Override // from interface IArc public boolean containsAngle (float angle) { float extent = angleExtent(); if (extent >= 360f) { return true; } angle = normAngle(angle); float a1 = normAngle(angleStart()); float a2 = a1 + extent; if (a2 > 360f) { return angle >= a1 || angle <= a2 - 360f; } if (a2 < 0f) { return angle >= a2 + 360f || angle <= a1; } return (extent > 0f) ? a1 <= angle && angle <= a2 : a2 <= angle && angle <= a1; }
@Override // from RectangularShape public boolean contains (float px, float py) { // normalize point float nx = (px - x()) / width() - 0.5f; float ny = (py - y()) / height() - 0.5f; if ((nx * nx + ny * ny) > 0.25) { return false; } float extent = angleExtent(); float absExtent = Math.abs(extent); if (absExtent >= 360f) { return true; } boolean containsAngle = containsAngle(FloatMath.toDegrees(-FloatMath.atan2(ny, nx))); if (arcType() == PIE) { return containsAngle; } if (absExtent <= 180f && !containsAngle) { return false; } Line l = new Line(startPoint(), endPoint()); int ccw1 = l.relativeCCW(px, py); int ccw2 = l.relativeCCW(centerX(), centerY()); return ccw1 == 0 || ccw2 == 0 || ((ccw1 + ccw2) == 0 ^ absExtent > 180f); }
@Override // from RectangularShape public boolean contains (float rx, float ry, float rw, float rh) { if (!(contains(rx, ry) && contains(rx + rw, ry) && contains(rx + rw, ry + rh) && contains(rx, ry + rh))) { return false; } float absExtent = Math.abs(angleExtent()); if (arcType() != PIE || absExtent <= 180f || absExtent >= 360f) { return true; } Rectangle r = new Rectangle(rx, ry, rw, rh); float cx = centerX(), cy = centerY(); if (r.contains(cx, cy)) { return false; } Point p1 = startPoint(), p2 = endPoint(); return !r.intersectsLine(cx, cy, p1.x(), p1.y()) && !r.intersectsLine(cx, cy, p2.x(), p2.y()); }
if (isEmpty() || rw <= 0f || rh <= 0f) { return false; if (contains(rx, ry) || contains(rx + rw, ry) || contains(rx, ry + rh) || contains(rx + rw, ry + rh)) { return true; float cx = centerX(), cy = centerY(); Point p1 = startPoint(), p2 = endPoint(); if (r.contains(p1) || r.contains(p2) || (arcType() == PIE && r.contains(cx, cy))) { return true; if (arcType() == PIE) { if (r.intersectsLine(p1.x(), p1.y(), cx, cy) || r.intersectsLine(p2.x(), p2.y(), cx, cy)) { return contains(nx, ny);
@Override // from RectangularShape public boolean isEmpty () { return arcType() == OPEN || super.isEmpty(); }
@Override // from interface IArc public Point endPoint () { return endPoint(new Point()); }
@Override // from RectangularShape public boolean contains (float px, float py) { // normalize point float nx = (px - x()) / width() - 0.5f; float ny = (py - y()) / height() - 0.5f; if ((nx * nx + ny * ny) > 0.25) { return false; } float extent = angleExtent(); float absExtent = Math.abs(extent); if (absExtent >= 360f) { return true; } boolean containsAngle = containsAngle(FloatMath.toDegrees(-FloatMath.atan2(ny, nx))); if (arcType() == PIE) { return containsAngle; } if (absExtent <= 180f && !containsAngle) { return false; } Line l = new Line(startPoint(), endPoint()); int ccw1 = l.relativeCCW(px, py); int ccw2 = l.relativeCCW(centerX(), centerY()); return ccw1 == 0 || ccw2 == 0 || ((ccw1 + ccw2) == 0 ^ absExtent > 180f); }
@Override // from RectangularShape public boolean contains (float rx, float ry, float rw, float rh) { if (!(contains(rx, ry) && contains(rx + rw, ry) && contains(rx + rw, ry + rh) && contains(rx, ry + rh))) { return false; } float absExtent = Math.abs(angleExtent()); if (arcType() != PIE || absExtent <= 180f || absExtent >= 360f) { return true; } Rectangle r = new Rectangle(rx, ry, rw, rh); float cx = centerX(), cy = centerY(); if (r.contains(cx, cy)) { return false; } Point p1 = startPoint(), p2 = endPoint(); return !r.intersectsLine(cx, cy, p1.x(), p1.y()) && !r.intersectsLine(cx, cy, p2.x(), p2.y()); }
if (isEmpty() || rw <= 0f || rh <= 0f) { return false; if (contains(rx, ry) || contains(rx + rw, ry) || contains(rx, ry + rh) || contains(rx + rw, ry + rh)) { return true; float cx = centerX(), cy = centerY(); Point p1 = startPoint(), p2 = endPoint(); if (r.contains(p1) || r.contains(p2) || (arcType() == PIE && r.contains(cx, cy))) { return true; if (arcType() == PIE) { if (r.intersectsLine(p1.x(), p1.y(), cx, cy) || r.intersectsLine(p2.x(), p2.y(), cx, cy)) { return contains(nx, ny);
@Override // from interface IArc public boolean containsAngle (float angle) { float extent = angleExtent(); if (extent >= 360f) { return true; } angle = normAngle(angle); float a1 = normAngle(angleStart()); float a2 = a1 + extent; if (a2 > 360f) { return angle >= a1 || angle <= a2 - 360f; } if (a2 < 0f) { return angle >= a2 + 360f || angle <= a1; } return (extent > 0f) ? a1 <= angle && angle <= a2 : a2 <= angle && angle <= a1; }
@Override // from RectangularShape public boolean isEmpty () { return arcType() == OPEN || super.isEmpty(); }
@Override // from interface IArc public Point endPoint () { return endPoint(new Point()); }
@Override // from RectangularShape public Rectangle bounds (Rectangle target) { if (isEmpty()) { target.setBounds(x(), y(), width(), height()); return target; } float rx1 = x(); float ry1 = y(); float rx2 = rx1 + width(); float ry2 = ry1 + height(); Point p1 = startPoint(), p2 = endPoint(); float bx1 = containsAngle(180f) ? rx1 : Math.min(p1.x(), p2.x()); float by1 = containsAngle(90f) ? ry1 : Math.min(p1.y(), p2.y()); float bx2 = containsAngle(0f) ? rx2 : Math.max(p1.x(), p2.x()); float by2 = containsAngle(270f) ? ry2 : Math.max(p1.y(), p2.y()); if (arcType() == PIE) { float cx = centerX(); float cy = centerY(); bx1 = Math.min(bx1, cx); by1 = Math.min(by1, cy); bx2 = Math.max(bx2, cx); by2 = Math.max(by2, cy); } target.setBounds(bx1, by1, bx2 - bx1, by2 - by1); return target; }
@Override // from interface IArc public Arc clone () { return new Arc(x(), y(), width(), height(), angleStart(), angleExtent(), arcType()); }
@Override // from RectangularShape public Rectangle bounds (Rectangle target) { if (isEmpty()) { target.setBounds(x(), y(), width(), height()); return target; } float rx1 = x(); float ry1 = y(); float rx2 = rx1 + width(); float ry2 = ry1 + height(); Point p1 = startPoint(), p2 = endPoint(); float bx1 = containsAngle(180f) ? rx1 : Math.min(p1.x(), p2.x()); float by1 = containsAngle(90f) ? ry1 : Math.min(p1.y(), p2.y()); float bx2 = containsAngle(0f) ? rx2 : Math.max(p1.x(), p2.x()); float by2 = containsAngle(270f) ? ry2 : Math.max(p1.y(), p2.y()); if (arcType() == PIE) { float cx = centerX(); float cy = centerY(); bx1 = Math.min(bx1, cx); by1 = Math.min(by1, cy); bx2 = Math.max(bx2, cx); by2 = Math.max(by2, cy); } target.setBounds(bx1, by1, bx2 - bx1, by2 - by1); return target; }
@Override // from interface IArc public Point endPoint (Point target) { float a = FloatMath.toRadians(angleStart() + angleExtent()); return target.set(x() + (1f + FloatMath.cos(a)) * width() / 2f, y() + (1f - FloatMath.sin(a)) * height() / 2f); }
@Override // from interface IArc public Point endPoint (Point target) { float a = FloatMath.toRadians(angleStart() + angleExtent()); return target.set(x() + (1f + FloatMath.cos(a)) * width() / 2f, y() + (1f - FloatMath.sin(a)) * height() / 2f); }
@Override // from interface IArc public Point startPoint (Point target) { float a = FloatMath.toRadians(angleStart()); return target.set(x() + (1f + FloatMath.cos(a)) * width() / 2f, y() + (1f - FloatMath.sin(a)) * height() / 2f); }
@Override // from interface IArc public Point startPoint (Point target) { float a = FloatMath.toRadians(angleStart()); return target.set(x() + (1f + FloatMath.cos(a)) * width() / 2f, y() + (1f - FloatMath.sin(a)) * height() / 2f); }