課題が全く分かりません;

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しっぽ

課題が全く分かりません;

#1

投稿記事 by しっぽ » 12年前

こんにちは。
この間学校で出された課題なのですが、ネットなどで探してみても何をどうすればいいのか全くわからない状態で、質問させていただくことにしました;

課題は、自分で定義した立体図形の透視投影像を描くっていうものなんで、与えられているヒントは↓な感じです。

・立体図形は頂点および稜線を定義し、線図形として描く。
・立体図形は世界座標の原点の近傍で定義する。
・視点を適当な世界座標(x, Y, Z)に置き、ここから世界座標の原点を見る。
・投影面の視点から距離Dおよび投影面のサイズSは適当に決める。
・世界座標系による立体のデータを視点座標系に変換し、これを透視投影し投影図を求める。
隠線処理、ビューボリューム、3次元クリッピングの処理は行わなくてよい。

言っていることはなんとなく分かるんですが、画像系のプログラミングは全然やったことがなくて;
最終的にはImage Magicの画像をプリントアウトして提出しなければいけないみたいなんですが・・・
とりあえず、頂点と稜線のデータのファイルを作って、読み込んで始めるっていうのは分かるんですが、その後、何をどう処理すれば立体図形が出来るのか、皆目見当がつきません><

えっと、何でも構わないので、理解の助けになるサイトとか、何かプログラムを書くとっかかりになるような助言などありましたら、よろしくお願いしますっ!

たいちう
記事: 418
登録日時: 13年前

Re: 課題が全く分かりません;

#2

投稿記事 by たいちう » 12年前

高校レベルの三角関数だけでも何とかなりそうな課題ですね。

> とりあえず、頂点と稜線のデータのファイルを作って、
> 読み込んで始めるっていうのは分かるんですが、

判るところまでしっかりと作ってみてはどうですか?
その後の方が、しっぽさんもイメージが掴みやすいし、
回答者にも何に困っているのか伝わりやすいですよ。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 課題が全く分かりません;

#3

投稿記事 by みけCAT » 12年前

前に私がsoftyaさんが作ったサンプルがあるので、紹介しておきます。
http://dixq.net/forum/viewtopic.php?f=83&t=7643
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 課題が全く分かりません;

#4

投稿記事 by ISLe » 12年前

しっぽ さんが書きました:とりあえず、頂点と稜線のデータのファイルを作って、読み込んで始めるっていうのは分かるんですが、
わたしにはそんなふうには読めないですけども。
とりあえず
{{-1.0, 1.0}, {1.0, 1.0}, {1.0, -1.0}, {-1.0, -1.0}}
という初期値の配列(あるいは構造体)を使って、画面に正方形を描いてみるってのはどうですか。

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: 課題が全く分かりません;

#5

投稿記事 by GRAM » 12年前

たいちう さんが書きました:高校レベルの三角関数だけでも何とかなりそうな課題ですね。
まぁ一般的な高校生のレベルだと難しいんじゃないんですかね?
考えるのが面倒なのであれですが、三角関数だけでどうにかするのはめんどくさそうですし。

ビュー変換とか射影変換とか調べればごろごろ解説が出てくると思います。
また後ろに行列とつけて「ビュー変換 行列」みたいに調べればふつうに答えがヒットします。
このやり方だと行列の知識が必要になりますが、行列の演算方法だけ知っておけば後はコピペで行けると思いますよ。
まぁ少なくとも3次元の変換系の話に関しては、自分の場合めんどくさいので頭使って考えたりはしないですね

取りあえずイメージとしては、
視点が原点に来るように世界を平行移動、その後視線がZ軸正の向き(左手座標系で)になるように回転させる
そのあと遠近的な処理を施して遠くのほうの世界を縮めたあと、スクリーンにどばっと投影してやって完成
って感じになるのでしょう。

たいちう
記事: 418
登録日時: 13年前

Re: 課題が全く分かりません;

#6

投稿記事 by たいちう » 12年前

> まぁ一般的な高校生のレベルだと難しいんじゃないんですかね?

一般的な高校生のレベルというのが判りません。特に最近について。
しかし20年以上前に高校で教えていた内容は覚えていますので、
当時と大きく変わっていないならば何とかなると思うのです。
実際、高校生の時に↓のようなプログラムをN88-BASICやPASCALで作ってましたし。
http://www.gnuplot-cmd.com/3d/img/set-hidden3d.png


> まぁ少なくとも3次元の変換系の話に関しては、
> 自分の場合めんどくさいので頭使って考えたりはしないですね

学生さんがそんな事をしていると課題が出るたびに
手も足も出ない状況になってしまうのかと。

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: 課題が全く分かりません;

#7

投稿記事 by GRAM » 12年前

