【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?

はじめまして。kodemarimanと言います。
皆さんよろしくお願いします。

早速ですが、質問です。多分高校数学レベルの問題です。

右上の座標が(x1,y1)=(200,200)、左下の座標が(x2,y2)=(0,0)の正方形を考えます。

次の手順で座標を変換して、この正方形を描画すると、斜めになった長方形になります。
1:座標系を反時計周りに30度回転します。
2:座標系をx方向に1.2倍、y方向に1.5倍偏倍します。
3:正方形を書きます。

ですが、次の手順だと斜めになった長方形でなく、菱形になってしまいます。
1:座標系をx方向に1.2倍、y方向に1.5倍編倍します。
2:座標系を反時計周りに30度回転します。
3:正方形を書きます。

これって、なぜなんでなんでしょう?

目的としては、このような座標変換を繰り返し行っても
(例えば座標を回転して偏倍して平行移動して座標を回転して偏倍して平行移動して
座標を回転して偏倍して平行移動して・・・)
いつでも長方形(正方形)が描かれるような座標変換を行いたいのですが・・・

ちなみにテストに使ってるソフトはGhostScriptといいます。
これはポストスクリプトのプログラムを書くと画像にしてくれる
便利なソフトです。
↓URL
http://www.cs.wisc.edu/~ghost/index.htm

A 回答 (5件)

>やぱり長方形じゃなくて平行四辺形になってしまいました。


困りましたね。
こちらでは適当な n の値を代入して表示させると
長方形になっているようなのですが。

大丈夫だと思いますが誤解があるといけないので書いておきます。
下の回答での行列は n 回変換後の結果を出すだけですのでこの行列を何回も
掛けていくというものではありません。
1回ごとの結果を表示させるには n の値を1ずつふやして代入し
そのたびに表示させていくことになります。
(このあたりが望みのものとは違うかもしれません)

まだ、謎が解けていない状態ではあまり意味がないかもしれませんが
任意の倍率、回転の場合は次のようです。

k回目の操作である辺をAk倍、もう一つの辺をBk倍、回転角θkのとき
n回操作後の結果を求める行列は

  ┌ ΠAk*cos(Σθk) -ΠBk*sin(Σθk) ┐
A=│                    │
  └ ΠAk*sin(Σθk) ΠBk*cos(Σθk)  ┘

のようになります。
ただし、ΠAk=A1*A2*…*An、Σθk=θ1+θ2+…+θnです。
    • good
    • 0
この回答へのお礼

