直角三角形の内接正方形「高校入試チャレンジ問題　正方形EBFGの面積は？ 」をsympyとFreeCADでやってみたい。

# パイソニスタの方へ
・座標変換で、angle_betweenを使わない方法。
　**逆行列で、csos,sinを計算する方法**のおすすめのページ又は文献を教えて下さい。

# 参考

https://qiita.com/mrrclb48z/items/a39ceb441d716b3b7d41

https://qiita.com/mrrclb48z/items/89c7e05d17ff95241ee3

# オリジナル
・YUUU0123 様 (0:00〜4:58) 

https://youtu.be/qxQ5duSkFyA

# sympyで
#### ver0.1 平行線と45度の交点計算。
・**CADでいうOffset=1です。**
・探し方が悪いのかslope、見つかりませんでした。
　equationにしました。
　Line(point(0,0),Point(1,1))で十分？
class sympy.geometry.line.Line(*args, **kwargs)
Parameters:...
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.Line

```python
from sympy import *
var('t,x,y',real=True,poitive=True)
AB,BC,DG=6,8,1
A,B,C=map(Point,[(0,AB),(0, 0),(BC, 0)])
G    =Point(x,x)
t    =Line(A+DG*(((C-A).unit).rotate(-rad(90))),
           C+DG*(((C-A).unit).rotate(-rad(90)))).intersection(
      Line(x-y)
     )[0].x
print("#",t**2)
# 361/49
```
#### ver0.2 垂線計算の方程式？distanceが1で(ver0.2の distanceが0がおすすめです。)
・結果2つ。そうですよね。左右の内、小さい値、距離の短い方です。です。
distance(other)
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.Line.distance
```python
# ver0.2
from sympy import *
var('x',real=True,poitive=True)
AB,BC,DG=6,8,1
A,B,C=map(Point,[(0,AB),(0, 0),(BC, 0)])
G=Point(x,x)
sol=solve(Eq(Line(A,C).distance(G),DG),x) ;print("#",sol)
x  =min(sol[0],sol[1])                    ;print("#",x)
print("#",x**2)
# [19/7, 29/7]
# 19/7
# 361/49
```
#### ver0.3 垂線計算の方程式？distanceが０で
・結果1つ。
・**CADでいうOffset=1です。**
Return the Point that is in the same direction as self and a distance of 1 from the origin
https://docs.sympy.org/latest/modules/geometry/points.html#sympy.geometry.point.Point.unit
```python
# ver0.3 方程式？distanceが０で
from sympy import *
var('x',real=True,poitive=True)
AB,BC,DG=6,8,1
A,B,C=map(Point,[(0,AB),(0, 0),(BC, 0)])
G    =Point(x,x)
x    =solve(Eq(Line(A+DG*(((C-A).unit).rotate(-rad(90))),
                    C+DG*(((C-A).unit).rotate(-rad(90)))).distance(G),0),x)[0]
print("#",x**2)
# 361/49
```

