0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

アフィン変換行列(4/4)「(複素数平面を含む)正三角形の頂点求め方について...」正三角形の2つの頂点がわかっていて、第3の頂点を求める。

Last updated at Posted at 2025-03-08

複素数平面 を始めました(ページ内ジャンプします)。ありがとうございました。
長文です。 同じ別解多数のためです。
・FreeCADで作図しました。
・???上記の「Qiitaのページ内ジャンプ」は、アスタリスクが1個でしょうか?
 ちょっとカッコ悪いです。

4部作 アフィン変換行列 上のタグと同じです。

オリジナル

Youtube 算数・数学channelまんぼ。様  
【数学Ⅱ】【数学C】あなたならどう解きますか??正三角形の2つの頂点がわかっていて、第3の頂点を求める問題。【高校数学】
・ver0.1 解法1 0:00~
・ver0.2 解法2(中点) 5:44~
・ver0.3 解法3(複素平面) 11:50~ 
https://youtu.be/5AMRi20k_F0?si=QnZEVHiiI_LUlb9v&t=710
・フル (0:00〜17:15)
https://youtu.be/5AMRi20k_F0
>いろんな方法がある。

いつもの?sympyのweb上での実行方法

SymPy Live Shellで。
FreeCADのマクロは、以下で実行できません。
https://qiita.com/mrrclb48z/items/00dd08b0317069be9342#web%E4%B8%8A%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95sympy-live-shell%E3%81%A7

sympyで(Pointクラス)

・普通?はコレ。xy平面。
 ページの最後にdocへのリンクあり。(ページ内ジャンプを勉強中です。)
 スクロール又はページ右の目次タブで移動して下さい。

# ver1.0 
from sympy import *
A,B=map(Point,[(3,3),(1,1)])
print("#",B.rotate( pi/3,A).coordinates)
print("#",B.rotate(-pi/3,A).coordinates)
# # (sqrt(3) + 2, 2 - sqrt(3))
# # (2 - sqrt(3), sqrt(3) + 2)

sympyで(オリジナル 様の方法を参考に)

・ver0.1 解法1 0:00~

# ver0.1 解法1
from sympy import *
var('s,t')
Ax,Ay,Bx,By,Cx,Cy=3,3,1,1,s,t
AB2=(Ax-Bx)**2+(Ay-By)**2                                      #;print("#",AB2)
BC2=(Bx-Cx)**2+(By-Cy)**2                                      #;print("#",BC2.expand())
CA2=(Cx-Ax)**2+(Cy-Ay)**2                                      #;print("#",CA2.expand())
sol=solve([Eq(BC2,CA2),Eq(AB2,BC2)],[s,t])                     #;print("#",sol)
print("#",sol[1][0],",",sol[1][1],"",sol[0][0],",",sol[0][1])
# sqrt(3) + 2 , 2 - sqrt(3) と 2 - sqrt(3) , sqrt(3) + 2

・ver0.2 解法2(中点) 5:44~

# ver0.2 解法2 5:44
from sympy import *
var('s,t')
Ax,Ay,Bx,By,Cx,Cy=3,3,1,1,s,t
Mx,My=(Ax+Bx)*Rational(1,2),(Ay+By)*Rational(1,2)
solt=solve(Eq((t-2)/(s-2)*(By-Ay)/(Bx-Ax),-1)   ,t)[0]         #;print("#",sols) #
solt=solve(Eq((Mx-Cx)*(Ax-Bx)+(My-Cy)*(Ay-By),0),t)[0]         #;print("#",solt) # 内積0 説明用の重複
BM  =sqrt((Bx-Mx)**2+(By-My)**2)                               #;print("#",BM)
CM2 =((Cx-Mx)**2+(Cy-My)**2).expand()                          #;print("#",CM2)
CM2 =(CM2.subs({t:solt})).expand()                             #;print("#",CM2)
sols=solve(Eq(CM2,(BM*sqrt(3))**2),s)                          #;print("#",sols)
print("#",sols[1],",",solt.subs({s:sols[1]}),"",sols[0],",",solt.subs({s:sols[0]}))
# sqrt(3) + 2 , 2 - sqrt(3) と 2 - sqrt(3) , sqrt(3) + 2

