Processing: 円と円の交点を求めよう
目次
はじめに
目標
今回は円と円の交点を求めてみます
サンプルコード
動画のコードは以下のようになります
記事の後半では、この中のgetCirclesCrossPoints()
という関数について解説していきます
解説
数式で考えてみる
2つの円の方程式を用いて考えます
円の中心座標がで半径がの円の方程式
中心座標がで半径がの円の方程式
このときをすると
この(3)は円の交点を通る直線の方程式になっています あとは(3)の直線と(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 }