#### ver0.4 座標変換(Homogeneous coordinates)
・何も座標変換で方程式をたてなくても。
・回転座標上の(CD,DG)を大座標？へ変換して、一致だろの方程式です。
```python
# ver0.4 座標変換で
from sympy import *
var('x,t,CD',real=True,poitive=True)
AB,BC,DG=6,8,1
BC_G=Matrix([[ x]               ,[ x],[1]])
CA_G=Matrix([[CD]               ,[DG],[1]]) 
t    =Line(Point(0,0),Point(BC,0)).angle_between(Line(Point(BC,0),Point(0,AB)))
mTurn=Matrix([[cos(t),-sin(t),BC],[sin(t),cos(t),0],[0,0,1]])
sol    =solve(Eq(mTurn*CA_G,BC_G),[CD,x])
print("#",sol[x]**2)
# 361/49
#
rep={x:sol[x],CD:sol[CD]}
BC_A=      Matrix([[0] ,[AB],[1]])
BC_B=      Matrix([[0] ,[ 0],[1]])
BC_C=      Matrix([[BC],[ 0],[1]])
BC_D=mTurn*Matrix([[CD],[ 0],[1]]).subs(rep)
BC_E=      Matrix([[0] ,[ x],[1]]).subs(rep)
BC_F=      Matrix([[x] ,[ 0],[1]]).subs(rep)
BC_G=      Matrix([[x] ,[ x],[1]]).subs(rep)
```
# FreeCADのマクロで作図
・計算部分は、Ver.0.4 の コピー貼り付けです。
```python
import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.4 座標変換で
from sympy import *
var('x,t,CD',real=True,poitive=True)
def myMatrixToPoint(myMatrix):    
    return Point2D(myMatrix[0],myMatrix[1])
AB,BC,DG=6,8,1
BC_G=Matrix([[ x]               ,[ x],[1]])
CA_G=Matrix([[CD]               ,[DG],[1]]) 
t    =Line(Point(0,0),Point(BC,0)).angle_between(Line(Point(BC,0),Point(0,AB)))
mTurn=Matrix([[cos(t),-sin(t),BC],[sin(t),cos(t),0],[0,0,1]])
sol    =solve(Eq(mTurn*CA_G,BC_G),[CD,x])
print("#",sol[x]**2)
# 361/49
#
rep={x:sol[x],CD:sol[CD]}
BC_A=      Matrix([[0] ,[AB],[1]])
BC_B=      Matrix([[0] ,[ 0],[1]])
BC_C=      Matrix([[BC],[ 0],[1]])
BC_D=mTurn*Matrix([[CD],[ 0],[1]]).subs(rep)
BC_E=      Matrix([[0] ,[ x],[1]]).subs(rep)
BC_F=      Matrix([[x] ,[ 0],[1]]).subs(rep)
BC_G=      Matrix([[x] ,[ x],[1]]).subs(rep)
#
A=myMatrixToPoint(BC_A)
B=myMatrixToPoint(BC_B)
C=myMatrixToPoint(BC_C)
D=myMatrixToPoint(BC_D)
E=myMatrixToPoint(BC_E)
F=myMatrixToPoint(BC_F)
G=myMatrixToPoint(BC_G)
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
def myXYZ2Txt_2D(A):
    return '(' + str(A.x) + ',' + str(A.y) +  ')'
    # return ""
def myTxtXYZ_2D(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=0.0
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.5 mm'
    #FreeCADGui.ActiveDocument.ActiveObject.FontSize = '1.0 mm'
    return
def myTxtXYZ_S_2D(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_2D(xy_tx[2*i-2]) )
    return
def myLine_2D(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),0.0
    Bx,By,Bz=float(B.x),float(B.y),0.0
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
    return
def myLine_S_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    return
def myLine_C_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    myLine_2D(args[i],args[0])
    return
#######################################################################################
myLine_C_2D      (A,E,B,F,C,D)  
myLine_S_2D      (G,D)
myLine_S_2D      (G,E)
myLine_S_2D      (G,F)
myTxtXYZ_S_2D(A,"A",B,"B",C,"C",D,"D")
myTxtXYZ_S_2D(E,"E",F,"F",G,"G")
####################################################################################
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
# App.ActiveDocumen!t.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
```

isometric方向?です。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/feb7ce58-8319-5388-46ed-e9aec42c9e0b.png)
拡大図
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/747930ec-067d-13fe-2ca3-8cbf95bd305f.png)

拡大図(CADの操作で寸法線を追加)
・(青色の)角度寸法は、ニセモノです。Part＞計測＞角度計算 です。
・角度寸法の表示は、まだ勉強中です。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/970acfa1-6e76-8e6d-c7d3-17bd0b474c79.png)

内接正方形を追加作図
・点Dの横にありました。この点と点Gと点Bが、45°直線。
・ソースコード省略(DG=1 →　DG=0で対応)

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/b780baaf-13cf-e676-9470-56fe31de995d.png)

# sympyで(オリジナル 様の方法を参考に)
**・わかりやすくていいですね。**
　面積で方程式です。
```python
from sympy import *
var('x',real=True,poitive=True)
x=solve(Eq(x*x+(6-x)*x*Rational(1,2)+10*1*Rational(1,2)+((8-x)*x)*Rational(1,2),6*8*Rational(1,2)),x)[0]
print("#",x**2)
# 361/49
```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うおすすめです。

https://en.wikipedia.org/wiki/Homogeneous_coordinates

・wikpedia 日本語版がみあたらない。

http://nishitalab.org/user/nis/CG/cgtxt/cg2/cg024.htm

・sympyのsubs
Substitution

https://docs.sympy.org/latest/tutorials/intro-tutorial/basic_operations.html#substitution