- PR -

Graphics2Dの中身を知りたい

投稿者投稿内容
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-10-31 20:21
なるほど、そういう意味ですか。
逆に計算していくということなのですね。
分かりました。
やってみたいと思います。
ありがとうございました。
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-10-31 20:50
追加です。
やってみますと簡単に書きましたが、直線を表すピクセルですら、自分で計算する根本的なものになりそうですね。
回転させた頂点の座標から、面を構成する各ピクセルの座標を計算し、それに対応する元のピクセルを計算して、情報を入れるようにすればできそうですね。
私にとってはかなり高度なことですが、やってみようと思います。
ありがとうございました。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-31 23:50
ん?

高度って、元々ゴールデンさんがやっていた方法(空白ができてしまっ
た方法)と同じ程度の複雑さ、コード量にしかならないと思います。

そうでないとしたら何か間違っているかも知れませんよ。
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-11-01 23:43
どうやってもできないので、方眼紙に図を描いてみたら、空白ができる仕組みと、どんなところに空白ができるのかがしっかりわかった。コード自体は短くてすみそうですが、表示される1つの面の各ピクセルの並びが、横○列、縦○列のような一定ではできないことも分かった。なので暗礁に乗り上げています。
空白場所に、周りで重なっているピクセルを移動すればよいのですが、もしかしたら、周りに重なったピクセルが無い場合も考えられる。そういう場合は、ピクセルの押し出しをしなければならない。
頭がぐるぐるになったので、今日はやめますが、このような考え方でやっていけばできるのでしょうか。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-11-02 00:31
引用:
どうやってもできないので、方眼紙に図を描いてみたら、空白ができる
仕組みと、どんなところに空白ができるのかがしっかりわかった。


すばらしい!

引用:
表示される1つの面の各ピクセルの並びが、横○列、縦○列のような
一定ではできないことも分かった。なので暗礁に乗り上げています。


最初からあまり深く考えずに、まずは三角関数で求めた元画像側の座標を整数
に丸めてしまって良いと思います。(だって、ゴールデンさんが最初にやった
ときも、結局そうだったでしょう?)

画質が気に入らなければ、改良のアルゴリズムをあれこれ試してみるのが良い
のではないでしょうか。
ゴールデン
常連さん
会議室デビュー日: 2004/08/22
投稿数: 46
投稿日時: 2004-11-03 22:56
やっぱりだめです。できません。
こうなったら、と思い、Excelで、コードのとおりに数式を入れて数値をチェックし、コードのおかしいところを見つけ(けっこうあった)、直していったら、固まったり変形するのは無くなったので、最終チェックとして方眼紙にピクセルを描いてみたら、空白がでない仕組みにちゃんとなっていた。
なのに、appletviewerで表示すると、空白ができてしまっている。
ちなみにその部分のコードです。(paint()部分)
プログラムの数値とエクセルの数値に違いが無いかもdrawStringで表示して確かめ、数式入力ミスもなくしました。
なのに、おかしいのです。
コード:

og.setColor(Color.white);
og.fillRect(0,0,300,300);
System.arraycopy(kara,0,pixels,0,(p*2)*(p*2)));
for(int j=0;j<6;j++){
if(checkV(j)>0){
             //穴のできる2面を回転
if(j==1||j==3){
//頂点のみ回転させる
dot[j][0].rotate(kyori_x,kyori_y);
dot[j][p-1].rotate(kyori_x,kyori_y);
dot[j][(p-1)*p].rotate(kyori_x,kyori_y);
dot[j][p*p-1].rotate(kyori_x,kyori_y);

double ax=dot[j][p-1].new_x-dot[j].[0].new_x;
double ay=dot[j][p-1].new_y-dot[j][0].new_y;
double bx=dot[j][(p-1)*p].new_x-dot[j][0].new_x;
double by=dot[j][(p-1)*p].new_y-dot[j][0].new_y;
double xy=Math.abs(ax)+Math.abs(ay);

double a=ay/xy;
double b=ax/xy;
double c=bx/Math.max(Math.abs(bx),Math.abs(by));
double d=by/Math.max(Math.abs(bx),Math.abs(by));
double e=p/xy;
double f=p/Math.max(Math.abs(bx),Math.abs(by));
for(int i=0;i<(int)(Math.max(bx,by));i++){
for(int k=0;k<(int)xy;k++){
                           //回転後のx座標を決める
pix_x[j][i*(p*2)+k]=dot[j][0].new_x+(int)(Math.rint(k*b))+(int)(Math.rint(i*c));
//回転後のy座標を決める
pix_y[j][i*(p*2)+k]=dot[j][0].new_y+(int)(k*a)+(int)(i*d);
                           //回転後のピクセルの色情報
pix_col[j][i*(p*2)+k]=org[j][100*(int)(i*f)+(int)(k*e)];
                           //イメージを作るためのpixelsに情報を入れる
pixels[200*(pix_y[j][i*(p*2)+k])+pix_x[j][i*(p*2)+k]]=pix_col[j][i*(p*2)+k];
}
}
}
             //穴のできない4面の回転
else{
for(int i=0;i<p*p;i++){
dot[j][i].rotate(kyori_x,kyori_y);
pixels[200*dot[j][i].new_y+dot[j][i].new_x]=org[j][i]; }
}
}
}
mis.newPixels();


pは100です。
jは面の番号で、1と3面は、ピクセルの穴ができてしまう面です。
おかしいところを指摘してくださると嬉しいです。

[ メッセージ編集済み 編集者: ゴールデン 編集日時 2004-11-03 23:03 ]

[ メッセージ編集済み 編集者: ゴールデン 編集日時 2004-11-03 23:04 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-11-04 02:15
ゴールデンさん、頑張ってますね。

特殊な投影を使うとか、半透明とかでなければ、6面全て処理する必要は
ないと思います。
見えている3面だけ処理しますね。

各面が単純な色で塗りつぶすだけなら多角形の塗りつぶしで簡単ですが、
これまでのゴールデンさんがやってきた内容からすると、各面は画像が貼
りつけられるのでしょうね。

完成を楽しみにしています。

スキルアップ/キャリアアップ(JOB@IT)