ZawaWorks’s diary

プログラミング技術メモ

Processing: 円と円の交点を求めよう

目次

はじめに

目標

今回は円と円の交点を求めてみます

サンプルコード

動画のコードは以下のようになります 記事の後半では、この中のgetCirclesCrossPoints()という関数について解説していきます

gist.github.com

解説

数式で考えてみる

2つの円の方程式を用いて考えます

円の中心座標が(x_1, y_1)で半径がr_1の円の方程式


(x-x_1)^2+(y-y_1)^2=r_1^2\cdots(1)

中心座標が(x_2,  y_2)で半径がr_2の円の方程式


(x-x_2)^2+(y-y_2)^2=r_2^2\cdots(2)

このとき(2)-(1)をすると

2(x_2-x_1)x + 2(y_2-y_1)y + x_1^2-x_2^2+y_1^2-y_2^2+r_2^2-r_1^2=0\cdots(3)

この(3)は円の交点を通る直線の方程式になっています f:id:ZawaWorks:20200106014311j:plain あとは(3)の直線と(1)または(2)の円との交点を求めれば、円と円の交点を求めることができます 直線と円の交点の求め方は以下の記事を参考にしてください

zawaworks.hatenablog.com

コードにしてみよう

a=2(x_2-x_1)\\b = 2(y_2-y_1)\\c=x_1^2-x_2^2+y_1^2-y_2^2+r_2^2-r_1^2

とおきます。それを円と直線の交点を求める関数に代入すれば円と円の交点が返ってくるようになっています。

//円と円の交点を取得する関数
PVector[] getCirclesCrossPoints(float x1, float y1, float r1, float x2, float y2, float r2) {

  float a = 2*(x2 - x1);
  float b = 2*(y2 - y1);
  float c = sq(x1)-sq(x2)+sq(y1)-sq(y2)+sq(r2)-sq(r1);
  return getLineCircleCrossPoints(a, b, c, x1, y1, r1);
}

//直線(ax + by + c = 0)と円(中心座標(circleX, circleY), 半径 r)の交点を取得する関数
PVector[] getLineCircleCrossPoints(float a, float b, float c, float circleX, float circleY, float r) {
    //中身はこちらの記事を読んでください
    //http://zawaworks.hatenablog.com/entry/2019/12/04/012717?_ga=2.20645616.952110635.1578237427-1521756013.1576935957
}