どうも、kodemarimanです。
謎は解けました。ちょっと正負の符号を間違えてました。(^^;
じっちゃんの名にかけられるほどの謎じゃなかったです。(苦笑)

で、私の目的の方ですが、教えていただいた行列式を元に、
こういう考えで解決しました。


   ┌ 1.2*cos(nπ/6) -1.5*sin(nπ/6) ┐
An=│                    │
   └ 1.2*sin(nπ/6)  1.5*cos(nπ/6) ┘

で、座標系の回転と拡大を行ったあと、再び回転をかけるまえに

   ┌ 1/1.5 0 ┐
Bn=│         │
   └ 0  1/1.2 ┘

をかけて、拡大率を1に戻します。(かなり力技ですが。(^^;)
それからまた回転、拡大を書けるという処理を続けます。

これを繰り返す事で、目的は達成する事ができました。
どうもありがとうございました。

お礼日時:2001/08/01 10:08

少し不親切でした。


n は座標変換の回数、1.2^n は siegmund さんの補足にあるようにn乗のことです。

以下、No.2の回答での行列の導き方です。
まず、初期状態として座標 O(0,0)、A(200,0)、B(200,200)、C(0,200)
を頂点とする正方形OABCを考えます。

ここで、n回座標変換を行なった後OAベクトルは
長さが 1.2 の n乗倍に、また 30*n[度]= nπ/6[rad]回転します。
すなわち、OA'ベクトル
 ( 200*1.2^n*cos(nπ/6),200*1.2^n*sin(nπ/6) )
に写されます。
したがって、n回の座標変換を行なう行列をAnとして
 ┌ 200*1.2^n*cos(nπ/6) ┐    ┌200┐
 │            │ = An│  │   
 └ 200*1.2^n*sin(nπ/6) ┘    └ 0 ┘
という式が成り立ちます。

同様にしてOCベクトルがOC'ベクトル
 ( -200*1.5^n*sin(nπ/6),200*1.5^n*cos(nπ/6) )
に写されることから
 ┌ -200*1.5^n*sin(nπ/6)┐    ┌ 0 ┐
 │            │= An│  │   
 └ 200*1.5^n*cos(nπ/6)┘    └200┘
という式が成り立ちます。
これらの式から行列AnがNo.2のように決まります。

また、変換後のOA'とOC'の内積をとると0になることから
変換後の2つのベクトルは垂直になっていることがわかりますね。
さらに、変換前
 OB = OA + OC
ですから変換後のOB'ベクトルは
 OB'= OA'+ OC'
というベクトルに写されます。
よって、四角形OA'B'C'は長方形になっています。
平行移動については行列で操作できないので最後にn回分まとめて動かすしかなさそうですね。

ところで、同じ辺を1.2倍し続けるのでいいのでしょうか?

この回答への補足

いえ、目的としては同じ辺を1.2倍しつづけるのではありません。

やりたいのは、ある座標系に描いた図形を、回転と拡大縮小の座標変換を行う事で
任意の大きさに拡大縮小して、かつ任意の角度に回転させることです。
また、そうして変換した座標系の中でさらに拡大や縮小、回転を行いたいのです。

で、どーもそういう作業(ポストスクリプトでプログラムを組んでいるんですが)をしていると、途中で図形がゆがんできてしまうので
困ってしまったんですよ。(^^;
(2回目の回転と拡大縮小で、なんかゆがんでしまう)

ところで、教えていただいたこの変換行列で試したところ、やぱり長方形
じゃなくて平行四辺形になってしまいました。理屈は納得できるのですが・・・
謎です。Ghostのバグなのかしら。(でもこれも長生きのソフトだからそれはないかも)
ほかに実験できそうなツール探して試してみようかな。

補足日時:2001/07/29 09:20
    • good
    • 0

> 行列の計算は不可逆なのが有るんですね。

(そういえばそうだったな)

「不可逆」でなくて「非可換」という方がいいでしょう.
「不可逆」は熱力学で使われる言葉で,意味がちがいます.
それから,行列の乗法は一般に非可換です.
加法の方は A+B = B+A で可換ですけどね.

> ”^”記号は何を意味するのですか?

1.2^n は 1.2 のn乗の意味です.
    • good
    • 0

行列は一般に非可換だからです。


kodemariman さんが期待されておられるものとは違うかもしれませんが
次のような行列なら平行移動はしませんが
ある辺を1.2倍、それと垂直な辺を1.5倍し続けます。


   ┌ 1.2^n*cos(nπ/6) -1.5^n*sin(nπ/6) ┐
An=│                     │
   └ 1.2^n*sin(nπ/6) 1.5^n*cos(nπ/6)  ┘

この回答への補足

ご回答ありがとうございます。
少しわからないのですが、
この行列式ですが、”n”は座標変換の回数だと思うのですが
”^”記号は何を意味するのですか?

あと、もしよろしければこの行列がどのように導き出されるかを
教えていただきたいです。

補足日時:2001/07/27 13:46
    • good
    • 0

座標系の回転操作と偏倍操作が可換ではないからです.



回転操作の行列表現は

 ┌  cosθ sinθ┐
A=│        │
 └ -sinθ cosθ┘

偏倍の方は
 ┌a 0┐
B=│   │
 └0 b┘

です.
明らかに,AB≠BA ですね.
(sinθ=0,あるいは a=b の場合を除く)

この回答への補足

さっそくの回答ありがとうございます。

行列の計算は不可逆なのが有るんですね。(そういえばそうだったな)
そうすると、一度編倍または回転をかけちゃうと、
それ以上編倍や回転はできないのかな?

もしやるとしたら、編倍したXY座標サイズをのを元のサイズに戻して
それからまた回転、編倍しなくちゃいけないのかなあ。うーむ。

補足日時:2001/07/27 13:55
    • good
    • 0

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