/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Capsule
{
double r;
{
this.c1 = c1;
this.c2 = c2;
this.r = r;
}
{
if(cu == null) return null;
double[] wh = new double[6];
wh
[0] = Point2D.
raySeg(r1, r2, p1, p2
); wh
[1] = Point2D.
raySeg(r1, r2, p3, p4
); Point2D.
rayCircle(r1, r2, c1, r, wh,
2); Point2D.
rayCircle(r1, r2, c2, r, wh,
4);
double hMin
= Double.
POSITIVE_INFINITY; double hMax
= Double.
NEGATIVE_INFINITY; for(double h : wh)
{
{
hMin
= Math.
min(h, hMin
); hMax
= Math.
max(h, hMax
); }
}
if(hMin
== hMax
) return new Point2D[]{iMin
}; }
{
double x;
double y;
{
this.x = x;
this.y = y;
}
// https://stackoverflow.com/a/1084899/6438819
{
double a = d.lengthSq();
double c = f.lengthSq() - r*r;
double disc = b*b-4*a*c;
if(disc < 0)
{
res
[off
] = res
[off
+1] = Double.
NaN; return;
}
double discRoot
= Math.
sqrt(disc
); res[off] = (-b - discRoot)/(2*a);
res[off+1] = (-b + discRoot)/(2*a);
}
// https://stackoverflow.com/a/565282/6438819
{
if(sr
== 0) return Double.
NaN;
double u = pqr /sr;
if(u
<0 || u
>1) return Double.
NaN;
return qps / rs;
}
{
return p1.x*p2.x + p1.y*p2.y;
}
{
return p1.x*p2.y - p1.y*p2.x;
}
{
return new Point2D(c.
x + u.
x*r, c.
y + u.
y*r
); }
// CCW
{
}
{
double d = length();
if(d == 0) return null;
}
public double length()
{
return Math.
sqrt(lengthSq
()); }
public double lengthSq()
{
return x*x+y*y;
}
{
return new Point2D(r2.
x-r1.
x, r2.
y-r1.
y); }
{
return String.
format("(%f, %f)", x, y
); }
public static double dist(double x2, double y2, int x3, int y3)
{
return Math.
sqrt((x3
-x2
)*(x3
-x2
) + (y3
-y2
)*(y3
-y2
)); }
public void set(int x, int y)
{
this.x = x;
this.y = y;
}
}
public static void main
(String[] args
) {
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgQ2Fwc3VsZQp7CiAgUG9pbnQyRCBjMSwgYzI7CiAgZG91YmxlIHI7CgogIHB1YmxpYyBDYXBzdWxlKFBvaW50MkQgYzEsIFBvaW50MkQgYzIsIGRvdWJsZSByKQogIHsKICAgIHRoaXMuYzEgPSBjMTsKICAgIHRoaXMuYzIgPSBjMjsKICAgIHRoaXMuciA9IHI7CiAgfQoKICBwdWJsaWMgUG9pbnQyRFtdIGludGVyc2VjdChQb2ludDJEIHIxLCBQb2ludDJEIHIyKQogIHsgICAgICAgIAogICAgUG9pbnQyRCBjdiA9IFBvaW50MkQuZGlmZihjMiwgYzEpOwogICAgUG9pbnQyRCBjdSA9IGN2LnVuaXQoKTsKICAgIGlmKGN1ID09IG51bGwpIHJldHVybiBudWxsOwogICAgUG9pbnQyRCBuY3UgPSBjdS5ub3JtKCk7CiAgICAKICAgIFBvaW50MkQgcDEgPSBQb2ludDJELmFkZFRpbWVzKGMxLCBuY3UsIHIpOwogICAgUG9pbnQyRCBwMiA9IFBvaW50MkQuYWRkVGltZXMoYzIsIG5jdSwgcik7CiAgICBQb2ludDJEIHAzID0gUG9pbnQyRC5hZGRUaW1lcyhjMSwgbmN1LCAtcik7CiAgICBQb2ludDJEIHA0ID0gUG9pbnQyRC5hZGRUaW1lcyhjMiwgbmN1LCAtcik7CiAgICAKICAgIGRvdWJsZVtdIHdoID0gbmV3IGRvdWJsZVs2XTsKICAgIHdoWzBdID0gUG9pbnQyRC5yYXlTZWcocjEsIHIyLCBwMSwgcDIpOwogICAgd2hbMV0gPSBQb2ludDJELnJheVNlZyhyMSwgcjIsIHAzLCBwNCk7CiAgICBQb2ludDJELnJheUNpcmNsZShyMSwgcjIsIGMxLCByLCB3aCwgMik7CiAgICBQb2ludDJELnJheUNpcmNsZShyMSwgcjIsIGMyLCByLCB3aCwgNCk7CiAgICAKICAgIGRvdWJsZSBoTWluID0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwogICAgZG91YmxlIGhNYXggPSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICBmb3IoZG91YmxlIGggOiB3aCkKICAgIHsKICAgICAgaWYoIURvdWJsZS5pc05hTihoKSkKICAgICAgewogICAgICAgIGhNaW4gPSBNYXRoLm1pbihoLCBoTWluKTsKICAgICAgICBoTWF4ID0gTWF0aC5tYXgoaCwgaE1heCk7CiAgICAgIH0KICAgIH0KICAgICAgICAKICAgIFBvaW50MkQgcmQgPSBQb2ludDJELmRpZmYocjIsIHIxKTsKICAgIFBvaW50MkQgaU1pbiA9IFBvaW50MkQuYWRkVGltZXMocjEsIHJkLCBoTWluKTsKICAgIGlmKGhNaW4gPT0gaE1heCkgcmV0dXJuIG5ldyBQb2ludDJEW117aU1pbn07CiAgICBQb2ludDJEIGlNYXggPSBQb2ludDJELmFkZFRpbWVzKHIxLCByZCwgaE1heCk7ICAgIAogICAgcmV0dXJuIG5ldyBQb2ludDJEW117aU1pbiwgaU1heH07CiAgfQogIAogIHN0YXRpYyBjbGFzcyBQb2ludDJEIAogIHsKICAgIGRvdWJsZSB4OwogICAgZG91YmxlIHk7CiAgICAKICAgIHB1YmxpYyBQb2ludDJEKGRvdWJsZSB4LCBkb3VibGUgeSkKICAgIHsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgIH0KCiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTA4NDg5OS82NDM4ODE5CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmF5Q2lyY2xlKFBvaW50MkQgcCwgUG9pbnQyRCBwZSwgUG9pbnQyRCBjYywgZG91YmxlIHIsIGRvdWJsZVtdIHJlcywgaW50IG9mZikKICAgIHsKICAgICAgUG9pbnQyRCBkID0gUG9pbnQyRC5kaWZmKHAsIHBlKTsKICAgICAgUG9pbnQyRCBmID0gUG9pbnQyRC5kaWZmKGNjLCBwKTsKICAgICAgCiAgICAgIGRvdWJsZSBhID0gZC5sZW5ndGhTcSgpOwogICAgICBkb3VibGUgYiA9IDIqUG9pbnQyRC5kb3QoZiwgZCk7CiAgICAgIGRvdWJsZSBjID0gZi5sZW5ndGhTcSgpIC0gcipyOwogICAgICAKICAgICAgZG91YmxlIGRpc2MgPSBiKmItNCphKmM7CiAgICAgIGlmKGRpc2MgPCAwKQogICAgICB7CiAgICAgICAgcmVzW29mZl0gPSByZXNbb2ZmKzFdID0gRG91YmxlLk5hTjsKICAgICAgICByZXR1cm47CiAgICAgIH0gICAgICAKICAgICAgZG91YmxlIGRpc2NSb290ID0gTWF0aC5zcXJ0KGRpc2MpOyAgICAgIAogICAgICByZXNbb2ZmXSA9ICgtYiAtIGRpc2NSb290KS8oMiphKTsKICAgICAgcmVzW29mZisxXSA9ICgtYiArIGRpc2NSb290KS8oMiphKTsKICAgIH0KICAgIAogICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU2NTI4Mi82NDM4ODE5CiAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSByYXlTZWcoUG9pbnQyRCBwLCBQb2ludDJEIHBlLCBQb2ludDJEIHEsIFBvaW50MkQgcWUpCiAgICB7CiAgICAgIFBvaW50MkQgciA9IFBvaW50MkQuZGlmZihwZSwgcCk7CiAgICAgIFBvaW50MkQgcyA9IFBvaW50MkQuZGlmZihxZSwgcSk7CiAgICAgIAogICAgICBkb3VibGUgc3IgPSBQb2ludDJELmNyb3NzKHMsIHIpOwogICAgICBpZihzciA9PSAwKSByZXR1cm4gRG91YmxlLk5hTjsKCiAgICAgIFBvaW50MkQgcHEgPSBQb2ludDJELmRpZmYocCwgcSk7CiAgICAgIGRvdWJsZSBwcXIgPSBQb2ludDJELmNyb3NzKHBxLCByKTsKICAgICAgCiAgICAgIGRvdWJsZSB1ID0gcHFyIC9zcjsKICAgICAgaWYodTwwIHx8IHU+MSkgcmV0dXJuIERvdWJsZS5OYU47IAogICAgICAgICAgICAgIAogICAgICBQb2ludDJEIHFwID0gUG9pbnQyRC5kaWZmKHEsIHApOwogICAgICBkb3VibGUgcnMgPSBQb2ludDJELmNyb3NzKHIsIHMpOwogICAgICBkb3VibGUgcXBzID0gUG9pbnQyRC5jcm9zcyhxcCwgcyk7CiAgICAgIHJldHVybiBxcHMgLyByczsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBkb3VibGUgZG90KFBvaW50MkQgcDEsIFBvaW50MkQgcDIpCiAgICB7CiAgICAgIHJldHVybiBwMS54KnAyLnggKyBwMS55KnAyLnk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIGNyb3NzKFBvaW50MkQgcDEsIFBvaW50MkQgcDIpCiAgICB7CiAgICAgIHJldHVybiBwMS54KnAyLnkgLSBwMS55KnAyLng7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBQb2ludDJEIGFkZFRpbWVzKFBvaW50MkQgYywgUG9pbnQyRCB1LCBkb3VibGUgcikKICAgIHsKICAgICAgcmV0dXJuIG5ldyBQb2ludDJEKGMueCArIHUueCpyLCBjLnkgKyB1Lnkqcik7CiAgICB9CgogICAgLy8gQ0NXCiAgICBwdWJsaWMgUG9pbnQyRCBub3JtKCkKICAgIHsKICAgICAgcmV0dXJuIG5ldyBQb2ludDJEKC15LCB4KTsKICAgIH0KCiAgICBwdWJsaWMgUG9pbnQyRCB1bml0KCkKICAgIHsKICAgICAgZG91YmxlIGQgPSBsZW5ndGgoKTsKICAgICAgaWYoZCA9PSAwKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIG5ldyBQb2ludDJEKHgvZCwgeS9kKTsKICAgIH0KCiAgICBwdWJsaWMgZG91YmxlIGxlbmd0aCgpCiAgICB7CiAgICAgIHJldHVybiBNYXRoLnNxcnQobGVuZ3RoU3EoKSk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBkb3VibGUgbGVuZ3RoU3EoKQogICAgewogICAgICByZXR1cm4geCp4K3kqeTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBQb2ludDJEIGRpZmYoUG9pbnQyRCByMiwgUG9pbnQyRCByMSkKICAgIHsKICAgICAgcmV0dXJuIG5ldyBQb2ludDJEKHIyLngtcjEueCwgcjIueS1yMS55KTsKICAgIH0KICAgIAogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICB7CiAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIoJWYsICVmKSIsIHgsIHkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGRpc3QoZG91YmxlIHgyLCBkb3VibGUgeTIsIGludCB4MywgaW50IHkzKQogICAgewogICAgICByZXR1cm4gTWF0aC5zcXJ0KCh4My14MikqKHgzLXgyKSArICh5My15MikqKHkzLXkyKSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0KGludCB4LCBpbnQgeSkKICAgIHsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgIH0KICB9CgogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCiAgewogICAgQ2Fwc3VsZSBjYXAgPSBuZXcgQ2Fwc3VsZShuZXcgUG9pbnQyRCgwLCAwKSwgbmV3IFBvaW50MkQoMiwgMCksIDAuNSk7CiAgICBQb2ludDJEW10gaCA9IGNhcC5pbnRlcnNlY3QobmV3IFBvaW50MkQoMSwgLTEpLCBuZXcgUG9pbnQyRCgxLCAxKSk7CiAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLnRvU3RyaW5nKGgpKTsKICB9Cn0K