質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

4217閲覧

C#三角形の外心公式

KWONYONGGI

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

3クリップ

投稿2018/10/29 01:35

編集2018/10/29 01:47

初めまして。

C#winformを利用して三角形の外心を探すプログラムを作りたいです。

公式が x^2+y^2+lx+my+n=0ですけど3点があったとき

A点(x,y) B点(x1, y1) C点(x2,y2)です!

C#コードをどうやって表現しますか?

コード protected double GetCrossPointP() // { double x, y, x1, y1, x2, y2; string xValue = textBox1.Text; x = Convert.ToDouble(xValue); string yValue = textBox2.Text; y = Convert.ToDouble(yValue); string x1Value = textBox3.Text; x1 = Convert.ToDouble(x1Value); string y1Value = textBox4.Text; y1 = Convert.ToDouble(y1Value); string x2Value = textBox5.Text; x2 = Convert.ToDouble(x2Value); string y2Value = textBox6.Text; y2 = Convert.ToDouble(y2Value); double distance3 = Math.Sqrt((((x - x2) * (x + x2)) / (2 * (y - y2))) - (((x1 - x2) * (x1 + x2)) / (2 * (y1 - y2))) + ((y - y1) / 2)) / (((x - x2) / (y - y2)) - ((x1 - x2) / (y1 - y2))); //double distance3 = Math.Sqrt((y - y2) * ((y * y) - (y1 * y1) + (x * x) - (x1 * x1)) + (y - y1) * ((y * y) - (y2 * y2) + (x * x) - (x2 * x2))) / (2 * (y - y2) * (x - x1) + 2 * (y - y1)*(x - x2)); //인터넷에 나와있는 공식 return (int)distance3; }

続いて値が -2147483648で出ます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/10/29 01:42

提示のコードで、三角形の座標はどこにどういうふうに入るんでしょうか
KWONYONGGI

2018/10/29 01:45

A点(x,y) B点(x1, y1) C点(x2,y2)です!
guest

回答4

0

ベストアンサー

公式に変数多過ぎませんか?
これでは何も求まらないでしょう。

外心の座標 Ox, Oy は、三角形の外接円の中心となります。
その半径を r とし、頂点の一つの座標を Px, Py とすると (Px - Ox)^2 + (Py -Oy)^2 = r^2 となります。

この Px, Py に三角形の各頂点の座標を代入すると、三つの連立方程式ができます。
これを解いてください。

#追記
C# では a^2 は a の排他的論理和になります。
a の二乗は Math.Pow(a, 2) ですが、長いのでここでは便宜的に a^2 で二乗を表すとして説明します。

三点を代入すると次の三つの方程式が得られます。
(1) (x - Ox)^2 + (y - Oy)^2 = r^2
(2) (x1 - Ox)^2 + (y1 - Oy)^2 = r^2
(3) (x2 - Ox)^2 + (y2 - Oy)^2 = r^2

(1) の式を「Ox=...」の形で表します。
(x - Ox)^2 = r^2 - (y - Oy)^2
x - Ox = Sqrt(r^2 - (y - Oy)^2)
Ox = x - Sqrt(r^2 - (y - Oy)^2)

これを (2) と (3) に代入します。
(2´) (x1 - (x - Sqrt(r^2 - (y - Oy)^2)))^2 + (y1 - Oy)^2 = r^2
(3´) (x2 - (x - Sqrt(r^2 - (y - Oy)^2)))^2 + (y2 - Oy)^2 = r^2
これで Ox が消え、変数は 3 つから 2 つになり、連立方程式も二つになりました。

同様に Oy を消し、一つの方程式 (3´´) にしてください。
そうすると r が求められます。
求めた r を (2´) に代入すると Oy が求められます。
Oy と r を (1) に代入すると Ox が求められます。

プログラムで表現するには、まず紙の上で計算して (3´´) の式を作り、変形して r を戻り値として返す関数にします。
そこに x, y, x1, y1, x2, y2 を引数として与えると、r が求められます。

