ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2012/01/02

新年!javascriptイライラ棒ゲーム

あけましておめでとうございます。
年賀状代わりにjavaでイライラ棒ゲームつくりました。
下のソースコードをメモ帳に貼りつけて、拡張子htmlで保存すると遊べます。
<body onKeyDown="K=event.keyCode-37"><script>K=2;var x,y,t,o;t=0;x=1;y=1;o=0;var a=new Array(4294967295,3252805635,2563557169,4241287161,3251431299,2681005887,2682644287,2147746560,4294967295);function Y(){X=new Array(9);s=new String();t++;if(K==1)y--;if(K==2)x++;if(K==3)y++;if(K==0)x--;for(i=0;i<X.length;i++) {X[i]=new Array(32);for(j=0;j<X[i].length; j++){X[i][j]=a[i].toString(2).charAt(j);if(i==y&&j==x){if(X[i][j]==1){o=1;}else if(i==7&&j==31){o=2;}X[i][j]="★";}else{if(X[i][j]==0)X[i][j]="□";if(X[i][j]==1)X[i][j]="■";}s=s.concat(X[i][j]);}s=s.concat("<BR>");}s=s.concat("速度. "+t+"        あけましておめでとうございます!jun1chi");document.body.innerHTML=s;if(o==1){alert("Over");}else if(o==2){alert("Clear!");}else{setTimeout(Y,400-t*4);}}Y();</script>
実行するとすぐに動き始めます!
十字キーで★の進行方向を変えます。■にぶつかるとゲームオーバーです。
右端のゴールを目指して下さい。見難いですがコースは'2012'になってます。
今年も良いお年を!

2011/11/10

openframeworksでswprintf使って日本語表示。

瞬く静寂さんの方法でOpenFrameworksで日本語フォント表示をやろうとしたが、
変数等を格納したstringを使って日本語を表示しようとすると少し厄介だったのでメモ。

string A = "てすとてすと";
(あるいはsprintfとかで変数入れてもおけ?)
setlocale(LC_ALL, "ja_JP.UTF-8");wchar_t wcs[20];
swprintf(wcs,40,L"%s",A.c_str());
wstring B=wcs;
myFont.drawString(B, 0, 100);


setlocaleのなかの値をjapaneseだと駄目だった、ちゃんとUTF-8指定じゃないといけないぽい。
あとdrawStringがwstringだからちょっと扱いづらい。

ofxXmlSettingsで日本語の要素を使うなら、この辺を使うと上手くいく

2011/03/10

C言語とC++の連携したプロジェクトで was not declared in this scope がでたら、、

C++のプログラムの中の関数で、C言語のプログラムから関数を参照したい場合、
"xx" was not declared in this scopeっていうエラーがでました。

調べるとCから参照する場合、
externで連携する必要があります。

/* x.cpp */
extern "C" int test(char *, char *);

/* x.c */
int test(char *, char *);

とすればおk
参照元がc言語というのを見落としていたため無駄な時間をかけてしまった、、

2011/02/08

MacportsでOpenCV2.1インストール

1.macportsを導入

macportsをダウンロード

支持に従いインストールを行う。

2.環境変数
ターミナルを起動し、不可視ファイルを見えるようにする。
$ defaults write com.apple.finder AppleShowAllFiles true
$ killall Finder

ホームディレクトリに.bash_profile と .bashrc を作る。
.bash_profileには
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
.bashrcには
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
を入れて、miとかで保存。
再びターミナルで不可視に。
$ defaults write com.apple.finder AppleShowAllFiles false
$ killall Finder

ターミナルでmacportsのアップデートを行う。
$ sudo port -d selfupdate
$ sudo port -d sync

駄目なら、参照ファイルを変える必要がある。以下の手順
以下のファイルを編集する。
/opt/local/etc/macports/sources.conf

管理者権限が必要なので、viエディタで。
> sudo vi /opt/local/etc/macports/sources.conf

以下のようにコメントアウトand追記。

#rsync://rsync.macports.org/release/ports/ [default]
http://www.macports.org/files/ports.tar.gz [default]

あるいはVPN接続している可能性あり。
接続環境を確認しましょう。

3.opencvをインストール
ターミナルで以下コマンド。

$ sudo port install opencv

結構時間掛かりました。30分くらい。


2010/11/06

回転行列から角度を割り出す

メモ:sinとcosが分かっていて、
回転行列から角度を割り出す。
acosとasinを使う。

  double a_c, a_s,a_t;
    a_c = acos(patt_trans[0][0]);
    a_s = asin(patt_trans[1][0]);

    double rad;
    if(a_s > 0.0) {rad = a_c;}
    else     { rad = PI + PI - a_c;}


2010/07/19

OpenCV SURF

2010/05/16

ビルボード効果

オブジェクトが常にカメラの正面を向いていることを
ビルボード効果という。
たとえば擬似パーティクルや木の表現に使う。

以下サンプル。processinで実装されてる。
http://www.mentalgifts.net/article/146253887.html
追加で外部ライブラリをいれる。
http://www.gdsstudios.com/processing/libraries/ocd/
http://hg.postspectacular.com/toxiclibs/downloads



processing用テクスチャ関数

processingのテクスチャ用関数つくってみた。
引数、x,yが座標
sがサイズ
imgがテクスチャ情報(先に宣言)

Tex(0,0,100,tex);
みたいにつかう。

void Tex(float x,float y,float s,PImage img){
   noStroke();
  beginShape();
    texture(img);
 vertex(x, y, 0, 0);
 vertex(x+s, y, 120, 0);
 vertex(x+s, y+s, 120, 120);
 vertex(x, y+s, 0, 120);
 endShape();
}


