凹凸N角形を描く 山中和義 2004/08/24 18:31:45 ├その1 山中和義 2004/08/24 18:34:03 ├その2 山中和義 2004/08/24 18:35:08 ├おもしろそうですね ゆめの 2004/08/24 20:19:49 ├どの点からも移動できるのがいいですね ゆめの 2004/08/24 20:40:23 └作図がおわった後で ゆめの 2004/08/24 21:12:14
凹凸N角形を描く 山中和義 2004/08/24 18:31:45 ツリーへ
凹凸N角形を描く |
返事を書く |
山中和義 2004/08/24 18:31:45 | |
!頂点を一筆書きで凹凸N角形を描く ![使い方] ! 頂点をドラッグして移動できる。 ! 辺上をクリック、ドラッグして頂点(角数)を増やせる。 ! 辺を右ドラッグして移動できる。 ! 上下のカーソルキーで角数の増減ができる。 ! ESCキーで終了。 |
├その1 山中和義 2004/08/24 18:34:03 ツリーへ
Re: 凹凸N角形を描く |
返事を書く |
山中和義 2004/08/24 18:34:03 | |
その1 SET BITMAP SIZE 640,480 !画面サイズ SET WINDOW 0,640,0,480 !左下が原点。横がX、縦Y SET COLOR mode "NATIVE" !RGB指定 SET TEXT font "",12 !文字サイズ LET N = 3 !角数 LET CX = 200 !中心(x,y) LET CY = 300 LET R = 100 !半径 LET C = colorindex(1,0,1) !色 OPTION BASE 0 DIM PX(500),PY(500) CALL CalcPoint(N,CX,CY,R,C,PX,PY) !N角形の頂点を求める DRAW DrawPolygon(N,C,PX,PY) !N角形を描く LET drag_left = 0 LET drag_right = 0 DO mouse poll x,y,left,right !マウスの状態を得る IF left=1 THEN !左ボタンが押された、押されていたら IF drag_left = 1 THEN !ドラッグ中なら LET PX(pp) = x !マウスの位置に追従させる LET PY(pp) = y IF pp=N THEN !N番目と0番目(同一点) LET PX(0) = x LET PY(0) = y END IF DRAW DrawPolygon(N,C,PX,PY) !N角形を描く ELSE LET pp = CheckNear(N,x,y,PX,PY) !クリックした位置が IF pp>0 THEN LET drag_left = 1 !頂点ならドラッグ中とする ELSE LET pp = CheckNearLine(N,x,y,PX,PY) !クリックした位置が IF pp>0 THEN LET drag_left = 1 !線上ならドラッグ中とする CALL AddPoint(pp,x,y,N,PX,PY) !クリックした点を追加する DRAW DrawPolygon(N,C,PX,PY) !この時点で作画しておく END IF END IF END IF ELSE LET drag_left = 0 END IF IF right=1 THEN !右ボタンが押された、押されていたら IF drag_right = 1 THEN !ドラッグ中なら LET xx = x - xo LET yy = y - yo LET PX(pp-1) = PX(pp-1) + xx !マウスの位置に追従させる LET PY(pp-1) = PY(pp-1) + yy IF pp=1 THEN !N番目と0番目(同一点) LET PX(N) = PX(0) LET PY(N) = PY(0) END IF LET PX(pp) = PX(pp) + xx LET PY(pp) = PY(pp) + yy IF pp=N THEN !N番目と0番目(同一点) LET PX(0) = PX(N) LET PY(0) = PY(N) END IF DRAW DrawPolygon(N,C,PX,PY) LET xo = x LET yo = y ELSE LET pp = CheckNearLine(N,x,y,PX,PY) IF pp>0 THEN LET drag_right = 1 LET xo = x LET yo = y END IF END IF ELSE LET drag_right = 0 END IF IF getkeystate(38)<0 THEN !上カーソルキーなら LET N = N + 1 !角数を増やす IF N>50 THEN LET N = 50 CALL CalcPoint(N,CX,CY,R,C,PX,PY) DRAW DrawPolygon(N,C,PX,PY) END IF IF getkeystate(40)<0 THEN !下カーソルキーなら LET N = N - 1 IF N<3 THEN LET N = 3 CALL CalcPoint(N,CX,CY,R,C,PX,PY) DRAW DrawPolygon(N,C,PX,PY) END IF IF getkeystate(27)<0 THEN STOP !ESCキーなら WAIT DELAY 0.1 !ちょっとだけ待つ LOOP END |
├その2 山中和義 2004/08/24 18:35:08 ツリーへ
Re: 凹凸N角形を描く |
返事を書く |
山中和義 2004/08/24 18:35:08 | |
その2 !各頂点の位置を算出し、N角形を描く EXTERNAL SUB CalcPoint(N,CX,CY,R,C,PX(),PY()) LET alp = PI/2 !1点目の位置を補正する if N=4 then LET alp = PI/N FOR i=0 TO N !各頂点の位置を算出する LET PX(i) = -R*cos(2*PI*i/N + alp) + CX LET PY(i) = R*SIN(2*PI*i/N + alp) + CY NEXT i END SUB !当り判定 ※2点間の距離を算出 EXTERNAL FUNCTION CheckNear(N,x,y,PX(),PY()) LET CheckNear = -1 FOR i=1 TO N !各頂点との LET xx = PX(i) - x !距離を計算する LET yy = PY(i) - y IF xx*xx+yy*yy<81 THEN !近くなら LET CheckNear = i !その頂点番号を返す EXIT FUNCTION END IF NEXT i END FUNCTION !当り判定 ※線上 EXTERNAL FUNCTION CheckNearLine(N,x,y,PX(),PY()) LET CheckNearLine = -1 FOR i=1 TO N !各線分との ! PRINT SideLine(x,y,PX(i-1),PY(i-1),PX(i),PY(i)) IF ABS(SideLine(x,y,PX(i-1),PY(i-1),PX(i),PY(i)))<400 THEN !近くなら CALL SetP(X1,X2,PX(i-1),PX(i)) CALL SetP(Y1,Y2,PY(i-1),PY(i)) IF x-X1>=-5 AND x-X2<=5 AND y-Y1>=-5 AND y-Y2<=5 THEN !線分の範囲で LET CheckNearLine = i !その線分番号を返す EXIT FUNCTION END IF END IF NEXT i END FUNCTION !点(x,y)を2点(x1,y1)、(x2,y2)を通る直線の式に代入する !※正なら上側、負なら下側、0なら線上 EXTERNAL FUNCTION SideLine(x,y,X1,Y1,X2,Y2) LET SideLine = (Y2-Y1)*(x-X1)-(X2-X1)*(y-Y1) END FUNCTION !点を座標値の大小で設定する ※X1<X2 EXTERNAL SUB SetP(X1,X2,XX1,XX2) LET X1 = XX1 LET X2 = XX2 IF XX1>XX2 THEN LET X1=XX2 LET X2=XX1 END IF END SUB !K番目に頂点を追加する ※角数はN+1になる EXTERNAL SUB AddPoint(K,x,y,N,PX(),PY()) FOR i=N TO K STEP -1 !K番目を空けるため、後方にずらす LET PX(i+1) = PX(i) LET PY(i+1) = PY(i) NEXT i LET PX(K) = x !K番目に追加する LET PY(K) = y LET N = N + 1 !角数を増やす END SUB !画面をクリア後、N角形を描く EXTERNAL PICTURE DrawPolygon(N,C,PX(),PY()) SET DRAW MODE HIDDEN !ちらつきを抑える SET AREA COLOR colorindex(1,1,1) !画面をクリアする PLOT AREA:0,0; 640,0; 640,480; 0,480 DRAW polygon2(N,C,PX,PY) !N角形を描く SET DRAW MODE EXPLICIT END PICTURE !N角形を描く EXTERNAL PICTURE polygon2(N,C,PX(),PY()) !角数、中心点、半径、色 SET LINE COLOR C SET LINE WIDTH 2 FOR i=0 TO N PLOT LINES:PX(i),PY(i); !辺を描く PLOT POINTS:PX(i),PY(i) !頂点を描く NEXT i END PICTURE |
├おもしろそうですね ゆめの 2004/08/24 20:19:49 ツリーへ
Re: 凹凸N角形を描く |
返事を書く |
ゆめの 2004/08/24 20:19:49 | |
おもしろそうですね まえのと比べてみます |
├どの点からも移動できるのがいいですね ゆめの 2004/08/24 20:40:23 ツリーへ
Re: 凹凸N角形を描く |
返事を書く |
ゆめの 2004/08/24 20:40:23 | |
どの点からも移動できるのがいいですね 折り紙ソフトと比較してみると 自由度が高くて良いと思います。 できれば 書いた図形を メニュー で印刷 全部消す が できるといいですね 学校では ストローを使って 辺をそれぞれ違う色で表しますが 作図したあと 説明用に 始点と 終点を マウスで決めて 辺ごとに 三角形や四角形の 辺を表示できると わかりやすいですね。 改良できるでしょうか? |
└作図がおわった後で ゆめの 2004/08/24 21:12:14 ツリーへ
Re: 凹凸N角形を描く |
返事を書く |
ゆめの 2004/08/24 21:12:14 | |
作図がおわった後で 任意の辺上の任意の点から 他の辺上の任意の点に 点線がひけるようにできますでしょうか? 折りたたむという 指導・指示が多いのです。 もしできれば宜しく お願いします。 |