satoh

知っているようで知らないデジタル図形処理 ~任意形状図形の選択から交点・接点・接線計算まで、方程式では解けないノウハウを紹介

   

2点と半径から円の中心座標を求める

ごく普通に解いてみる

2点と半径で円の中心が決まるのはごく簡単です。
こんな感じですね。
2点と半径から円-数式
さて、当然の事ながら2次方程式の解ですので答えは最大2つ出てきます。

2点と半径から円-イメージ
上図が一つの答えですが、この2点を通る中心位置が違う円がもうひとつあるのはすぐわかりますね。

2点と半径から円-2つ
上図のようになります。

プログラム

今回は簡単ですね。すぐプログラムを書いてみましょう、
ポイントは与えられた2点の中間点P3を求めて、そこからの差分で2つの中心点を求めているところです。

typedef struct {
	FPOINT      pc ;
	double      r ;
} FCIRCLE ;

//---------------------------------------------------------------------------------------------
//
//      2点と半径から円の中心座標を求める
//
//---------------------------------------------------------------------------------------------
int geoGetCircleOf2PTAndR(
							FPOINT  pt1,            // 円上の第1点
							FPOINT  pt2,            // 円上の第2点
							double  r,              // 円の半径
							FPOINT  *pc1,           // 第1円の中心
							FPOINT  *pc2)           // 第2円の中心
{
	int    stat = 0 ;
	FPOINT pt3 ;
	double d, l1, dx, dy ;

	pt3.x = (pt1.x + pt2.x) * 0.5 ;
	pt3.y = (pt1.y + pt2.y) * 0.5 ;

	r *= r ;
	l1 = (pt2.x - pt3.x) * (pt2.x - pt3.x) + (pt2.y - pt3.y) * (pt2.y - pt3.y) ;

	if  (r >= l1) {
		d  = sqrt(r / l1 - 1.0) ;
		dx = d * (pt2.y - pt3.y) ;
		dy = d * (pt2.x - pt3.x) ;

		pc1->x = pt3.x + dx ;
		pc1->y = pt3.y - dy ;

		pc2->x = pt3.x - dx ;
		pc2->y = pt3.y + dy ;
	} else {
		stat = 1 ;
	}

	return stat;
}

 - C, 交点・接線, 図形, 計算