掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
内心を求めるには? (ID:26660)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
成る程、複素数はそのように使うのですね。 石橋屋さんのを参考に私流に変えてみました。 ベクトルの長さはVarComplexAbs関数が定義されていますので用意する必要はありませんでした。 内接円を描画したくなるのが人情ですのでこれも試してみました。 内接円は既に中心(内心)が判っていますので半径rが判ればよいのですが、 実は簡単です。 シャノンの定理により、3辺a,b,cが判っていれば三角形の面積Sは S=(s*(s-a)*(s-b)*(s-c))^0.5 です。(但し、s=(a+b+c+)/2 ) ところが三角形の面積Sは、内接円の半径rを用いて S=(a+b+c)*r/2 と表せます。従って、 r=2*S/(a+b+c) と求まります。 以下、コードです。ボタン、イメージ、メモをはっつけています。 メモは使っていませんが・・ ---------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, varCmplx, StdCtrls, ExtCtrls, Math; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Image1: TImage; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var pA,pB,pC,pI:variant; a,b,c,ss,sl,ss2,r:double; St : String; begin pA:=varComplexCreate(4*50,6*50); pB:=varComplexCreate(9*50,2*50); pC:=varComplexCreate(1*50,1*50); a:=VarComplexAbs(pB-pC); b:=VarComplexAbs(pC-pA); c:=VarComplexAbs(pA-pB); ss := a+b+c; ss2:= (a+b+c)/2; pI:=1/ss*(c*pC+b*pB+a*pA); sl := Power( ss2*(ss2-a)*(ss2-b)*(ss2-c) ,0.5); r := 2*sl/ss; //内心の座標は(I.real,I.Imaginary) { St := 'x=' + floattostr( pI.real) + ' y=' +floattostr( pI.imaginary ); Memo1.Lines.Add(St); } //三角形の描画 Image1.Canvas.Pen.Color := RGB(0,0,255); Image1.Canvas.MoveTo(pA.real ,pA.imaginary); Image1.Canvas.LineTo(pB.real ,pB.imaginary); Image1.Canvas.LineTo(pC.real ,pC.imaginary); Image1.Canvas.LineTo(pA.real ,pA.imaginary); Image1.Canvas.Pen.Color := RGB(255,0,0); //内接円の描画 Image1.Canvas.Ellipse( pI.real -r, pI.imaginary -r, pI.real +r, pI.imaginary +r ); //内心の描画 Image1.Canvas.Ellipse( pI.real -2, pI.imaginary -2, pI.real +2, pI.imaginary +2 ); end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.