From ed274774f865033ebce32d3932d24bdfd053951e Mon Sep 17 00:00:00 2001 From: Horace He Date: Sun, 3 Nov 2019 01:58:46 -0400 Subject: [PATCH 1/3] Added circle circle intersection area --- content/geometry/CircleCircleArea.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 content/geometry/CircleCircleArea.h diff --git a/content/geometry/CircleCircleArea.h b/content/geometry/CircleCircleArea.h new file mode 100644 index 000000000..204eea180 --- /dev/null +++ b/content/geometry/CircleCircleArea.h @@ -0,0 +1,21 @@ +/** + * Author: Takanori MAEHARA, chilli + * Date: 2019-11-03 + * License: CC0 + * Source: https://github.com/spaghetti-source/algorithm/blob/master/geometry/_geom.cc#L729 + * Description: Calculates the area of the intersection of 2 circles + * Status: + */ + +template +double intersection_area(P c, double cr, P d, double dr) { + if (cr < dr) swap(c, d); + auto A = [&](double r, double h) { + return r*r*acos(h/r)-h*sqrt(r*r-h*h); + }; + auto l = (c - d).dist(), a = (l*l + cr*cr - dr*dr)/(2*l); + if (sgn(l - cr - dr) >= 0) return 0; // far away + if (sgn(l - cr + dr) <= 0) return M_PI*dr*dr; + if (sgn(l - cr) >= 0) return A(cr, a) + A(dr, l-a); + else return A(cr, a) + M_PI*dr*dr - A(dr, a-l); +} From 5952d3ebba63ce082255a7a9ae626e0d41369470 Mon Sep 17 00:00:00 2001 From: Horace He Date: Mon, 4 Nov 2019 10:23:22 -0500 Subject: [PATCH 2/3] Responded to comments --- content/geometry/CircleCircleArea.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/content/geometry/CircleCircleArea.h b/content/geometry/CircleCircleArea.h index 204eea180..5d636d0be 100644 --- a/content/geometry/CircleCircleArea.h +++ b/content/geometry/CircleCircleArea.h @@ -8,14 +8,14 @@ */ template -double intersection_area(P c, double cr, P d, double dr) { - if (cr < dr) swap(c, d); - auto A = [&](double r, double h) { - return r*r*acos(h/r)-h*sqrt(r*r-h*h); - }; - auto l = (c - d).dist(), a = (l*l + cr*cr - dr*dr)/(2*l); - if (sgn(l - cr - dr) >= 0) return 0; // far away - if (sgn(l - cr + dr) <= 0) return M_PI*dr*dr; - if (sgn(l - cr) >= 0) return A(cr, a) + A(dr, l-a); - else return A(cr, a) + M_PI*dr*dr - A(dr, a-l); +double circleCircleArea(P c, double cr, P d, double dr) { + if (cr < dr) swap(c, d), swap(cr, dr); + auto A = [&](double r, double h) { + return r*r*acos(h/r)-h*sqrt(r*r-h*h); + }; + auto l = (c - d).dist(), a = (l*l + cr*cr - dr*dr)/(2*l); + if (sgn(l - cr - dr) >= 0) return 0; // far away + if (sgn(l - cr + dr) <= 0) return M_PI*dr*dr; + if (sgn(l - cr) >= 0) return A(cr, a) + A(dr, l-a); + else return A(cr, a) + M_PI*dr*dr - A(dr, a-l); } From 49b7914a09dc53dc8503ea60a639ce52ff3d7587 Mon Sep 17 00:00:00 2001 From: Horace He Date: Mon, 4 Nov 2019 10:25:05 -0500 Subject: [PATCH 3/3] responded to comments --- content/geometry/CircleCircleArea.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/geometry/CircleCircleArea.h b/content/geometry/CircleCircleArea.h index 5d636d0be..88fe994fe 100644 --- a/content/geometry/CircleCircleArea.h +++ b/content/geometry/CircleCircleArea.h @@ -14,8 +14,8 @@ double circleCircleArea(P c, double cr, P d, double dr) { return r*r*acos(h/r)-h*sqrt(r*r-h*h); }; auto l = (c - d).dist(), a = (l*l + cr*cr - dr*dr)/(2*l); - if (sgn(l - cr - dr) >= 0) return 0; // far away - if (sgn(l - cr + dr) <= 0) return M_PI*dr*dr; - if (sgn(l - cr) >= 0) return A(cr, a) + A(dr, l-a); + if (l - cr - dr >= 0) return 0; // far away + if (l - cr + dr <= 0) return M_PI*dr*dr; + if (l - cr >= 0) return A(cr, a) + A(dr, l-a); else return A(cr, a) + M_PI*dr*dr - A(dr, a-l); }