HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1019
fall多角形8未解決


fall

リンク

2012/10/19(Fri) 23:45:32|NO.50080

みなさんこんにちは。fallです。今回はほかでもなく今(私の心の中で)話題の多角形の描写
というのをやりたくてかきこみました。私がやりたいのは、数字を入力して多角形をつくる
ということです。自分でも調べたのですが、GUIを使用して配列変数にそって形作るというの
は分かりましたが、数字を入力して多角形を作る方法が分かりません。どうか教えてください



この記事に返信する


GENKI

リンク

2012/10/20(Sat) 00:52:00|NO.50084

> 数字を入力して多角形をつくるということです。

正多角形と理解していいんでしょうか?qaddpoly命令と同じような感じなのかな?

簡単な数学の問題だと思うんですが、三角関数習ってないと難しいでしょうね。
一周360度を当分割して半径距離のとこの座標出すだけです。

dim points, 10 t = 2.0 * M_PI / 5 ;deg2rad(360/5) でもいい r = 40 i = 0 repeat 5 ;x points(i) = int(cos(t*cnt) * r) i++ ;y points(i) = int(sin(t*cnt) * r) i++ loop
こんなかんじにするとalDrawPoly命令とかで正多角形が作れます。
あとはモジュール化とかしとくと便利なんじゃないでしょうか。

あ、配置の向きを入れてなかった…適当に入れてみてください。



YSR

リンク

2012/10/20(Sat) 01:44:09|NO.50088

>GENKIさん
「話題の多角形」とか言っている辺り、
fallさんはひょっとして多面体の話をしたいんじゃないかと思うの

ま、座標計算が多角形より遥かに面倒になるけど。四面体ですら頭が痛くなるのに……
多角形ならGENKIさんが書いた方法で正解。要するに円周をn等分する話
※「一辺の長さを100ピクセルにした正五角形がほしい」とかになると、流石に数学の知識は要る



GENKI

リンク

2012/10/20(Sat) 02:12:36|NO.50089

> ま、座標計算が多角形より遥かに面倒になるけど。四面体ですら頭が痛くなるのに……

多面体ならあらかじめ座標のパターンを作っておいて、必要に応じて拡大・縮小して使うのが現実的かも。


> ※「一辺の長さを100ピクセルにした正五角形がほしい」とかになると、流石に数学の知識は要る

と言うと難しく聞こえますが、実際は高校で普通に教わる程度の知識です。



fall

リンク

2012/10/20(Sat) 08:34:15|NO.50091

えっと、私が作りたいのは正多角形です。説明不足で申し訳ありません。
GENKIさんのプログラムちょっと実行してみます



FunnyMaker

リンク

2012/10/20(Sat) 09:04:09|NO.50093

来年度のコンテスト応募作品に組み込むために作っていたモジュールを載せます。
塗り潰し型なので、中空にしたかったらサイズを一回り小さくしたものを背景色で
もう一度描画すればOKです。
モジュールのファイル名は何でもいいですが、「Mod_RegularPolygon.as」をおすすめします。


;「Mod_RegularPolygon.as」 ;正多角形描画モジュール ;by FunnyMaker ;2012/10/7 ; [書式] ; Mod_RegularPolygon P1,P2,P3,P4,P5 ; P1 = (外接円のx座標) ; P2 = (外接円のy座標) ; P3 = (頂点の数) ≧ 3 ; P4 = (外接円の半径) ≧ 1 ; P5 = (左回りの傾き(°)) ; 現在選択されているウィンドウに現在選択されている色で正多角形を描画します。 ; 描画が正常に終了したら stat の値が0に、エラーが発生した場合は stat の値が1になります。 #module Mod_Name_RegularPolygon #deffunc Mod_RegularPolygon int center_x ,int center_y ,int num_top ,int radius ,int startθ if num_top < 3 : return 1;頂点の数が少なすぎたらエラー if radius < 1 : return 1;外接円の半径が小さすぎたらエラー dim arrange_x,4 : dim arrange_y,4 repeat num_top arrange_x(0) = int(center_x + double(radius)*cos(deg2rad(double(360)/double(num_top)*double(cnt + 1) + double(startθ)) + m_pi/double(2))),int(center_x + double(radius)*cos(deg2rad(double(360)/double(num_top)*double(cnt) + double(startθ)) + m_pi/double(2))),center_x,center_x arrange_y(0) = int(center_y - double(radius)*sin(deg2rad(double(360)/double(num_top)*double(cnt + 1) + double(startθ)) + m_pi/double(2))),int(center_y - double(radius)*sin(deg2rad(double(360)/double(num_top)*double(cnt) + double(startθ)) + m_pi/double(2))),center_y,center_y gsquare -1,arrange_x,arrange_y loop return 0 #global

下のサンプルコードで試してみてください。


#include "Mod_RegularPolygon.as" screen 0,800,600 randomize redraw 0 repeat 100 color rnd(255),rnd(255),rnd(255) Mod_RegularPolygon rnd(800),rnd(600),rnd(10) + 3,rnd(100) + 1,rnd(360) await 0 loop redraw 1 wait 200 color 0,0,0 : Mod_RegularPolygon 300,300,5,200,0

描画時にちらつく時はredraw0をしてこのモジュールを実行してからredraw1をしてください。



FunnyMaker

リンク

2012/10/20(Sat) 09:17:53|NO.50094

掲示板を見づらくしてしまっていました。(右下の「記事削除」のあたりがズレてますね。)
でも改行を入れるわけにも行かず...
本当にすみません。



osakana

リンク

2012/10/20(Sat) 10:25:57|NO.50096

適度に計算式を分けると良いですよ
適当ですがこんな感じで

#module Mod_Name_RegularPolygon #const pi2 m_pi/2 #deffunc Mod_RegularPolygon int center_x ,int center_y ,int num_top ,int radius ,int startθ if num_top < 3 : return 1;頂点の数が少なすぎたらエラー if radius < 1 : return 1;外接円の半径が小さすぎたらエラー dim arrange_x,4 : dim arrange_y,4 rad0 = double(360) / num_top repeat num_top rad1 = deg2rad(rad0 * (cnt + 1)) + startθ + pi2 rad2 = deg2rad(rad0 * cnt) + startθ + pi2 arrange_x = center_x + (cos(rad1) * radius), center_x + (cos(rad2) * radius), center_x, center_x arrange_y = center_y - (sin(rad1) * radius), center_y - (sin(rad2) * radius), center_y, center_y gsquare -1,arrange_x,arrange_y loop return 0 #global



FunnyMaker

リンク

2012/10/20(Sat) 13:37:43|NO.50097

osakanaさんありがとうございます。
角度と、それによる座標の計算とを分けたのですね。
見ためがすっきりするだけでなく理解しやすくもなりました。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.