図形の重心

 投稿者:山中和義  投稿日:2013年 9月12日(木)19時20分22秒
 

!●平面の点を「平面のベクトルとみる」と「複素数とみる」と考えられる
OPTION ARITHMETIC COMPLEX

SET WINDOW -8,8,-8,8 !表示領域を設定する
DRAW grid !XY座標

LET OA=v(-6,-5) !頂点の座標x,y ※反時計まわり
LET OB=v( 6,-4)
LET OC=v(-1, 6)
LET OD=v(-5, 3)

CALL gcLINE(OA,OB,"A","") !四角形を描く
CALL gcLINE(OB,OC,"B","")
CALL gcLINE(OC,OD,"C","")
CALL gcLINE(OD,OA,"D","")


!●重心(幾何的重心)
LET Oo=v(0,0) !原点
LET S1=fnCROSS(OA,OB)/2 !三角形OABの符号つき面積
LET G1=(Oo+OA+OB)/3 !三角形OABの重心
LET S2=fnCROSS(OB,OC)/2
LET G2=(Oo+OB+OC)/3
LET S3=fnCROSS(OC,OD)/2
LET G3=(Oo+OC+OD)/3
LET S4=fnCROSS(OD,OA)/2
LET G4=(Oo+OD+OA)/3
LET OG=(S1*G1+S2*G2+S3*G3+S4*G4)/(S1+S2+S3+S4) !(ΣS[k]*G[k])/(ΣS[k])

CALL gcPOINT(OG,"G") !重心
PRINT OG


!●重心(物理的重心)
LET OGG=(OA+OB+OC+OD)/4

CALL gcPOINT(OGG,"G'") !重心
PRINT OGG

PRINT


!検算

SET LINE COLOR 2
LET OG1=(OA+OB+OC)/3 !三角形ABCの重心
LET OG2=(OC+OD+OA)/3 !三角形CDA
LET OG3=(OB+OC+OD)/3 !三角形BCD
LET OG4=(OD+OA+OB)/3 !三角形DAB
CALL gcLINE(OG1,OG2,"G1","G2") !G1G2=BD/3 ∴G1G2//BD
CALL gcLINE(OG3,OG4,"G3","G4") !G3G4=CA/3 ∴G3G4//CA
CALL gcINTERSECTION(OG1,OG2,OG3,OG4,"", OG,K) !交点
PRINT OG

PRINT


!その2

SET LINE COLOR 2 !四角形の対角線の交点P
CALL gcLINE(OA,OC,"","")
CALL gcLINE(OB,OD,"","")
CALL gcINTERSECTION(OA,OC,OB,OD,"P", OP,K)
PRINT OP

SET LINE COLOR 3 !四角形の物理的重心G'
LET OM1=(OA+OB)/2 !辺ABの中点
LET OM2=(OC+OD)/2 !辺CD
LET OM3=(OB+OC)/2 !辺BC
LET OM4=(OD+OA)/2 !辺DA
CALL gcLINE(OM1,OM2,"","")
CALL gcLINE(OM3,OM4,"","")
CALL gcINTERSECTION(OM1,OM2,OM3,OM4,"", OGG,K) !交点
PRINT OGG

CALL gcDIVIDE(OP,OGG,4,-1,"", OQ) !線分PG'を4:1の比に外分する点
PRINT OQ
SET LINE COLOR 4
CALL gcLINE(OP,OQ,"","")

PRINT


!物理的重心G'のモーメント

DEF fnMTx(z)=ABS(z)*COS(ARG(z)) !x成分
DEF fnMTy(z)=ABS(z)*SIN(ARG(z)) !y成分

LET Ma=OA-OGG !G'を支点とする
LET Mb=OB-OGG
LET Mc=OC-OGG
LET Md=OD-OGG
LET m=10 !10gのおもり
PRINT (fnMTx(Ma)+fnMTx(Mb)+fnMTx(Mc)+fnMTx(Md))*m !0
PRINT (fnMTy(Ma)+fnMTy(Mb)+fnMTy(Mc)+fnMTy(Md))*m


END


!「定木とコンパスによる描画(GC.LIB)」より抜粋

!●複素数による平面上のベクトルの計算

EXTERNAL FUNCTION v(x,y) !位置ベクトル ↑OP=(x,y)
OPTION ARITHMETIC COMPLEX
LET v=COMPLEX(x,y) !複素数の和差、実数倍の計算を対応させる
!絶対値 ベクトル |a|^2=a・a  複素数 |z|^2=z*conj(z)
END FUNCTION

EXTERNAL FUNCTION fnCROSS(a,b) !擬似外積 a1*b2-a2*b1
OPTION ARITHMETIC COMPLEX
LET fnCROSS=Im(a*conj(b))
END FUNCTION


!●表示ルーチン

EXTERNAL SUB gcPOINT(OA,S$) !点Aを描く
OPTION ARITHMETIC COMPLEX
DRAW DISK WITH SCALE(0.1)*SHIFT(OA) !※
IF S$<>"" THEN PLOT TEXT ,AT OA: S$ !描画モードなら
END SUB

EXTERNAL SUB gcLINE(OA,OB,S1$,S2$) !線分ABを描く
OPTION ARITHMETIC COMPLEX
PLOT LINES: OA; OB
IF S1$<>"" THEN PLOT TEXT ,AT OA: S1$ !描画モードなら
IF S2$<>"" THEN PLOT TEXT ,AT OB: S2$
END SUB


