表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
<R15>15歳未満の方は移動してください。
この作品には 〔残酷描写〕が含まれています。
苦手な方はご注意ください。

なんかカッコいい奴

■課題

 なんかカッコいい立体の実装。


■アルゴリズム

・回転

 三角関数を用いて移動する4点を計算し、左右の回転を表現する。

 また、x座標が固定された2点を上下に移動させ、奥行きに対する回転を表現する。


・描画

 各頂点3つを結び、立体の面を描画する。


■プログラムの説明

 配列x,yには移動する頂点の座標が格納されている。変数mb,mcは上下に移動する2点のy座標に用いる。補正a,b,cに用いる連続する任意の値にはSystem.currentTimeMillis()から日時の値を参照した。

 面の描画には配列fx,fy,gyに代入した値を用いて、fillPolygonで塗りつぶす処理を行っている。fillPolygonを用いているため、ImageファイルからBufferedImageを作成し面テクスチャを実装する事が出来るが、今回は立体感の表現を優先し透過度を設定した色を使用した。

 threadにより三角関数の角度degが加算され、頂点の座標が連続して移動する。


■実行結果

挿絵(By みてみん)

<図1.実行画面>


 実行結果は課題を満たしている。

 日付の値を割る数が大きいほど、奥行きの回転は遅くなる。


■考察

 すごかった。


ソースは下記を参照。

package mathe;


import java.applet.Applet;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.RenderingHints;


/* <applet code="Main.class" width=800 height=800> */


public class Mathe extends Applet implements Runnable{

Graphics db;

Image buf;

int frame_x=450, frame_y=450; //描画サイズ

int deg;

int x[] = new int [4];

int y[] = new int [4];

Thread t1;


public void init() {

buf = createImage( frame_x , frame_y );

deg = 0;


t1 = new Thread(this);

t1.start();


setBackground(Color.white); // アプレットの背景色を白に設定.

}


public void update(Graphics g){

paint(g);

}


public void paint (Graphics g){

db = buf.getGraphics();


db.setColor(Color.gray);

db.fillRect(0 , 0 , frame_x , frame_y);

db.setColor(Color.black);

db.fillRect(10 , 10 , frame_x-20 , frame_y-20);

db.setColor(Color.white);


//アンチエイリアス処理

Graphics2D g2 = (Graphics2D)db;

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING ,

RenderingHints.VALUE_ANTIALIAS_ON );


double date = System.currentTimeMillis()/15.0;

double a = Math.sin(Math.PI/180*date);

double b = Math.sin(Math.PI/180*date+Math.PI/2)*150;

double c = Math.sin(Math.PI/180*date-Math.PI/2)*150;

for(int i = 0; i < 4; i++){

double sin = Math.sin(Math.PI/180*(deg+90*i))*150*a;

double cos = Math.cos(Math.PI/180*(deg+90*i))*150;

x[i]=(int)cos+200;

y[i]=(int)sin+200;

}

int mb = (int)b+200;

int mc = (int)c+200;


for(int i = 0; i < 4; i++){

int fx[] = {x[i],x[(i+1)%4],200};

int fy[] = {y[i],y[(i+1)%4],mb};

int gy[] = {y[i],y[(i+1)%4],mc};

int cr = (300*(i+1))%255;

int cg = (600*(i+1))%255;

int cb = (190*(i+1))%255;

db.setColor(new Color(cr,cg,cb,100));

db.fillPolygon(fx,fy, 3);


cr = (cr+15)%255;

cg = (cg+15)%255;

cb = (cb+15)%255;

db.setColor(new Color(cr,cg,cb,100));

db.fillPolygon(fx,gy, 3);


}

db.fillRect(200-5,mb-5,10,10);

db.fillRect(200-5,mc-5,10,10);

for(int i = 0; i < 4; i++){

db.fillRect(x[i]-5,y[i]-5,10,10);

db.drawLine(x[i],y[i],200,mc);

db.drawLine(x[i],y[i],200,mb);

db.drawLine(x[i],y[i],x[(i+1)%4],y[(i+1)%4]);

}

g.drawImage(buf,0,0,this);

}


public void run() {

try{

while(true){

deg+=1;

if(deg<120)deg+=1;

if(deg<240)deg+=1;

if(deg<270)deg+=1;

if(deg<300)deg+=1;

if(deg<330)deg+=1;

if(deg>360)deg=0;

repaint();

Thread.sleep(20);

}

}catch(Exception e){

System.out.println( e );

}

}

}


評価をするにはログインしてください。
この作品をシェア
Twitter LINEで送る
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
[良い点] 今僕ネカフェにいるんですけどネカフェって結構きれいなんですね。 もっと机の裏にガムとかくっ付いてて埃だらけの部屋を想像してたんですけど予想以上に綺麗でした。 小説読むのになかなか快適な空間…
[気になる点] 最大辛口評価です。 全項目を読み終わりました――が、序盤過ぎて判断のしようがない、というのが正直な感想です。 体裁はきれいにまとまっていると思います。 それと……キツイ言い方になる…
2015/12/28 20:36 退会済み
管理
[良い点] たけしが妖怪を倒したところがおもろかった。やるねたけし。 [気になる点] ちょっと文章がヘタクソかなあ。アイデアはいいのだが。 [一言] パイナップル気分でゴーゴーという感じでがんばっ…
2015/12/28 19:37 退会済み
管理
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