2010/04/03

アノトペン接続方法

アノトペンの接続が出来たのでマニュアル化

アノトペン KG-DP301
動作環境
OS:windows XP
開発環境
Visual Studio2005
※アノトペンの開発環境はC#です!

DSPDソフトウェアをインストール。
bluetoothドライバをインストール。
アノトペンの電源を入れて、
bluetooth設定でデバイスを検出する。
パスキーの入力を求められるので「0000」を入れる。
接続完了。
DSPDソフトのペン一覧で検出されているのを確認する。

ソフトウェア開発はvisual studioにdspdのライブラリを入れて、
開発する。C#なのでC++のプログラムには入らない?
なので別プログラムで走らせて、
今までのプログラムにペンからの値を送信しようかと思う。

2010/02/24

openFrameworksで背景を透過させてキャプチャする方法

openFrameworksで背景を透明化したPNG画像を書き出す方法。
標準のライブラリだけでは上手いこと書き出せなかったので
イメージピクセルにアクセスして、アルファ値を変更して画像保存した。
簡単に書くと
・イメージ宣言の際にOF_IMAGE_COLOR_ALPHAを代入
・pixels宣言でwidth*height*4
・getPixels()
・アルファ値[(widthOfLine * y + x )* 4 + 3]
・setFromPixels → saveImage

ベースとなるサンプルはimageSaverExampleを使うと良い。
void testApp::setup(){

img.allocate(300,300,OF_IMAGE_COLOR_ALPHA);
img2.allocate(300,300,OF_IMAGE_COLOR_ALPHA);

・ キャプチャ用イメージとアルファ変更用イメージのサイズを宣言。
この時OF_IMAGE_COLOR_ALPHAを代入しておく。

void testApp::draw(){
if(bSnapshot2 == false){
    ofSetColor(0xffffff);colorImg.draw(20,20);//元画像
   }
if(bSnapshot2 == true){
    ofEnableAlphaBlending();
    ofSetColor(0xffffff);
    img2.draw(200,200);//アルファ変更画像
    ofDisableAlphaBlending();
}
//保存
if (bSnapshot2 == true){
        char fileName[255];
        sprintf(fileName, "snapshot_%0.3i.png", snapCounter);
        img2.saveImage(fileName);
        sprintf(snapString, "saved %s", fileName);
        bSnapshot2 = false;
}
if (bSnapshot == true){
        img.grabScreen(200,200,300,300);
        unsigned char * pixels;
        unsigned char * pixels2;
        pixels = (unsigned char*)malloc(300*300*4);
        pixels2 = (unsigned char*)malloc(300*300*4);

        pixels =  img.getPixels();
       
        int widthOfLine = 300;  // 画像の幅
        for (int y = 0; y < 300; y++) {
            for (int x = 0; x < 300; x++) {
               
                int red = pixels[(widthOfLine * y + x) * 4];
                int green = pixels[(widthOfLine * y + x )* 4 + 1];
                int blue = pixels[(widthOfLine * y + x )* 4 + 2];
               
                pixels2[(widthOfLine * y + x) * 4]     = blue;
                pixels2[(widthOfLine * y + x) * 4 + 1]     = green;
                pixels2[(widthOfLine * y + x )* 4 + 2]     = red;
                if(red > 150 && green > 150 && blue > 150){
                   pixels2[(widthOfLine * y + x )* 4 + 3]     = 0;//アルファを変更
                }else{  pixels2[(widthOfLine * y + x )* 4 + 3]     = 255;}
               
            }
        }
        img2.setFromPixels(pixels2, 300, 300, OF_IMAGE_COLOR_ALPHA);//アルファ用に格納
               
        snapCounter++;
        bSnapshot = false;
        bSnapshot2 = true;

    }

・これはビデオイメージから白い部分を判別し、透過させ書き出している。
・ピクセルに対しての変更は以下を参考にする。
RGBAがBGRAになっているので格納の際に逆にすると良い。
   pixels[(widthOfLine * y + x) * 4]     = red;
   pixels[(widthOfLine * y + x) * 4 + 1]     = green;
   pixels[(widthOfLine * y + x )* 4 + 2]     = blue;
   pixels[(widthOfLine * y + x )* 4 + 3]     = alpha;
・あとはOF_IMAGE_COLOR_ALPHAをGL_RGBAにしないこと。
・alpha値は0〜255で透明〜不透明になっている。100くらいだと半透明で保存できる。

2009/11/20

openframeworks::UDP

openframeworks v0.06で実装されたUDP Receiverの調子が宜しくない。
頻繁に落ちてしまい、前の状態に復元しコンパイルしてもやはり落ちてしまう。

どうやらmain.cppの前で落ちているのでライブラリ側に問題がありそうである。
やはり実装したばかりなのでバグがあるんだろうか、、
バージョンアップを待つか、通常のUDPソケット通信ライブラリを入れようと思う。

とりあえず展示直前なのでUDPは使わない方向でやり直そうと思う。
openframeworksは簡単に実装出来るが、複雑なことをやろうとした途端に
動かなくなる傾向があるなぁ

追記:
どうやら原因はUDPのそれではなく、resizeが原因みたいだ。
UDP or サーバーからの画像取得 + resize の組み合わせが駄目ぽい。
たぶんサーバー上の画像をロードしてリサイズするとアウトなんかな?
ちょい展示前に試してみよう。

今回は状態を前に戻しても落ちてしまったので焦った。
ただ「画面が出ている」のならmain.cppがはじまってdraw()が走っているのだから、
焦らずその中でデバッグしてみれば良かった。
そうでなく「画面すら出ない」なら他の要因(マシンとかライブラリとか)かもしれない。