!●点

EXTERNAL SUB gcDIVIDE(OA,OB,m,n,S$, OC) !線分ABをm:nに分ける点(内分・外分する点)
OPTION ARITHMETIC COMPLEX
LET OC=(n*OA+m*OB)/(m+n) !※外分m:nは、m:(-n)となる
CALL gcPOINT(OC,S$)
END SUB

EXTERNAL SUB gcINTERSECTION(OA,OB,OC,OD,S$, OP,K) !直線ABと直線CDとの交点
OPTION ARITHMETIC COMPLEX
LET AB=OB-OA
LET CD=OD-OC
LET DD=fnCross(CD,AB)
IF DD<>0 THEN
   LET AC=OC-OA
   LET OP=OA+( fnCross(CD,AC)/DD ) * AB !交点
   IF S$<>"" THEN CALL gcPOINT(OP,S$) !描画モードなら
   LET K=1
ELSE
   PRINT "平行です。"
   LET K=0 !!!STOP
END IF
END SUB


実行結果

(-1.01495726495726 -.566239316239316)
-1.5

(-1.01495726495727 -.566239316239316)

(-2.95512820512821  1.69871794871795)
-1.5
(-1.01495726495726 -.566239316239316)

-4.44089209850063E-15
-8.88178419700125E-15


 

Re: 図形の重心

 投稿者:山中和義  投稿日:2013年 9月13日(金)19時27分51秒
  > No.3145[元記事へ]



!●平面の点を「平面のベクトルとみる」と「複素数とみる」と考えられる
OPTION ARITHMETIC COMPLEX

SET WINDOW -8,8,-8,8 !表示領域を設定する
DRAW grid !XY座標

LET OA=v(-6,-5) !頂点の座標x,y ※反時計まわり
LET OB=v( 6,-4)
LET OC=v(-1, 6)
LET OD=v(-5, 3)

CALL gcLINE(OA,OB,"A","") !四角形を描く
CALL gcLINE(OB,OC,"B","")
CALL gcLINE(OC,OD,"C","")
CALL gcLINE(OD,OA,"D","")


!●重心(幾何的重心)
LET Oo=v(0,0) !原点
LET S1=fnCROSS(OA,OB)/2 !三角形OABの符号つき面積
LET G1=(Oo+OA+OB)/3 !三角形OABの重心
LET S2=fnCROSS(OB,OC)/2
LET G2=(Oo+OB+OC)/3
LET S3=fnCROSS(OC,OD)/2
LET G3=(Oo+OC+OD)/3
LET S4=fnCROSS(OD,OA)/2
LET G4=(Oo+OD+OA)/3
LET OG=(S1*G1+S2*G2+S3*G3+S4*G4)/(S1+S2+S3+S4) !(ΣS[k]*G[k])/(ΣS[k])

CALL gcPOINT(OG,"G") !重心
PRINT OG


!●重心(物理的重心)
LET OGG=(OA+OB+OC+OD)/4

CALL gcPOINT(OGG,"G'") !重心
PRINT OGG

PRINT


!検算

SET LINE COLOR 3
CALL gcLINE(OA,OC,"","") !対角線
CALL gcLINE(OB,OD,"","")

SET LINE COLOR 4
CALL gcDIVIDE(OA,OB,1,2,"1", W1) !辺ABを3等分
CALL gcDIVIDE(OA,OB,2,1,"2", W2)
CALL gcDIVIDE(OB,OC,1,2,"3", W3) !辺BC
CALL gcDIVIDE(OB,OC,2,1,"4", W4)
CALL gcDIVIDE(OC,OD,1,2,"5", W5) !辺CD
CALL gcDIVIDE(OC,OD,2,1,"6", W6)
CALL gcDIVIDE(OD,OA,1,2,"7", W7) !辺DA
CALL gcDIVIDE(OD,OA,2,1,"8", W8)
CALL gcINTERSECTION(W8,W1,W2,W3,"", OP,K) !交点
CALL gcINTERSECTION(W2,W3,W4,W5,"", OQ,K)
CALL gcINTERSECTION(W4,W5,W6,W7,"", OR,K)
CALL gcINTERSECTION(W6,W7,W8,W1,"", OS,K)

CALL gcLINE(OP,OQ,"P","") !平行四辺形
CALL gcLINE(OQ,OR,"Q","")
CALL gcLINE(OR,OS,"R","")
CALL gcLINE(OS,OP,"S","")

CALL gcLINE(OP,OR,"","") !対角線
CALL gcLINE(OQ,OS,"","")

CALL gcINTERSECTION(OP,OR,OQ,OS,"", OG,K) !交点
PRINT OG

END

※サブルーチン部分は省略した。


実行結果

(-1.01495726495726 -.566239316239316)
-1.5

(-1.01495726495726 -.566239316239316)


 

Re: 図形の重心

 投稿者:GAI  投稿日:2013年 9月13日(金)21時41分44秒
  > No.3146[元記事へ]

山中和義さんへのお返事です。

幾何的重心と物理的重心の違いがとても良くわかりました。
4:1の比に外分されることは思ってもいない現象でした。
こんなプログラムを作って頂いて大変助かります。自分なりにちょこちょこいじって遊んでいます。
 

戻る