・ver0.3 (複素数平面) 解法3

# ver0.3 解法3 11:50~
from sympy import *
A,B=3+3*I,1+1*I
γ1=(A-B)*(cos( pi/3)+I*sin( pi/3))+B
γ2=(A-B)*(cos(-pi/3)+I*sin(-pi/3))+B
print("#",γ2               ,"",γ1               )
print("#",γ2.simplify()    ,"",γ1.simplify()    )
print("#",γ2.as_real_imag(),"",γ1.as_real_imag())
# 1 + (1/2 - sqrt(3)*I/2)*(2 + 2*I) + I と 1 + I + (1/2 + sqrt(3)*I/2)*(2 + 2*I)
# 2 + sqrt(3)*(1 - I) + 2*I と 2 + sqrt(3)*(-1 + I) + 2*I
# (sqrt(3) + 2, 2 - sqrt(3)) と (2 - sqrt(3), sqrt(3) + 2)

・コメントより(再)

・(ver0.7 三角形連結。座標変換と同じ)
 4つめの解法?三角定規を3回です。 答えより。
 (3-1)√2/2√3/√2=√3
∴(2+√3,2-√3),(2-√3,2+√3)

sympyで(いつもの方法で)

・ver0.4 解法1と同じ。

# ver0.4 解法1と同じ。
from sympy import *
var('s,t')
A,B,C=map(Point,[(3,3),(1,1),(s,t)])
sol=solve([Eq(B.distance(C),C.distance(A)),Eq(A.distance(B),B.distance(C))],[s,t])                # ;print("#",sol)
print("#",sqrtdenest(sol[0][0]),sqrtdenest(sol[0][1]),sqrtdenest(sol[1][0]),sqrtdenest(sol[1][1]))     

・ver0.5 解法2と同じ。

# ver0.5 解法2と同じ。
from sympy import *
var('s,t')
A,B,C=map(Point,[(3,3),(1,1),(s,t)])
M    =A.midpoint(B)
print("#",solve([Eq((A-B).dot(C-M),0),Eq(C.distance(M),A.distance(M)*sqrt(3))],[s,t]))
# [(2 - sqrt(3), sqrt(3) + 2), (sqrt(3) + 2, 2 - sqrt(3))]

ページ内ジャンプ

・?ちょっとカッコ悪いです。

・ver0.6 (複素数平面) 解法3と同じ。

# ver0.6 複素数平面 解法3と同じ。
from sympy import *
A,B=3+3*I,1+1*I
print("#",((A-B)*(cos(-pi/3)+I*sin(-pi/3))+B).as_real_imag(),
          ((A-B)*(cos( pi/3)+I*sin( pi/3))+B).as_real_imag())
# (sqrt(3) + 2, 2 - sqrt(3)) (2 - sqrt(3), sqrt(3) + 2)

・ver0.7 三角形連結。自作myTr02(座標変換)

「sympyのTriangleで、三角形に三角形を追加した。」自作プログラムmyTr02
https://qiita.com/mrrclb48z/items/eda67f399965ea64df89

# ver0.7 三角形連結。自作myTr02(座標変換)
from sympy import *
var('X',real=True,poitive=True)
def myMatrixToPoint(myMatrix):    
    return Point2D(myMatrix[0],myMatrix[1])
def myPoinrToMatrix(myPoint):    
    return Matrix([[myPoint.x],[myPoint.y],[1]]) 
def myTr02(tr1,tr2):
    t     =Line(tr1.args[0],tr1.args[0]+Point(1,0)).angle_between(Line(tr1.args[0],tr1.args[2]))
    myTurn=Matrix([[cos(t),-sin(t),tr1.args[0].x],[sin(t),cos(t),tr1.args[0].y],[0,0,1]])
    return Triangle(myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[0])),
                    myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[1])),
                    myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[2])))
