@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 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 interface IArc public Arc clone () { return new Arc(x(), y(), width(), height(), angleStart(), angleExtent(), arcType()); }
@Override // from interface IArc public Arc clone () { return new Arc(x(), y(), width(), height(), angleStart(), angleExtent(), arcType()); }
@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 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 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()); }
@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()); }