This documentation is automatically generated by online-judge-tools/verification-helper
This project is maintained by tsutaj
// 直線 a1, a2 と円 C との交点 // Verified: AOJ CGL_7_D: Cross Points of a Circle and a Line vector<Point> crossp_lc(Point a1, Point a2, Circle c) { vector<Point> ps; double r = c.second; Point ft = projection(a1, a2, c.first); if(!GEQ(r*r, norm(ft-c.first))) return ps; Point dir = sqrt(max(r*r - norm(ft-c.first), 0.0)) / abs(a2-a1) * (a2-a1); ps.push_back(ft + dir); if(!EQ(r*r, norm(ft-c.first))) ps.push_back(ft - dir); return ps; } // 円 x と円 y の交点 // Verified: AOJ CGL_7_E: Cross Points of Circles vector<Point> crossp_cc(Circle x, Circle y) { vector<Point> ps; Point a = x.first, b = y.first; double ar = x.second, br = y.second; Point ab = b-a; double d = abs(ab); double crL = (norm(ab) + ar * ar - br * br) / (2 * d); if(EQ(d,0) || ar < abs(crL)) return ps; Point abN = ab * Point(0, sqrt(ar*ar - crL*crL) / d); Point cp = a + crL/d * ab; ps.push_back(cp + abN); if(!EQ(norm(abN), 0)) ps.push_back(cp - abN); return ps; }
#line 1 "geometry/old/gmtr_005_circle_crossp.cpp" // 直線 a1, a2 と円 C との交点 // Verified: AOJ CGL_7_D: Cross Points of a Circle and a Line vector<Point> crossp_lc(Point a1, Point a2, Circle c) { vector<Point> ps; double r = c.second; Point ft = projection(a1, a2, c.first); if(!GEQ(r*r, norm(ft-c.first))) return ps; Point dir = sqrt(max(r*r - norm(ft-c.first), 0.0)) / abs(a2-a1) * (a2-a1); ps.push_back(ft + dir); if(!EQ(r*r, norm(ft-c.first))) ps.push_back(ft - dir); return ps; } // 円 x と円 y の交点 // Verified: AOJ CGL_7_E: Cross Points of Circles vector<Point> crossp_cc(Circle x, Circle y) { vector<Point> ps; Point a = x.first, b = y.first; double ar = x.second, br = y.second; Point ab = b-a; double d = abs(ab); double crL = (norm(ab) + ar * ar - br * br) / (2 * d); if(EQ(d,0) || ar < abs(crL)) return ps; Point abN = ab * Point(0, sqrt(ar*ar - crL*crL) / d); Point cp = a + crL/d * ab; ps.push_back(cp + abN); if(!EQ(norm(abN), 0)) ps.push_back(cp - abN); return ps; }