|
> No.1472[元記事へ]
つづき
!●円
EXTERNAL SUB gcCIRCLE(Oo,R,N$) !中心点と半径(中心点と円周上の点、中心と直径にも応用できる) |z-α|=r
OPTION ARITHMETIC COMPLEX
SET LINE COLOR gcCOLOR
FOR i=0 TO 360 !弧は折れ線で近似する
LET x=R*COS(RAD(i))
LET y=R*SIN(RAD(i))
PLOT LINES: x+Re(Oo),y+Im(Oo);
NEXT i
PLOT LINES
CALL gcDOT(Oo,N$) !中心を描く
END SUB
EXTERNAL SUB gcCIRCLE2(OA,OB,R,N$, OC) !円周上の2点と半径
OPTION ARITHMETIC COMPLEX
LET OT=(OA+OB)/2 !弦ABの中点
LET AT=OT-OA
LET t=R^2-fnDOT(AT,AT) !三角形ACTの辺CTの長さ
IF t>=0 THEN
LET AB=OB-OA
LET OC=OT+fnNormalize( v(-Im(AB),Re(AB)) )*SQR(t) !垂直二等分線上 ※↑ABの左側
CALL gcCIRCLE(OC,R,"")
CALL gcLINE(OA,OC,N$(1:1)) !点A、半径を描く
CALL gcDOT(OB,N$(2:2)) !点Bを描く
ELSE
PRINT "作図できません。"
STOP
END IF
END SUB
!●三角形
EXTERNAL SUB gcTRIANGLE(OA,OB,OC,N$, a,b,c,S) !頂点A,B,Cの三角形で、3辺の長さa,b,cと面積Sを返す
OPTION ARITHMETIC COMPLEX
LET a=ABS(OC-OB) !辺BCの長さ
LET b=ABS(OA-OC) !辺CA
LET c=ABS(OB-OA) !辺AB
LET S=gcHERON(a,b,c) !三角形ABCの面積
CALL gcLINE(OA,OB,N$(1:1)) !頂点、辺を描く
CALL gcLINE(OB,OC,N$(2:2))
CALL gcLINE(OC,OA,N$(3:3))
END SUB
EXTERNAL FUNCTION gcHERON(a,b,c) !3辺a,b,cの三角形の面積S
OPTION ARITHMETIC COMPLEX
LET t=(a+b+c)/2 !ヘロンの公式より、面積S
LET gcHERON=SQR(t*(t-a)*(t-b)*(t-c))
END FUNCTION
!●三角形の心
EXTERNAL SUB gcINCENTER(OA,OB,OC,N$, OI,R) !三角形ABCの内心(三角形ABCに内接する円の中心と半径)
OPTION ARITHMETIC COMPLEX
CALL gcTRIANGLE(OA,OB,OC,"", a,b,c,S)
LET OI=(a*OA+b*OB+c*OC)/(a+b+c) !内心の位置ベクトル
LET R=2*S/(a+b+c) !S=△IAB+△IBC+△ICA=1/2*c*r+1/2*a*r+1/2*b*r=r*(a+b+c)/2より
IF N$="" THEN LET t$="I" ELSE LET t$=N$
CALL gcCIRCLE(OI,R,t$) !内接円を描く
END SUB
EXTERNAL SUB gcCIRCUMCENTER(OA,OB,OC,N$, Oo,R) !三角形ABCの外心(三角形ABCに外接する円の中心と半径)
OPTION ARITHMETIC COMPLEX
CALL gcTRIANGLE(OA,OB,OC,"", a,b,c,S)
LET sin2A=2*S*(b^2+c^2-a^2)/(b*c)^2 !sin2A=2*cosA*sinA、余弦定理cosA=(b^2+c^2-a^2)/(2*b*c)、面積S=1/2*b*c*sinAより
LET sin2B=2*S*(c^2+a^2-b^2)/(c*a)^2
LET sin2C=2*S*(a^2+b^2-c^2)/(a*b)^2
LET Oo=(sin2A*OA+sin2B*OB+sin2C*OC)/(sin2A+sin2B+sin2C) !外心の位置ベクトル
LET R=a*b*c/(4*S) !正弦定理a/sinA=b/sinB=c/sinC=2*Rと面積S=1/2*b*c*sinAより
IF N$="" THEN LET t$="o" ELSE LET t$=N$
CALL gcCIRCLE(Oo,R,t$) !外接円を描く
END SUB
EXTERNAL SUB gcGRAVITY(OA,OB,OC,N$, OG) !三角形ABCの重心
OPTION ARITHMETIC COMPLEX
LET OG=(OA+OB+OC)/3 !重心の位置ベクトル
IF N$="" THEN LET t$="G" ELSE LET t$=N$
CALL gcDOT(OG,t$) !重心を描く
END SUB
EXTERNAL SUB gcORTHOCENTER(OA,OB,OC,N$, OH) !三角形ABCの垂心
OPTION ARITHMETIC COMPLEX
CALL gcTRIANGLE(OA,OB,OC,"", a,b,c,S)
LET tanA=2*S/(b^2+c^2-a^2) !tanA=sinA/cosAと余弦定理cosA=(b^2+c^2-a^2)/(2*b*c)と面積S=1/2*b*c*sinAより
LET tanB=2*S/(c^2+a^2-b^2)
LET tanC=2*S/(a^2+b^2-c^2)
LET OH=(tanA*OA+tanB*OB+tanC*OC)/(tanA+tanB+tanC) !垂心の位置ベクトル
IF N$="" THEN LET t$="H" ELSE LET t$=N$
CALL gcDOT(OH,t$) !垂心を描く
END SUB
EXTERNAL SUB gcEXCENTER(OA,OB,OC,N$, OI,R) !三角形ABCの傍心(点Aを頂角、点B,Cを外角とする)
OPTION ARITHMETIC COMPLEX
CALL gcTRIANGLE(OA,OB,OC,"", a,b,c,S)
LET OI=((-a)*OA+b*OB+c*OC)/((-a)+b+c) !傍心の位置ベクトル
LET R=2*S/((-a)+b+c) !S=(s-a)*Ra、s=(a+b+c)/2より
IF N$="" THEN LET t$="Ia" ELSE LET t$=N$
CALL gcCIRCLE(OI,R,t$) !傍接円を描く
END SUB
!●多角形
EXTERNAL SUB gcPOLYGON(OC,OA,N,N$, OP()) !点Cを中心、点Aを1頂点とする正n角形
OPTION ARITHMETIC COMPLEX
LET CA=OA-OC
LET R=ABS(CA) !線分CAの長さ
LET a=fnANGLE(v(1,0),CA) !↑CAの角度
LET OP(1)=OA !1点目
FOR i=2 TO N !点Cを中心、半径Rの円
LET th=a+2*PI*(i-1)/N !円周の分割点を結ぶ
LET OT=OC+v(R*COS(th),R*SIN(th))
CALL gcLINE(OP(i-1),OT,N$(i-1:i))
LET OP(i)=OT
NEXT i
CALL gcLINE(OP(N),OA,"") !閉じる
CALL gcLINE(OA,OC,"")
END SUB
EXTERNAL SUB gcPOLYGON2(OA,OB,N,N$, OP(),OC,R) !線分ABを一辺とする正n角形 ※↑ABの左側
OPTION ARITHMETIC COMPLEX
LET m=ABS(OB-OA) !一辺の長さ
LET R=m/(2*SIN(PI/N)) !半径
CALL gcCIRCLE2(OA,OB,R,"", OC) !2点半径円から外接円を求める
CALL gcPOLYGON(OC,OA,N,N$, OP)
END SUB
↑↑↑↑↑ ここまでがサブルーチン ↑↑↑↑↑
サンプル1
:
: 先頭部分は記載を省略する
!------------------------------ ここまでがサブルーチン
!●頂角を持たない角の2等分線を引く
LET OA=v(-5,1) !線分AB
LET OB=v(3,6)
CALL gcLINE(OA,OB,"AB")
LET OC=v(-2,-4) !線分CD
LET OD=v(5,-3)
CALL gcLINE(OC,OD,"CD")
LET gcCOLOR=2
LET OX=v(-1,7) !交差するように任意の線分を引く
LET OY=v(2,-6)
CALL gcLINE(OX,OY,"")
CALL gcINTERSECTION(OA,OB,OX,OY,"P", OP) !交点Pとする
CALL gcINTERSECTION(OC,OD,OX,OY,"Q", OQ) !交点Qとする
LET gcCOLOR=3
CALL gcA2LINE(OP,OA,OQ, Pp) !内角(∠APQ、∠PQC)の2等分線を引く
CALL gcA2LINE(OQ,OP,OC, Qq)
CALL gcINTERSECTION(OP,OP+Pp*1,OQ,OQ+Qq*1,"S", OS) !交点Sとする
CALL gcA2LINE(OP,OQ,OB, Pp) !外角(∠QPB、∠DQP)の2等分線を引く
CALL gcA2LINE(OQ,OD,OP, Qq)
CALL gcINTERSECTION(OP,OP+Pp*1,OQ,OQ+Qq*1,"T", OT) !交点Tとする
LET gcCOLOR=4
CALL gcFLINE(OS,OT-OS,"") !直線STが求める「2等分線」となる
END
:
: 以下サプルーチンは、記載を省略する
サンプル2
:
: 先頭部分は記載を省略する
!------------------------------ ここまでがサブルーチン
!●傍心
LET OA=v(1,3) !三角形ABCの頂点
LET OB=v(-2,-2)
LET OC=v(3,-1)
LET gcCOLOR=1
CALL gcEXCENTER(OA,OB,OC,"", OI,R) !傍心
CALL gcFLINE(OB,OB-OA,"B") !線分ABを延ばす
CALL gcFLINE(OC,OC-OB,"C") !線分BCを延ばす
CALL gcFLINE(OA,OA-OC,"A") !線分CAを延ばす
LET gcCOLOR=4
CALL gcCIRCLE(OI,R,"") !傍接円を描く
CALL gcINTERSECTION1C(OB,OC,OI,R,"1",OP,OQ,K) !接点
CALL gcINTERSECTION1C(OA,OB,OI,R,"2",OP,OQ,K)
CALL gcINTERSECTION1C(OA,OC,OI,R,"3",OP,OQ,K)
LET gcCOLOR=3
CALL gcEXCENTER(OB,OC,OA,"Ib", OI,R) !傍心
CALL gcCIRCLE(OI,R,"") !傍接円を描く
LET gcCOLOR=2
CALL gcEXCENTER(OC,OA,OB,"Ic", OI,R) !傍心
CALL gcCIRCLE(OI,R,"") !傍接円を描く
END
:
: 以下サプルーチンは、記載を省略する
|
|