三角形の回転

 投稿者:Ban  投稿日:2011年 4月28日(木)09時33分41秒
  初めまして、グラフィックについての質問です
鋭角な二等辺三角形を重心を 中心に回転させる方法を
お教えください
もし、既出でしたら、申し訳ございません
宜しくお願い致します
 

Re: 三角形の回転

 投稿者:山中和義  投稿日: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
 

Re: 三角形の回転

 投稿者:Ban  投稿日:2011年 4月28日(木)16時06分50秒
  > No.1535[元記事へ]

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

早速の回答、ありがとうございました
参考にさせていただきます
 

Re: 三角形の回転

 投稿者:プカリ  投稿日: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
 

Re: 三角形の回転

 投稿者:プカリ  投稿日: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
 

Re: 三角形の回転

 投稿者: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
 

Re: 三角形の回転

 投稿者:プカリ  投稿日: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 という手がありましたか。今後ともよろしくお願いします。
 

戻る