次に (2´) から x, y, x1, y1, x2, y2, r を引数として与えると Oy を戻す関数を作ります。
最後に (1) から x, y, x1, y1, x2, y2, r, Oy を引数として与えると Ox を戻す関数を作ります。

これですべて求められました。

投稿2018/10/29 01:58

編集2018/10/29 02:27
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KWONYONGGI

2018/10/31 01:49

難しいですね。。。返事ありがとうございます!
KWONYONGGI

2018/10/31 07:45

はい。。外心探すことは大丈夫ですけどこの計算式をC#コードで作ることが難しいです。。。
Zuishin

2018/10/31 07:52

f(x) = x + 1 この数式を関数にするのは簡単でしょう? というか元から関数ですから、コードに落とし込むのは何も考える必要ないでしょう? なら三つの連立方程式を Ox = f(Oy, r, x, y, x1, y1, x2, y2), Oy = g(r, x, y, x1, y1, x2, y2), r = h(x, y, x1, y1, x2, y2) と考えればコードに落とすのも簡単ではありませんか。
KWONYONGGI

2018/11/01 03:54

Zuishinさんお陰様でありがとうございます
guest

0

三角形の外心は,各辺の垂直二等分線が交わる位置として求められるハズなので
馬鹿正直に連立方程式を解く必要はないのでは?

とりあえず2辺の垂直二等分線の交点を求めればよいでしょう.
【 位置( 辺1の中点 + 辺1の法線 * t ) が 辺2の垂直二等分線上にある 】
という単純な式からtを解けば良いだけです.


例えば

  • O = 辺2の中点
  • T = 辺2に沿うベクトル
  • C = 辺1の中点
  • N = 辺1の法線

とすれば,tに関する方程式は
( C + t*N - O )・T = 0
※ここで・は内積

↓なので,最終的に

  • t = - (( C-O )・T) / (N・T)
  • 外心位置 = C + t*N

イメージ説明

投稿2018/11/01 02:08

編集2018/11/01 03:05
fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/11/01 02:20

二本の直線の交点だと結局連立方程式になるのではないですか?
fana

2018/11/01 02:27

追記したようなベクトル計算でさくっと解ける話と考えていたので「連立」方程式という意識が薄かったですが,確かに御指摘の通り,どこまでいっても「連立方程式」ではありますね.
fana

2018/11/01 02:31

ん? いや,xとyで愚直に書いても式が一本だからやはり「連立」ではない?
Zuishin

2018/11/01 02:51

ベクトル計算だと簡単になるんですね。
KWONYONGGI

2018/11/01 03:52

二人皆とても感謝します。 大きな助けになりました。
guest

0

三角形の外心は、三角形の各頂点からの距離が等しい点です。
すなわち、与えられた三点を円周上に持つ円の中心点となります。

で、公式は、「ある点を通る円の方程式」です。
(x-a)^2 + (y-b)^2 = r^2 より、
x^2 - 2ax + a^2 + y^2 - 2by + b^2 = r^2 からさらに
x^2 + y^2 -2ax - 2by + a^2 + b^2 - r^2 = 0 と変形すると、
l = -2a, m = -2b, n = a^2+b^2-r^2 とすれば公式が得られます。

なので、この式を利用して座標(x,y), (x1,y1), (x2,y2) のそれぞれで、** l,m,n に関する式を作成して、3元連立方程式を解かねばならない** のです。

3元連立方程式を解くには、行列を利用すれば(クラメルの公式)解けますが、これを実装するのはまた骨ですけどね……

投稿2018/10/29 02:53

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KWONYONGGI

2018/10/31 01:48

返事いただいてありがとうございます!
guest

0

連立方程式を解けばいいんですが、
外心の位置なんてすでに誰かが解いているだろうと探したら
ありました

投稿2018/11/01 03:19

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問