>>たいちうさん
ガウス関数っすか~ガウスフィルタにでも使うんですかね?
そんなもん知ってる高校生はごくわずかだと思いますよ。
というかそもそも統計の範囲が消え去ってるので標準偏差とかも知らないわけですからね。
ましてや2変数関数とか。無茶ぶりってもんですよ。
頭のいい生徒ならおよそ関数がどんなものか予想できると思いますが、たとえ国公立大学に合格者をぼこすか出すような進学校の生徒でも
95%以上の生徒が何やってるか答えられないでしょうね~。
もはや本題とはそれてしまいますが、自分が思う一般的な高校生のレベルだと(というか2年前まで高校生やってたので大体あってると思いますが)

①3次元に関する知識はほとんどない。ベクトルが使えて、平面の方程式とか知ってればよく勉強してるほう。
②行列に関する知識がほとんどない。
  2x2までしかやらないし、根本的にベクトルの変換というより座標の変換だと考えている(のでこういう原点が移動する複雑な変換は苦手)
③そもそも多数の人が三角関数を苦手としている。というか使いどころや必要性を理解できていない

自分の認識が正しければ難しいと思うんですけどね~。
要は知識がないんですよ、頭の良し悪し以前に。積極的に学ぼうとする意欲がなければふつうにしていてこの課題が自力で解けるとはどうにも・・・。
ま、一般論なんてどうでもいいんですけどね。課題は課題としてここに実際出されてるわけですし。そもそもおよそ講義でやった内容しか課題にはならないでしょう!
学生さんがそんな事をしていると課題が出るたびに
手も足も出ない状況になってしまうのかと。
そうですかね?この程度のことならもう定型的な考え方でしょう。
#方程式解くときにいちいち両辺から同じ数を引くとか考えない。「移項する」と考える
#微分するのにいちいち微分の定義を用いない。x2なら2を係数に持ってきて2乗から1減らすと考える

座標変換の考え方も似たようなものだと思うんですよね。
どこに何が書いてあるのかさえ分かってれば、非実用的な範囲の本質的な部分はとりあえずスルーしてもOKというのが自分の考え方ですね。
テストだとそうはいかないでしょうが、課題ですし。
そうでもなきゃ好きでもないのに数学なんてやってられませんよ・・・。

たいちう
記事: 418
登録日時: 13年前

Re: 課題が全く分かりません;

#8

投稿記事 by たいちう » 12年前

GRAMさん。
大変興味深いご意見感謝しています。
本題からは外れてしまう点もありますが、よろしければもう少し聞かせて下さい。


> 自分の認識が正しければ難しいと思うんですけどね~。
> 要は知識がないんですよ、頭の良し悪し以前に。
> 積極的に学ぼうとする意欲がなければふつうにしていてこの課題が自力で解けるとはどうにも・・・。

道具としての三角関数は習っているのですよね?
この種の応用にも使えないならば、何のために習っているのですか?
もちろん責めるつもりはなく、何の役に立っているかに興味があります。

それと、この課題を出したのは私ではありません。
高校生か大学生か専門学校生か新入社員なのかは判りませんが、
しっぽさんが要求されている課題だという事です。

道具としての三角関数を既に習っている学齢だとして、
普通はこの課題を解けないとしたら、出題者はどのような意図だったのでしょうか?


> ガウス関数っすか~ガウスフィルタにでも使うんですかね?
> ...
> ましてや2変数関数とか。無茶ぶりってもんですよ。

ガウス関数だったのは陰線処理をググって例に出しただけで、
単にz = f(x, y)の例として出しただけなのですが、無茶ぶりでしたか。


> ①3次元に関する知識はほとんどない。ベクトルが使えて、平面の方程式とか知ってればよく勉強してるほう。
> ...
> 要は知識がないんですよ、頭の良し悪し以前に。
> 積極的に学ぼうとする意欲がなければふつうにしていてこの課題が自力で解けるとはどうにも・・・。

3次元のベクトルとか、3次元の直線や平面の方程式とか、習わないのですか?
xy平面上の曲線をx軸の周りで回転させた図形の体積を求めたりするは、過去の話でしたか?

知識は与えられているけど応用する分野を与えられていないのだと何となく思っていましたが、
知識すら教わっていないのですか。少しショックなので、今度現代の高校の教科書を読んでみます。


> そうですかね?この程度のことならもう定型的な考え方でしょう。
> #方程式解くときにいちいち両辺から同じ数を引くとか考えない。「移項する」と考える
> #微分するのにいちいち微分の定義を用いない。x2なら2を係数に持ってきて2乗から1減らすと考える

私は普段の計算ではそのような考え方で十分だと思います。
ただし何故そのような計算をしているのか、必要な時に説明できなければなりません。
(説明できることが重要なのではなく、他人に説明できない場合は本人も理解していないと私は考えるからです。)


> どこに何が書いてあるのかさえ分かってれば、
> 非実用的な範囲の本質的な部分はとりあえずスルーしてもOKというのが自分の考え方ですね。

