プロが教える店舗&オフィスのセキュリティ対策術

三角形を書くプログラムが
30度右に曲がる。
100歩進む。
120度右に曲がる。
100歩進む。
120度右に曲がる。
100歩進む。
120度右に曲がる。
で下記のように記述する。
--------プログラム--------
30度右に曲がる。
{100歩進む。120度右に曲がる。}
ことを3回繰り返す。
--------------------------------

では、5角形は、どうなりますか?

6角形や8角形では、どうなりますか?

何か公式は、ありますか?

A 回答 (5件)

#3です。



> 最初は、90度で上を向いていてそこからプログラムが始まります。
> ですので三角形は、30度右に曲がる必要があります。

ということは,
図にすると,すごくイビツになってしまいましたが,
次の図のような正三角形になるということですか。
(イビツで正三角形に見えませんが...)

   ↑上(最初の向き)
 □■□□□□□□□□□□□□
 □■□□□□□□□□□□□□
 □■□□□□■□□□□□□□
 □■□□□■□■□□□□□□
 □■□□■□□□■□□□□□
 □■□■□□□□□■□□□□
 □■■□□□□□□□■□□□
 ■■■■■■■■■■■■■■ →横(右)
 □■□□□□□□□□□□□□


ということは,
#4 の方の書かれていらっしゃる,

> 自分は画面左下にいて画面上方向を見ているっていうのが
> デフォルト状態なのでは?

ということになりますね。ご名答。

すると四角形だと,こういうことでしょうか?↓

   ↑上(最初の向き)
 □■□□□□□□□□□□□□
 □■□□□□□□□□□□□□
 □■■■■■■■■■■■□□
 □■□□□□□□□□□■□□
 □■□□□□□□□□□■□□
 □■□□□□□□□□□■□□
 □■□□□□□□□□□■□□
 □■□□□□□□□□□■□□
 □■□□□□□□□□□■□□
 ■■■■■■■■■■■■■■
 □■□□□□□□□□□□□□

五角形だと...,こういうこと?↓

       ↑上(最初の向き)
 □□□□■□□□□□□□□□□□□□□
 □□□□■□□□□■□□□□□□□□□
 □□□□■□□■■□■■□□□□□□□
 □□□□■■■□□□□□■■□□□□□
 □□□■■□□□□□□□□□■■□□□
 □■■□■□□□□□□□□□□□■■□
 □□■□■□□□□□□□□□□□■□□
 □□■□■□□□□□□□□□□□■□□
 □□□■■□□□□□□□□□□■□□□
 □□□■■□□□□□□□□□□■□□□
 □□□□■□□□□□□□□□■□□□□
 ■■■■■■■■■■■■■■■■■■■
 □□□□■□□□□□□□□□□□□□□

そうではない可能性も考えられますが...,
素直に考えれば上のようになるような気がします。


上のようになるという規則に従うものとして,以下を回答します。

もし上のような規則で正n角形を描くのであれば,
「上方向」を最初の向きの基準として,なおかつ,
「右に曲がる」というルールを基準として考えるとややこしくなります。

ですからまず,
「右方向」を最初の向きの基準として,なおかつ,
「左に曲がる」というルールを基準として考えます。

最初は「右方向」を向いているとします。
三角形だと,180-360÷3=60 度左に曲がらなければなりません。
四角形だと,180-360÷4=90 度左に曲がらなければなりません。
五角形だと,180-360÷5=108 度左に曲がらなければなりません。
六角形だと,180-360÷6=120 度左に曲がらなければなりません。
  …          …            …
n角形だと,180-360÷n 度左に曲がらなければなりません。

上の式の,
「360÷n」の部分は,#3で回答した角度と同じです。
これは,正多角形の外角の意味にもなります。
多角形の内角と外角の和は180度ですから,
正n角形の1つの内角は 180-360÷n になると考えても良いです。


しかし本当は,
「左に曲がる」というルールではなく「右に曲がる」というのがルールですから,
上のものの数値をマイナスにしなければなりません。
したがって,上の物は次のように書き替える必要があります。

