投稿者:Ban
投稿日:2011年 4月28日(木)09時33分41秒
|
|
|
初めまして、グラフィックについての質問です
鋭角な二等辺三角形を重心を 中心に回転させる方法を
お教えください
もし、既出でしたら、申し訳ございません
宜しくお願い致します
|
|
|
投稿者:山中和義
投稿日:2011年 4月28日(木)11時33分48秒
|
|
|
> No.1534[元記事へ]
Banさんへのお返事です。
鋭角な二等辺三角形の作図するための要件が未定ですので、
3つの頂点をXY座標で定義すると仮定します。
プログラムは鋭角な二等辺三角形になっていませんので、修正してください。
すぐ下のスレッドのように
複素平面(複素数モード)を使って、「複素数の演算」や「平面ベクトルによる図形方程式」でも描けます。
また、FullBASICの図形描画機能(PICTURE文、DRAW ~ WITH ROTATE(th)*SHIFT(x,y)文)でも可能です。
!図形と方程式、列ベクトルとその回転行列
SET WINDOW -5,5,-5,5 !表示領域
DRAW grid !座標
SET POINT STYLE 5 !x形状
LET AX=-2 !点A(-2,-3) XY座標上に定義する
LET AY=-3
LET BX=3 !点B
LET BY=-2
LET CX=2 !点C
LET CY=4
PLOT LINES: AX,AY; BX,BY !辺ABを描く
PLOT LINES: BX,BY; CX,CY !辺BC
PLOT LINES: CX,CY; AX,AY !辺CA
PLOT TEXT ,AT AX,AY: "A" !頂点Aを描く
PLOT TEXT ,AT BX,BY: "B" !頂点B
PLOT TEXT ,AT CX,CY: "C" !頂点C
LET GX=(AX+BX+CX)/3 !重心Gの座標を算出する
LET GY=(AY+BY+CY)/3
PLOT POINTS: GX,GY !重心G
PLOT TEXT ,AT GX,GY: "G"
SET LINE STYLE 3 !点線
PLOT LINES: CX,CY; (AX+BX)/2,(AY+BY)/2 !頂点Cから辺ABへの中線を描く
PLOT LINES: AX,AY; (BX+CX)/2,(BY+CY)/2 !頂点Aから辺BCへの中線を描く
PLOT LINES: BX,BY; (CX+AX)/2,(CY+AY)/2 !頂点Bから辺CAへの中線を描く
SET LINE STYLE 1
DIM v(2),R(2,2) !列ベクトルとその回転行列
LET th=PI/3 !原点を中心に反時計まわりに60°回転させる
LET R(1,1)=COS(th) !列ベクトル v'=R*v
LET R(1,2)=-SIN(th)
LET R(2,1)=SIN(th)
LET R(2,2)=COS(th)
LET v(1)=AX-GX !G=Oとする
LET v(2)=AY-GY
MAT v=R*v
LET PX=v(1)+GX !A→P
LET PY=v(2)+GY
LET v(1)=BX-GX !G=Oとする
LET v(2)=BY-GY
MAT v=R*v
LET QX=v(1)+GX !B→Q
LET QY=v(2)+GY
LET v(1)=CX-GX !G=Oとする
LET v(2)=CY-GY
MAT v=R*v
LET RX=v(1)+GX !C→R
LET RY=v(2)+GY
SET LINE COLOR "RED"
PLOT LINES: PX,PY; QX,QY !辺PQ
PLOT LINES: QX,QY; RX,RY !辺QR
PLOT LINES: RX,RY; PX,PY !辺RP
PLOT TEXT ,AT PX,PY: "P" !頂点P
PLOT TEXT ,AT QX,QY: "Q" !頂点Q
PLOT TEXT ,AT RX,RY: "R" !頂点R
END
|
|
|
投稿者:Ban
投稿日:2011年 4月28日(木)16時06分50秒
|
|
|
投稿者:プカリ
投稿日:2011年 5月 1日(日)13時39分6秒
|
|
|
> No.1534[元記事へ]
はじめまして。最近こちらの Basic を始めたばかりです。
三角形を回転する絵定義バージョンの例を作りました。
変形関数 shift(a,b) を重ねるところがミソです。
描画を回転するだけでよろしければ、ご参考までに。
今後ともよろしくお願いします。
!---- 絵定義による三角形の回転表示
SET WINDOW -5,5,-5,5
DRAW grid
DIM p(3,2)
DATA -2,-3,3,-2,2,4 !元の三角形頂点の座標
MAT READ p
LET gx=(p(1,1)+p(2,1)+p(3,1))/3 !三角形の重心
LET gy=(p(1,2)+p(2,2)+p(3,2))/3
PICTURE trian
PLOT LINES: p(1,1),p(1,2);p(2,1),p(2,2);p(3,1),p(3,2);p(1,1),p(1,2)
SET LINE STYLE 3
PLOT LINES: gx,gy;p(1,1),p(1,2)
PLOT LINES: gx,gy;p(2,1),p(2,2)
PLOT LINES: gx,gy;p(3,1),p(3,2)
SET LINE STYLE 1
PLOT TEXT ,AT p(1,1),p(1,2): "A"
PLOT TEXT ,AT p(2,1),p(2,2): "B"
PLOT TEXT ,AT p(3,1),p(3,2): "C"
END PICTURE
DRAW trian
PLOT TEXT ,AT gx,gy: "G"
SET COLOR mode "NATIVE"
SET LINE COLOR BVAL("0000ff",16)
SET TEXT COLOR BVAL("0000ff",16)
DRAW trian WITH SHIFT(-gx,-gy)*ROTATE(PI/3)*SHIFT(gx,gy)
END
|
|
|
投稿者:プカリ
投稿日:2011年 5月 5日(木)23時08分40秒
|
|
|
> No.1539[元記事へ]
複素平面で三角形を回転するバージョンを作りました。
この方法では、頂点記号 A,B,C は回転の影響を受けません。
回転後の頂点座標値を得ることもできます。
もっと複雑な形状になれば、複素数の配列を扱えると便利かもしれません。
ベターな方法がありましたらよろしくお願いします。
!----- 複素平面において三角形を回転する
OPTION ARITHMETIC COMPLEX
SET WINDOW -5,5,-5,5
DRAW grid
LET z1=COMPLEX(-2,-3) !元の三角形頂点の座標
LET z2=COMPLEX(3,-2)
LET z3=COMPLEX(2,4)
LET zg=(z1+z2+z3)/3 !三角形の重心
LET zr=COMPLEX(COS(PI/3),SIN(PI/3)) !回転ベクトル
DEF rot(z)=(z-zg)*zr+zg !写像操作
SUB trian(z1,z2,z3)
SET LINE STYLE 1
PLOT LINES: re(z1),im(z1);re(z2),im(z2);re(z3),im(z3);re(z1),im(z1)
SET LINE STYLE 3
PLOT LINES: re(zg),im(zg);re(z1),im(z1)
PLOT LINES: re(zg),im(zg);re(z2),im(z2)
PLOT LINES: re(zg),im(zg);re(z3),im(z3)
PLOT TEXT ,AT re(z1),im(z1): "A"
PLOT TEXT ,AT re(z2),im(z2): "B"
PLOT TEXT ,AT re(z3),im(z3): "C"
END SUB
CALL trian(z1,z2,z3)
PLOT TEXT ,AT re(zg),im(zg): "G"
SET COLOR mode "NATIVE"
SET LINE COLOR BVAL("0000ff",16)
SET TEXT COLOR BVAL("0000ff",16)
CALL trian(rot(z1),rot(z2),rot(z3))
END
|
|
|
投稿者:SECOND
投稿日:2011年 5月 8日(日)02時59分20秒
|
|
|
> No.1541[元記事へ]
プカリさんへのお返事です。
!絵定義の方で、文字まで回転したくないときは、 PLOT label を使います。
!以下は、ご参考に・・
! N角形の重心で回転 (ver.7.5.0 以降で動きます)
!--------------
OPTION ARITHMETIC COMPLEX
SET WINDOW -5,7,-6,6
!
LET m=7 !7 角形まで、アニメーション
DIM z(m)
DATA -2,-3, 3,-2, 4,3, 2,4, 0,2, -3,3, -1,-1 !N 角形頂点 x1,y1, x2,y2, ,,,
!
FOR i=1 TO m
READ a,b
LET z(i)=COMPLEX(a,b)
NEXT i
!
FOR N=3 TO m
LET St=0
LET G=0
FOR i=1 TO N
LET j=MOD(i,N)+1
LET St=St+Si( z(i), z(j) )
LET G =G +Si( z(i), z(j) )*Gi( z(i), z(j) )
NEXT i
LET G= G/St !N 角形の重心
!
FOR ang=0 TO 2.001*PI STEP PI/16
SET DRAW mode hidden
CLEAR
DRAW grid
SET LINE COLOR "green"
DRAW polygon
SET LINE COLOR "red"
DRAW polygon WITH SHIFT(-G)*ROTATE(ang)*SHIFT(G)
SET DRAW mode explicit
WAIT DELAY .05
NEXT ang
WAIT DELAY .7
NEXT N
PICTURE polygon
FOR i=1 TO N
SET LINE STYLE 3
PLOT LINES: z(i); G
SET LINE STYLE 1
PLOT LINES: z(i); z( MOD(i,N)+1 )
PLOT label,AT z(i): CHR$( ORD("A")+i-1 )
NEXT i
PLOT label,AT G: "重心"
END PICTURE
DEF Si(a,b)=(re(a)*im(b)-im(a)*re(b))/2 !cross(a,b)/2 ・・△0ab の面積( 負号含む)
DEF Gi(a,b)=(a+b)/3 !(0+a+b)/3 ・・△0ab の重心
END
|
|
|
投稿者:プカリ
投稿日:2011年 5月11日(水)22時30分39秒
|
|
|
> No.1542[元記事へ]
SECONDさんへのお返事です。
複素配列の作りかた、参考になります。Ver-7.4.8.0 では PLOT LINES: z(i); が通らなかったのですが、Ver-7.5.3.0 をインストールしたら動くようになりました。
絵定義で文字が回る件、PLOT Label という手がありましたか。今後ともよろしくお願いします。
|
|
|
戻る