質問者さんはそれが分かっていないから、「課題が全く分かりません」と言っていると思うのですが。

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: 課題が全く分かりません;

#9

投稿記事 by GRAM » 12年前

たいちう さんが書きました: 道具としての三角関数は習っているのですよね?
この種の応用にも使えないならば、何のために習っているのですか?
まぁ3次元で三角関数をまともに扱かうのはそんなに簡単じゃないでしょうというのが自分の意見です。
行列使わずにできる自信は正直ないですね。で、その行列は高校の範囲外です。
おっしゃってるとおり、この質問自体は高校レベルでとけるかどうかは関係ないので、敢えてこだわることもないんでしょうけど、
仮にほんとに高校の知識だけで解こうとするとどうなるのかは若干気になるところではありますね。
たいちう さんが書きました: 単にz = f(x, y)の例として出しただけなのですが、無茶ぶりでしたか。。
いえ、自分はガウス関数の3次元バージョンを知らないだろうという意味で言いました。
まぁ2変数関数自体も高校の範囲じゃないですけどねw
たいちう さんが書きました: 3次元のベクトルとか、3次元の直線や平面の方程式とか、習わないのですか?
xy平面上の曲線をx軸の周りで回転させた図形の体積を求めたりするは、過去の話でしたか?
さすがに回転体くらいはやりますけど、あれは3次元じゃないですからね。
いや出来上がるのは3次元ですけど積分自体は1変数ですし。
あと、積分なり2変数関数なりを使って出来上がる曲面の接平面を求めろとかは高校生には無理です。
直線や平面の方程式を習わないことはないですけど、3次元のベクトルをまともにやらないので(具体的には外積をやらないので)、ベクトルとの関連が薄くてほとんど使い物になりません。こういった意味で一般的な高校生は満足に3次元を扱えないというのが自分の意見ですね。

およそ話をうかがっていると、たいちうさんが習っていて自分らがまともにやらなかったのは
①複素平面②統計③2変数関数④あとその他こまごまと
って感じですかね。おもしろいことに大学に入ると知ってるものとされちゃうんですけどねwおかげで若干面倒でしたよ。全く。
たいちう さんが書きました: 質問者さんはそれが分かっていないから、「課題が全く分かりません」と言っていると思うのですが
えぇ。なので調べる手段を提示しました。整合性は取れてると思うのですが・・・。
ぶっちゃけこの質問の課題自体は最初に書いた通りビュー変換と射影変換行列を知ってるか否かで終わりだと思うんですよ。
で、それを自力で導出しようとしたときに何の知識が必要かというところに踏み込むと、自分は高校生には難しいという意見になります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 課題が全く分かりません;

#10

投稿記事 by softya(ソフト屋) » 12年前

横から失礼します。
私は高校2年ぐらいの時に透視変換とかは行っていました。
CPUがZ80の時代でしたので、透視変換、クリッピングぐらいでしたが三角関数だけで行いました。
そのころは行列を使うとか全く知りませんでしたね。

なので、私としては高校生でもとんでもなく難しい問題とは思えないわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: 課題が全く分かりません;

#11

投稿記事 by GRAM » 12年前

softya(ソフト屋) さんが書きました: 私は高校2年ぐらいの時に透視変換とかは行っていました。
CPUがZ80の時代でしたので、透視変換、クリッピングぐらいでしたが三角関数だけで行いました。
そのころは行列を使うとか全く知りませんでしたね。
なので、私としては高校生でもとんでもなく難しい問題とは思えないわけです。
透視変換に直接三角関数は必要ないと思うのですがいかがでしょう?
視野角もアスペクト比も適当でよいこの課題ではそれで何の問題もないですしね。
自分が難しいと感じているのはこの一文です

・視点を適当な世界座標(x, Y, Z)に置き、ここから世界座標の原点を見る。

これはどう考えても空間の原点移動と回転の処理が必要になります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 課題が全く分かりません;

#12

投稿記事 by softya(ソフト屋) » 12年前

GRAM さんが書きました:透視変換に直接三角関数は必要ないと思うのですがいかがでしょう?
アスペクトや画角がないならたしかに不要ですね。
分りやすい45度とかに固定すれば良いですし。
GRAM さんが書きました:・視点を適当な世界座標(x, Y, Z)に置き、ここから世界座標の原点を見る。
これはどう考えても空間の原点移動と回転の処理が必要になります。
原点回転はたしかに必要なんですよね・・・。
うーん。高校時代にどうやってたんだろう・・・。
確かに自分のプログラムでワールド回転させたが??? ソースコードが残っていないので不明です(^^;
行列の展開式を雑誌とかで見てそのまま使っていたのかなぁ?
それとも平面の回転を独自に発展させていた!?
うっ、覚えてない。
たしかにここは、3次元の回転を習っていない高校生では難しいかも知れませんね。

質問者であるしっぽ さんは、課題として出ているので習っている可能性が大きいですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る