空間図形「宮城大学2022年前期第６問」をsympyとFreeCADでやってみた。 

座標空間内の二等辺三角形

オリジナル

https://mathmathmass.exblog.jp/32190487/

大学入試数学問題集成＞【６】

https://mathexamtest.web.fc2.com/2022/202211081/2022110810100mj.html#q-0110

# sympyで
解の重複で判定しました。正しいですか？
tの値の数。最大6個の可能性あり。
グラフより、2曲線の交点が3点。3曲線の同一交点がない。BCとCAが接して見えます。

グラフの縦横比変でした。以下wolframalphaでも、縦横比変でした
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/6a679b2c-8a35-a474-474a-e51e2184b400.png)
```python
from sympy import *
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize']=5,5
def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)
t=Symbol('t',real=True)
A=Point(    1,    1,  t)
B=Point(   -1,    1,3*t)
C=Point(2*t+1,2*t-1,  t)
L=Rational(1,2)*(B+C)
M=Rational(1,2)*(C+A)
N=Rational(1,2)*(A+B)
print("#(1)",L,M,N)
print("#(2)",(B-A),(N-C))
print("#(3)",solve((B-A).dot(N-C),t)[0])
AB=A.distance(B).expand()
BC=B.distance(C).expand()
CA=C.distance(A).expand()
ans=solve(AB**2-BC**2,t)+solve(BC**2-CA**2,t)+solve(CA**2-AB**2,t)
print("#(4)",ans)
if has_duplicates2(ans):
   print("#(4) tの重複あり。△ABCが正三角形になるときはある。")
else:
  print("#(4) tの重複なし。△ABCが正三角形になるときはない。")
# グラフ作成
p=       plot(AB,(t,-5,5),label="AB",show=False,legend = True)
p.extend(plot(BC,(t,-5,5),label="BC",show=False))
p.extend(plot(CA,(t,-5,5),label="CA",show=False))
p.show()
#(1) Point3D(t, t, 2*t) Point3D(t + 1, t, t) Point3D(0, 1, 2*t)
#(2) Point3D(-2, 0, 2*t) Point3D(-2*t - 1, 2 - 2*t, t)
#(3) -1
#(4) [-1, 0, 2]
#(4) tの重複なし。△ABCが正三角形になるときはない。
```

# wolframalphaでグラフ作成

https://www.wolframalpha.com/input?i=sqrt%284*t**2+%2B+4%29%2Csqrt%2812*t**2+%2B+8%29%2Csqrt%288*t**2+-+8*t+%2B+4%29&lang=ja


# FreeCADのマクロで
上のsympy計算に、FreeCAD作図を追加しました。
(3)AB⊥CNの場合:t=-1 ?直角に見えませんが、直角のはずです。
FreeCADで、AB⊥CN(直角)に見える見方を調査中。

?ところで,点L,点Mは、何に使っていますか？
![png3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/75ec567e-055f-47f4-5b21-45b4f32733b4.png)
```python
import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
from sympy import *
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize']=5,5
def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)
t=Symbol('t',real=True)
A=Point(    1,    1,  t)
B=Point(   -1,    1,3*t)
C=Point(2*t+1,2*t-1,  t)
L=Rational(1,2)*(B+C)
M=Rational(1,2)*(C+A)
N=Rational(1,2)*(A+B)
print("#(1)",L,M,N)
print("#(2)",(B-A),(N-C))
ans=solve((B-A).dot(N-C),t)[0]
print("#(3)",ans)
mySubs={t:ans}
#print(mySubs)
#print(A)
A=A.subs(mySubs)
B=B.subs(mySubs)
C=C.subs(mySubs)
L=L.subs(mySubs)
M=M.subs(mySubs)
N=N.subs(mySubs)
#print(A)
# #########################################################################################################
# 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxt_XYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.2 mm'
def myLine(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),float(A.z)
    Bx,By,Bz=float(B.x),float(B.y),float(B.z)
    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)
myTxt_XYZ(A,"A"+myXYZ2Txt(A))
myTxt_XYZ(B,"B"+myXYZ2Txt(B))
myTxt_XYZ(C,"C"+myXYZ2Txt(C))
myTxt_XYZ(L,"L"+myXYZ2Txt(L))
myTxt_XYZ(M,"M"+myXYZ2Txt(M))
myTxt_XYZ(N,"N"+myXYZ2Txt(N))
myLine(A,B)
myLine(B,C)
myLine(C,A)
myLine(C,N)
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
```
(4)省略

# 参考

https://note.nkmk.me/python-list-duplicate-check/