LoginSignup
0
0

三角形の外接円をwolframとsympyとvbaソルバーでやってみた。

Last updated at Posted at 2021-09-25

wolframalphaで

SymPy Liveで

以下のソースコードを貼り付けて、Evaluateです。

例1

circumcircle

from sympy import *
var('p1x p1y p2x p2y p3x p3y')
p1, p2, p3 = Point(p1x,p1y), Point(p2x,p2y), Point(p3x,p3y)
t = Triangle(p1, p2, p3)
print("#",t.circumcircle)
mySubs={p1x:0 ,p1y:0 ,p2x:1 ,p2y:0 ,p3x:0 ,p3y:1}
print("#",t.circumcircle.subs(mySubs))
# (省略)
# Circle(Point2D(1/2, 1/2), sqrt(2)/2)

例2

辺の長さ a 3
辺の長さ b 4
辺の長さ c 5

外接円の半径 r 2.5

from sympy import *
var('a b c x p1x p1y p2x p2y p3x p3y')
p1x=0.0
p1y=0.0
p2x=a
p2y=0.0
p3x=solve((b**2-x**2)-(c**2-(a-x)**2),x)[0]
p3y=sqrt(b**2-p3x**2)
p1,p2,p3 = Point(p1x,p1y), Point(p2x,p2y), Point(p3x,p3y)
t = Triangle(p1, p2, p3)
mySubs={a:3,b:4,c:5}
print("#",t.circumcircle.subs(mySubs))
# Circle(Point2D(3/2, 2), 5/2)

例3

単体ではうごきません
def myTriangle_Move_CircumcenterToOrigin(dumABC):
    dumO=dumABC.circumcircle.args[0]
    return Triangle( dumABC.vertices[0]-dumO,
                     dumABC.vertices[1]-dumO,
                     dumABC.vertices[2]-dumO )
myT=myTriangle_Move_CircumcenterToOrigin(myT)

vbaソルバーで 

エクセルのソルバーのダイアログ入力で普通にできますが、あえてVBAでチャレンジしてみました。ソルバーのための以下の参考の設定が必要です。
SolverOptions AssumeNonNeg:=False追加しました。
おすすめのサイトがあれば、教えて下さい。

参考 

例1(距離)xy2変数

Const myMethod = "GRG Nonlinear"
'Const myMethod = "Simplex LP"
'Const myMethod = "Evolutionary"
Sub aaa_main()
    ActiveSheet.Cells.Clear
MsgBox "3点を通る円を" & myMethod & "で計算します。"
    Range("A1") = 0
    Range("B1") = 0
    Range("A2") = 1
    Range("B2") = 0
    Range("A3") = 0
    Range("B3") = 1
    
    Range("C1").Formula = "=(A1-$A$4)^2+(B1-$B$4)^2"
    Range("C2").Formula = "=(A2-$A$4)^2+(B2-$B$4)^2"
    Range("C3").Formula = "=(A3-$A$4)^2+(B3-$B$4)^2"
    Range("C4").Formula = "=(C1-C2)^2+(C1-C3)^2"
    Dim ws As Worksheet: Set ws = ActiveSheet
    SolverReset
    SolverOk setCell:=ws.Range("C4"), _
                   MaxMinVal:=3, _
                   ByChange:=ws.Range("A4:B4"), _
                   EngineDesc:=myMethod
    SolverOptions AssumeNonNeg:=False
    SolverSolve UserFinish:=True
    Range("C5").Formula = "=sqrt(c1)"
End Sub
'結果
'"GRG Nonlinear" で 0.5,0.5,0.707106781

例1(ヘロンの公式)1変数

勉強中

例2(余弦定理)1変数

勉強中

例2(ヘロンの公式)1変数

勉強中

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0