最初は「右方向」を向いているとします。
三角形だと,360÷3-180=-60 度右に曲がらなければなりません。
四角形だと,360÷4-180=-90 度右に曲がらなければなりません。
五角形だと,360÷5-180=-108 度右に曲がらなければなりません。
六角形だと,360÷6-180=-120 度右に曲がらなければなりません。
  …          …            …
n角形だと,360÷n-180 度右に曲がらなければなりません。


しかし,さらに本当は,
最初は「右方向」を向いているのではなく,「上方向」を向いているのですから,
90度はすでに左に向いてしまっています。
ですからさらに 90 度右に向けさせる必要が出てきます。
したがって,次のように書き替える必要があります。

最初は「上方向」を向いているとします。
三角形だと,360÷3-180+90=30 度右に曲がらなければなりません。
四角形だと,360÷4-180+90=0 度右に曲がらなければなりません。
五角形だと,360÷5-180+90=-18 度右に曲がらなければなりません。
六角形だと,360÷6-180+90=-30 度右に曲がらなければなりません。
  …          …            …
n角形だと,360÷n-180+90 度右に曲がらなければなりません。
つまり
n角形だと,360÷n-90 度右に曲がらなければなりません。


したがって,1辺100歩の正n角形を描くプログラムの公式は次のようになります。

--------プログラム-----------------
360/n -90 度右に曲がる。
{100歩進む。360/n 度右に曲がる。}
ことをn回繰り返す。
--------------------------------

やれやれと...,
答えがやたら簡単な割には長い説明になってしまいましたね。
説明のしかたが悪くてすみません。


本題は以上です。


////////////////////////////////////////////////////////

あと最初に思ったことです。
ふと個人的に思っただけのことなので,以下は適当に聞き流してください。

そのプログラミングを続ける先の話ですが,
角度が常に「○度右に曲がる」 という前の状態に対する相対的な角度ですよね。
ですから,上のプログラムは,
「歩く物体をこの方向に向ける」という絶対座標系でのプログラミングには向いていません。
ですから,続けて考える場合,
「○度右に曲がる」 というのは,動く物体自体を○度回転させるのではなく,
座標系全体を 「○度右に回転させる」 という意味のプログラムとして扱うと簡単になるような気がします。

例えば,物体自体は,
モニタ上に線を引きながら,常に同じ速さで常に同じ方向に歩くようにさせます。
そして 物体 が 100歩 歩く度に,歩いている地面を,物体を中心に「○度右に回転」させます。
すると,
モニタ上には正n角形が自動的に作図されます。

そういう感じで動作するものにすると,
sin とか cos とか atan2 とかは登場させなくても,
「○度右に回転」 だけで済むプログラムになるかもしれません。

個人的には Flash というソフトで ActionScript という言語を専門にしています。
その Flash で,
上の座標系の回転という考え方をとり入れれば
次のようになります(関係ない話だと思いますが)。

ステージ上(_root)に
座標系の役割を果たす A というオブジェクト(空のムービークリップ)の中に,
動かす物体 B というオブジェクト(ムービークリップ)を作成します。
オブジェクトの階層構造を次のようにすると言うことです。

 _root
  └A
    └B

そして,次のようなプログラムコードを書くと,
モニタ上で見た目 B が n角形をえがくように動きます。

------------------------------------------
// 変数 n の初期値を定義(この場合三角形)
n = 3;

// オブジェクトA を 360/n -90 度右に回転させる
A._rotation += 360/n-90;

// ユーザ定義関数 idouKaiten を定義
function idouKaiten() {
// オブジェクトA の中の オブジェクトB を 1px 上向きに動かす
A.B._y -= 1;

// A の中の B の座標が -100 以下になれば
if (A.B._y<=-100) {
// B の絶対座標を算出
myPoint = {x:0, y:0};
A.B.localToGlobal(myPoint);
// A を B の絶対座標まで動かす
A._x = myPoint.x;
A._y = myPoint.y;
// A を 360/n 度回転させる
A._rotation += 360/n;
// A の中の B を原点に戻す
A.B._y = 0;
}
}

// 1フレーム進む時間ごとに毎回 上の idouKaiten を実行
_root.onEnterFrame = idouKaiten;
------------------------------------------

 (↑単なる イメージ や フロー ではなく,
  Flash(Flash MX以上)で実際に動作するコードです。)