A,B,dum=map(Point,[(3,3),(1,1,),(3,1)])
d=A.distance(B)
print("#",myTr02(Triangle(B,dum,A),Triangle(asa=(-60,d,-60))).args[2].coordinates)
print("#",myTr02(Triangle(B,dum,A),Triangle(asa=( 60,d, 60))).args[2].coordinates)
# property coordinates
# https://docs.sympy.org/latest/modules/geometry/points.html#sympy.geometry.point.Point2D.coordinates
# (sqrt(3) + 2, 2 - sqrt(3))
# (2 - sqrt(3), sqrt(3) + 2)

sympyで(アフィン変換行列)

・座標変換マトリックスです。

sympyで(ChatGPT先生に聞きました。)

・はじめから、ChatGPT先生へ丸投げ?したらよかった。

sympyで(matplotlibで)

・勉強中です。FreeCAD作図より楽?かも。
(参考例)@HigashinoSola 様 こちらはステキな長文です。
https://qiita.com/HigashinoSola/items/2ab8894b543e0c55cfa7#%E5%82%8D%E5%BF%83%E3%81%A8%E5%82%8D%E6%8E%A5%E5%86%86%E3%82%92%E5%9B%B3%E7%A4%BA%E3%81%97%E3%82%88%E3%81%86

FreeCADで作図

・計算部分のコードを修正しています。

# 以下でます。 
# この機能は非推奨です。この機能を直接使用しないでください。
#   「make_linear_dimension」または「make_linear_dimension_obj」のいずれかを使用してください。
import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.5 解法2と同じ。
from sympy import *
var('s,t')
A,B,C=map(Point,[(3,3),(1,1),(s,t)])
M    =A.midpoint(B)
sol=solve([Eq((A-B).dot(C-M),0),Eq(C.distance(M),A.distance(M)*sqrt(3))],[s,t])
# [(2 - sqrt(3), sqrt(3) + 2), (sqrt(3) + 2, 2 - sqrt(3))]
C1=Point(sol[1])
C2=Point(sol[0])
############################################################################
# 3D作図 z=0 XY平面に作図しました。
# 2024-10-08 fontsize 追加しました。従来と互換性がありません。 
# 2024-10-20 HR 
############################################################################
def myXYZ2Txt_2D(A):
    return ""
def myXYZ2Txt_XY_2D(A):
    return '(' + str(A.x) + ',' + str(A.y) +  ')'
def myTxtXYZ_2D(fontsize,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 = str(fontsize,)+' mm'
    return
def myTxtXYZ_S_2D(fontsize,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(fontsize,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_2D(xy_tx[2*i-2]) )
    return
def myTxtXYZ_XY_S_2D(fontsize,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(fontsize,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_XY_2D(xy_tx[2*i-2]) )
    return
def myTxtXYZ_MoveY_2D(fontsize,MoveY,A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)+MoveY
    P5z=0.0
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = str(fontsize,)+' mm'
    return
def myTxtXYZ_XY_S_MoveY_2D(fontsize,MoveY,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_MoveY_2D(fontsize,MoveY,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_XY_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
def myLine_H_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[0],args[i])
    return
##################################################################################
myLine_S_2D     (A,B)  
myLine_S_2D     (A,C1,B)  
myLine_S_2D     (A,C2,B)  
#
myFontsize =0.4
myTxtXYZ_XY_S_2D(myFontsize,A,"A",B,"B",C1,"C1",C2,"C2")
####################################################################################
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")

111.png

いつもの? sympyの実行環境と 参考のおすすめです。

(テンプレート)

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

・ver1.0
Point
.rotate(angle, pt=None)[source] Rotate angle radians counterclockwise about Point pt.
https://docs.sympy.org/latest/modules/geometry/points.html#sympy.geometry.point.Point2D.rotate

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?