/* 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 Ideone
{
{
Scanner in
= new Scanner
( System .
in ) ; double p1x, p1y, p2x, p2y; //point
double x, y; //intersection points
double cx, cy, r; //circle
System .
out .
print ( "Enter cx: " ) ; cx = in.nextDouble ( ) ;
System .
out .
print ( "Enter cy: " ) ; cy = in.nextDouble ( ) ;
System .
out .
print ( "Enter r: " ) ; r = in.nextDouble ( ) ;
System .
out .
print ( "Enter p1x: " ) ; p1x = in.nextDouble ( ) ;
System .
out .
print ( "Enter p1y: " ) ; p1y = in.nextDouble ( ) ;
System .
out .
print ( "Enter p2x: " ) ; p2x = in.nextDouble ( ) ;
System .
out .
print ( "Enter p2y: " ) ; p2y = in.nextDouble ( ) ;
if ( p2x == p1x) {
//line is vertical, or both points are in the same position.
double dx = p2x - cx;
if ( dx* dx< r* r) {
//infinite line hits circle check y values.
} else {
System .
out .
println ( "doesn't touch." ) ; }
} else {
double m = ( p2y - p1y) / ( p2x - p1x) ;
double b = p1y - m* p1x;
double B = ( b - m* cx- cy) ;
if ( ( r* r* ( m* m+ 1 ) ) > B* B) {
//inifinite line hits the circle. Now to solve the actual x positions.
double radical
= Math .
sqrt ( ( m
* m
+ 1 ) * r
* r
- B
* B
) ; double x0 = cx + ( - m* B + radical) / ( m* m+ 1 ) ;
double x1 = cx + ( - m* B - radical) / ( m* m+ 1 ) ;
System .
out .
println ( "infinite line touches at: " + x0
+ ", and " + x1
) ; //finaly check if either x0 or x1 are between p1x and p2x.
if ( ( x0> p1x&& x0< p2x) || ( x0> p2x&& x0< p1x) || ( x1> p1x&& x1< p2x) || ( x1> p2x&& x1< p1x) ) {
System .
out .
println ( "line segment touches" ) ; }
} else {
System .
out .
println ( "doesn't touch" ) ; }
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCVNjYW5uZXIgaW4gPSBuZXcgU2Nhbm5lciggU3lzdGVtLmluKTsKICAgIGRvdWJsZSBwMXgsIHAxeSwgcDJ4LCBwMnk7IC8vcG9pbnQKICAgIGRvdWJsZSB4LCB5OyAvL2ludGVyc2VjdGlvbiBwb2ludHMKICAgIGRvdWJsZSBjeCwgY3ksIHI7IC8vY2lyY2xlCgogICAgU3lzdGVtLm91dC5wcmludCgiRW50ZXIgY3g6ICIpOwogICAgY3ggPSBpbi5uZXh0RG91YmxlKCk7CiAgICBTeXN0ZW0ub3V0LnByaW50KCJFbnRlciBjeTogIik7CiAgICBjeSA9IGluLm5leHREb3VibGUoKTsKICAgIFN5c3RlbS5vdXQucHJpbnQoIkVudGVyIHI6ICIpOwogICAgciA9IGluLm5leHREb3VibGUoKTsKICAgIFN5c3RlbS5vdXQucHJpbnQoIkVudGVyIHAxeDogIik7CiAgICBwMXggPSBpbi5uZXh0RG91YmxlKCk7CiAgICBTeXN0ZW0ub3V0LnByaW50KCJFbnRlciBwMXk6ICIpOwogICAgcDF5ID0gaW4ubmV4dERvdWJsZSgpOwogICAgU3lzdGVtLm91dC5wcmludCgiRW50ZXIgcDJ4OiAiKTsKICAgIHAyeCA9IGluLm5leHREb3VibGUoKTsKICAgIFN5c3RlbS5vdXQucHJpbnQoIkVudGVyIHAyeTogIik7CiAgICBwMnkgPSBpbi5uZXh0RG91YmxlKCk7CiAgICAKICAgIGlmKHAyeCA9PSBwMXgpewogICAgCS8vbGluZSBpcyB2ZXJ0aWNhbCwgb3IgYm90aCBwb2ludHMgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uLgogICAgCWRvdWJsZSBkeCA9IHAyeCAtIGN4OwogICAgCWlmKGR4KmR4PHIqcil7CiAgICAJCS8vaW5maW5pdGUgbGluZSBoaXRzIGNpcmNsZSBjaGVjayB5IHZhbHVlcy4KICAgIAkJCiAgICAJfSBlbHNlewogICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvZXNuJ3QgdG91Y2guIik7CiAgICAJfQogICAgfSBlbHNlewogICAgCiAgICAgICAgZG91YmxlIG0gPSAocDJ5IC0gcDF5KS8ocDJ4IC0gcDF4KTsKICAgIAogICAgICAgIGRvdWJsZSBiID0gcDF5IC0gbSpwMXg7CiAgICAKICAgICAgICBkb3VibGUgQiA9IChiIC0gbSpjeC1jeSk7CiAgICAgICAgaWYoKHIqcioobSptKzEpKT5CKkIpewogICAgCSAgICAvL2luaWZpbml0ZSBsaW5lIGhpdHMgdGhlIGNpcmNsZS4gTm93IHRvIHNvbHZlIHRoZSBhY3R1YWwgeCBwb3NpdGlvbnMuCiAgICAJICAgIGRvdWJsZSByYWRpY2FsID0gTWF0aC5zcXJ0KChtKm0rMSkqcipyIC0gQipCKTsKICAgIAkgICAgZG91YmxlIHgwID0gY3ggKyAoLW0qQiArIHJhZGljYWwpLyhtKm0rMSk7CiAgICAJICAgIGRvdWJsZSB4MSA9IGN4ICsgKC1tKkIgLSByYWRpY2FsKS8obSptKzEpOwogICAgCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oImluZmluaXRlIGxpbmUgdG91Y2hlcyBhdDogIiArIHgwICsgIiwgYW5kICIgKyB4MSk7CiAgICAgICAgICAgIC8vZmluYWx5IGNoZWNrIGlmIGVpdGhlciB4MCBvciB4MSBhcmUgYmV0d2VlbiBwMXggYW5kIHAyeC4KICAgICAgICAgICAgaWYoKHgwPnAxeCYmeDA8cDJ4KXx8KHgwPnAyeCYmeDA8cDF4KXx8KHgxPnAxeCYmeDE8cDJ4KXx8KHgxPnAyeCYmeDE8cDF4KSl7CiAgICAgICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oImxpbmUgc2VnbWVudCB0b3VjaGVzIik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2V7CiAgICAJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9lc24ndCB0b3VjaCIpOwogICAgICAgIH0KICAgIH0KCX0KfQ==