オブジェクトA の中の B は,ひたすら
  A.B._y -= 1; (A.B._y = A.B._y - 1 の意味です)
で,A の中を上に動き続けます。
そしてもし 100px 以上,上方向に動けば
  if (A.B._y<=-100)
最初の場所に戻されるだけです。
  // A の中の B を原点に戻す
  A.B._y = 0;

その B を最初の場所に戻す寸前に,
B の外側にある(親に当たる) A の座標を
B の絶対座標と一致させる と同時に, 360/n 度回転させます。

すると,
B は A の中で1pxずつ上に動き続けるだけなのに,
A の外にあるモニタでは B はn角形を描画するように動いて見えます。

sin や cos などが出てこないプログラム例です。


全然関係ないプログラムを作られているのだとは思いますが,
座標系自体を回転させるという考え方が何かのヒントになりましたらと思い,
付けくわえさせていただきました。

以上,私個人の勝手なつぶやきだと思って,適当に聞き流してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/18 22:55

#3さま


>最初に登場する 「30度右に曲がる。」 の 30度 が,
>何を根拠(基準)として出てくる 30度 なのかがわかりません。

自分は画面左下にいて画面上方向を見ているっていうのがデフォルト状態なのでは?
それで、三角形をピラミッドのような向きで表示したいと、、、

aya_aya123さま
>では、5角形は、どうなりますか?
>6角形や8角形では、どうなりますか?

上の三角形の場合でいう30°を加味したアルゴリズムも必要ですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
三角形の場合でいう30°を加味したアルゴリズムも必要です。
最初は、90度で上を向いていてそこからプログラムが始まります。
ですので三角形は、30度右に曲がる必要があります。
6角形や8角形でも必要です。

お礼日時:2007/05/21 21:33

最初に登場する 「30度右に曲がる。

」 の 30度 が,
何を根拠(基準)として出てくる 30度 なのかがわかりません。

その部分は除いたとすると,
三角形だと,360÷3=120 度ずつ 3回 曲がると元の原点に戻って最初の方向を向きますね。
四角形だと,360÷4=90 度ずつ 4回 曲がると元の原点に戻って最初の方向を向きます。
五角形だと,360÷5=72 度ずつ 5回 曲がると元の原点に戻って最初の方向を向きます。
六角形だと,360÷6=60 度ずつ 6回 曲がると元の原点に戻って最初の方向を向きます。
  …          …            …
n角形だと,360÷n 度ずつ n回 曲がると元の原点に戻って最初の方向を向きます。

したがって,

--------プログラム--------
30度右に曲がる。
{100歩進む。360/n 度右に曲がる。}
ことをn回繰り返す。
--------------------------------

となると思いますが......
最初の30度は何なのでしょうかね?
よくわかりませんが,一応回答しました。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
三角形の場合でいう30°を加味したアルゴリズムも必要です。
最初は、90度で上を向いていてそこからプログラムが始まります。
ですので三角形は、30度右に曲がる必要があります。
6角形や8角形でも必要でどうなるのでしょうか。

お礼日時:2007/05/21 21:34

ご質問で提示された「プログラム」に沿うと、



--------正n角形を描くプログラム--------
(内角の1/2)度右に曲がる。
{100歩進む。(180-内角)度右に曲がる。}
ことを n回繰り返す。
---------------------------------------

正三角形なら内角が60度なので、
内角の1/2 = 30
180-内角 = 120

なお、正n角形の内角は 180×(n-2)/n 度です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/27 22:00

中心点(xc, yc)で半径rの円周上にn角形の頂点があるものとして



1. 0度から360度までを360/nステップで増加する
2. 度をラジアンに変換し、それをaとする
3. x = xc + r * cos( a ), y = yc + r * sin( a )
4. 0度のときは座標(x,y)に移動する、それ以外のときは座標(x,y)まで線を引く
5. 1.から繰り返す

とすればとりあえずn角形は描けます。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
私には、難しく理解ができませんが参考にさせていただきます。

お礼日時:2007/05/27 21:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!