/*
プログラミングのお題スレ Part13
ttps://mevius.5ch.net/test/read.cgi/tech/1549160513/
473デフォルトの名無しさん2019/03/03(日) 08:56:00.68ID:NMVimqZR
お題:2つの円が重なった時、重なった部分の面積を求めなさい。
このプログラムでは以下のURLの画像の場合を計算します。
ttps://imgur.com/i2G9Ahd
*/
#include <stdio.h>
#include <math.h>
#define M_PI 3.14159265358979323846
typedef struct{
double x;
double y;
double r;
}cir_t;
double hoge(cir_t a, cir_t b){
double l
= sqrt( (a.
x - b.
x) * (a.
x - b.
x) + (a.
y - b.
y) * (a.
y - b.
y) ); double theta_a
= 2.0 * acos( (l
* l
+ a.
r * a.
r - b.
r * b.
r) / (2.0 * l
* a.
r) ); double theta_b
= 2.0 * acos( (l
* l
+ b.
r * b.
r - a.
r * a.
r) / (2.0 * l
* b.
r) ); double area_a
= 0.5 * a.
r * a.
r * (theta_a
- sin(theta_a
)); double area_b
= 0.5 * b.
r * b.
r * (theta_b
- sin(theta_b
)); return (area_a + area_b);
}
double fuga(cir_t a, cir_t b){
double l
= sqrt( (a.
x - b.
x) * (a.
x - b.
x) + (a.
y - b.
y) * (a.
y - b.
y) ); double theta_a
= 2.0 * acos( (l
* l
+ a.
r * a.
r - b.
r * b.
r) / (2.0 * l
* a.
r) ); double theta_b
= 2.0 * acos( (l
* l
+ b.
r * b.
r - a.
r * a.
r) / (2.0 * l
* b.
r) ); double area_a
= 0.5 * a.
r * a.
r * (theta_a
- sin(theta_a
)); double area_b
= 0.5 * b.
r * b.
r * (theta_b
- sin(theta_b
)); double area_c
= b.
r * b.
r * sin(2.0 * M_PI
- theta_b
); return (area_a + area_b + area_c);
}
double piyo(cir_t a){
return (a.r * a.r * M_PI);
}
double hogehoge(cir_t a, cir_t b){
if(a.r < b.r){
cir_t tmp = a;
a = b;
b = tmp;
}
double l
= sqrt( (a.
x - b.
x) * (a.
x - b.
x) + (a.
y - b.
y) * (a.
y - b.
y) ); if(a.r + b.r <= l){
return (0.0);
}
else if(a.r < l){
return (hoge(a,b));
}
else if(a.r < l + b.r){
return (fuga(a,b));
}
else{
return (piyo(b));
}
}
void calc(cir_t a, cir_t b){
"座標y1 = %f\n"
"半径r1 = %f\n",
a.x,a.y,a.r);
"座標y2 = %f\n"
"半径r2 = %f\n",
b.x,b.y,b.r);
printf("重複面積 = %f\n\n",hogehoge
(a
,b
)); }
int main(void){
cir_t no_0 = {-1200.0, 600.0, 400};
cir_t no_1 = {-500.0, 600.0, 200};
cir_t no_2 = {-1200.0, -600.0, 400};
cir_t no_3 = {-700.0, -600.0, 200};
cir_t no_4 = { 400.0, 600.0, 400};
cir_t no_5 = { 700.0, 600.0, 200};
cir_t no_6 = { 400.0, -600.0, 400};
cir_t no_7 = { 500.0, -600.0, 200};
puts("No.0とNo.1"); calc
(no_0
, no_1
); puts("No.2とNo.3"); calc
(no_2
, no_3
); puts("No.4とNo.5"); calc
(no_4
, no_5
); puts("No.6とNo.7"); calc
(no_6
, no_7
);
return (0);
}
LyoKICDjg5fjg63jgrDjg6njg5/jg7PjgrDjga7jgYrpoYzjgrnjg6wgUGFydDEzCiAgdHRwczovL21ldml1cy41Y2gubmV0L3Rlc3QvcmVhZC5jZ2kvdGVjaC8xNTQ5MTYwNTEzLwoKICA0NzPjg4fjg5Xjgqnjg6vjg4jjga7lkI3nhKHjgZfjgZXjgpMyMDE5LzAzLzAzKOaXpSkgMDg6NTY6MDAuNjhJRDpOTVZpbXFaUgogIOOBiumhjO+8mjLjgaTjga7lhobjgYzph43jgarjgaPjgZ/mmYLjgIHph43jgarjgaPjgZ/pg6jliIbjga7pnaLnqY3jgpLmsYLjgoHjgarjgZXjgYTjgIIKCiAg44GT44Gu44OX44Ot44Kw44Op44Og44Gn44Gv5Lul5LiL44GuVVJM44Gu55S75YOP44Gu5aC05ZCI44KS6KiI566X44GX44G+44GZ44CCCiAgdHRwczovL2ltZ3VyLmNvbS9pMkc5QWhkCiovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bWF0aC5oPgojZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgoKdHlwZWRlZiBzdHJ1Y3R7CiAgZG91YmxlIHg7CiAgZG91YmxlIHk7CiAgZG91YmxlIHI7Cn1jaXJfdDsKCmRvdWJsZSBob2dlKGNpcl90IGEsIGNpcl90IGIpewogIGRvdWJsZSBsID0gc3FydCggKGEueCAtIGIueCkgKiAoYS54IC0gYi54KSArIChhLnkgLSBiLnkpICogKGEueSAtIGIueSkgKTsKICBkb3VibGUgdGhldGFfYSA9IDIuMCAqIGFjb3MoIChsICogbCArIGEuciAqIGEuciAtIGIuciAqIGIucikgLyAoMi4wICogbCAqIGEucikgKTsKICBkb3VibGUgdGhldGFfYiA9IDIuMCAqIGFjb3MoIChsICogbCArIGIuciAqIGIuciAtIGEuciAqIGEucikgLyAoMi4wICogbCAqIGIucikgKTsKICBkb3VibGUgYXJlYV9hID0gMC41ICogYS5yICogYS5yICogKHRoZXRhX2EgLSBzaW4odGhldGFfYSkpOwogIGRvdWJsZSBhcmVhX2IgPSAwLjUgKiBiLnIgKiBiLnIgKiAodGhldGFfYiAtIHNpbih0aGV0YV9iKSk7CiAgcmV0dXJuIChhcmVhX2EgKyBhcmVhX2IpOwp9Cgpkb3VibGUgZnVnYShjaXJfdCBhLCBjaXJfdCBiKXsKICBkb3VibGUgbCA9IHNxcnQoIChhLnggLSBiLngpICogKGEueCAtIGIueCkgKyAoYS55IC0gYi55KSAqIChhLnkgLSBiLnkpICk7CiAgZG91YmxlIHRoZXRhX2EgPSAyLjAgKiBhY29zKCAobCAqIGwgKyBhLnIgKiBhLnIgLSBiLnIgKiBiLnIpIC8gKDIuMCAqIGwgKiBhLnIpICk7CiAgZG91YmxlIHRoZXRhX2IgPSAyLjAgKiBhY29zKCAobCAqIGwgKyBiLnIgKiBiLnIgLSBhLnIgKiBhLnIpIC8gKDIuMCAqIGwgKiBiLnIpICk7CiAgZG91YmxlIGFyZWFfYSA9IDAuNSAqIGEuciAqIGEuciAqICh0aGV0YV9hIC0gc2luKHRoZXRhX2EpKTsKICBkb3VibGUgYXJlYV9iID0gMC41ICogYi5yICogYi5yICogKHRoZXRhX2IgLSBzaW4odGhldGFfYikpOwogIGRvdWJsZSBhcmVhX2MgPSBiLnIgKiBiLnIgKiBzaW4oMi4wICogTV9QSSAtIHRoZXRhX2IpOwogIHJldHVybiAoYXJlYV9hICsgYXJlYV9iICsgYXJlYV9jKTsKfQoKZG91YmxlIHBpeW8oY2lyX3QgYSl7CiAgcmV0dXJuIChhLnIgKiBhLnIgKiBNX1BJKTsKfQoKZG91YmxlIGhvZ2Vob2dlKGNpcl90IGEsIGNpcl90IGIpewogIGlmKGEuciA8IGIucil7CiAgICBjaXJfdCB0bXAgPSBhOwogICAgYSA9IGI7CiAgICBiID0gdG1wOwogIH0KICBkb3VibGUgbCA9IHNxcnQoIChhLnggLSBiLngpICogKGEueCAtIGIueCkgKyAoYS55IC0gYi55KSAqIChhLnkgLSBiLnkpICk7CiAgaWYoYS5yICsgYi5yIDw9IGwpewogICAgcmV0dXJuICgwLjApOwogIH0KICBlbHNlIGlmKGEuciA8IGwpewogICAgcmV0dXJuIChob2dlKGEsYikpOwogIH0KICBlbHNlIGlmKGEuciA8IGwgKyBiLnIpewogICAgcmV0dXJuIChmdWdhKGEsYikpOwogIH0KICBlbHNlewogICAgcmV0dXJuIChwaXlvKGIpKTsKICB9Cn0KCnZvaWQgY2FsYyhjaXJfdCBhLCBjaXJfdCBiKXsKICBwcmludGYoIuW6p+aomXgxID0gJWZcbiIKCSAi5bqn5qiZeTEgPSAlZlxuIgoJICLljYrlvoRyMSA9ICVmXG4iLAoJIGEueCxhLnksYS5yKTsKICBwcmludGYoIuW6p+aomXgyID0gJWZcbiIKCSAi5bqn5qiZeTIgPSAlZlxuIgoJICLljYrlvoRyMiA9ICVmXG4iLAoJIGIueCxiLnksYi5yKTsKICBwcmludGYoIumHjeikh+mdouepjSA9ICVmXG5cbiIsaG9nZWhvZ2UoYSxiKSk7Cn0KCmludCBtYWluKHZvaWQpewogIGNpcl90IG5vXzAgPSB7LTEyMDAuMCwgIDYwMC4wLCA0MDB9OwogIGNpcl90IG5vXzEgPSB7LTUwMC4wLCAgIDYwMC4wLCAyMDB9OwogIGNpcl90IG5vXzIgPSB7LTEyMDAuMCwgLTYwMC4wLCA0MDB9OwogIGNpcl90IG5vXzMgPSB7LTcwMC4wLCAgLTYwMC4wLCAyMDB9OwogIGNpcl90IG5vXzQgPSB7IDQwMC4wLCAgIDYwMC4wLCA0MDB9OwogIGNpcl90IG5vXzUgPSB7IDcwMC4wLCAgIDYwMC4wLCAyMDB9OwogIGNpcl90IG5vXzYgPSB7IDQwMC4wLCAgLTYwMC4wLCA0MDB9OwogIGNpcl90IG5vXzcgPSB7IDUwMC4wLCAgLTYwMC4wLCAyMDB9OwoKICBwdXRzKCJOby4w44GoTm8uMSIpOyBjYWxjKG5vXzAsIG5vXzEpOwogIHB1dHMoIk5vLjLjgahOby4zIik7IGNhbGMobm9fMiwgbm9fMyk7CiAgcHV0cygiTm8uNOOBqE5vLjUiKTsgY2FsYyhub180LCBub181KTsKICBwdXRzKCJOby4244GoTm8uNyIpOyBjYWxjKG5vXzYsIG5vXzcpOwoKICByZXR1cm4gKDApOwp9Cg==