0
自作クラスとArrayListについて。
私はJava—というかProcessingを使ってプログラミングをしているかなたんといいます。
ProcessingがJavaと似ていることもあり、ここで質問させてもらうことにしました。
手の座標を用いたペイントソフトなんかを作りたいと思っています。
座標はPVector型で取得することができて、その取得した座標をArrayListへ追加し、その動きを線でつなごうと思っています。
複数人でもできるようにしたいと思っているので、手の数がいくつになるのかわかりません。
でも、複数の手それぞれに線の色を決めたり手の座標を記録していきたいと思っています。
そこで、線の色や手の座標などを管理したり、その座標を用いて線を描くためのクラスを作成することにしました。
class User_Paint{
color paint_color; //線の色を記憶
ArrayList<PVector> paint_pos=new ArrayList<PVector>(); //手の座標を記憶
User_Paint(){
paint_color=color(random(0,255),random(0,255),random(0,255)); //線の色をランダムに決定
paint_pos.clear(); //ArrayListの中身を念のため空にしておく
}
void point_add(PVector hand_pos){
paint_pos.add(hand_pos); //取得した手の座標を追加
}
void draw_paint(){
stroke(paint_color); //線の色を決定した色にする
strokeWeight(3); //線の太さを3にする
for(int n=1;n<paint_pos.size();n++){ //リストの1番目から終わりまで繰り返す
line(paint_pos.get(n-1).x,paint_pos.get(n-1).y,paint_pos.get(n-1).z,paint_pos.get(n).x,paint_pos.get(n).y,paint_pos.get(n).z); //ひとつ前の点から今の点まで線を引く
}
}
}
そして、それを手の数だけ実体化させようと、ArrayListを用いて‭人を検出したらインスタンスを追加するようにしています。
//グローバル変数
ArrayList[] paint={new ArrayList<User_Paint>(),new ArrayList<User_Paint>()}; //左手と右手用にArrayListの配列にする
//人を検出したら
paint[0].add(new User_Paint()); //左手のインスタンス追加
paint[1].add(new User_Paint()); //右手のインスタンス追加
手の座標はdraw関数内で取得し、その取得した座標を先ほど作ったUser_Paintクラスのpoint_add関数を用いてクラス変数であるArrayListのpaint_posに追加して、その軌跡を描画させています。
//draw内で
context.getJointPositionSkeleton(userList[i],SimpleOpenNI.SKEL_LEFT_HAND,hand_pos[0]); //i番目の人の左手の座標取得
context.getJointPositionSkeleton(userList[i],SimpleOpenNI.SKEL_RIGHT_HAND,hand_pos[1]); //i番目の人の右手の座標取得
User_Paint[] painting={(User_Paint)paint[0].get(i),(User_Paint)paint[1].get(i)}; //i番目の人のインスタンスを取得
painting[0].point_add(hand_pos[0]); //左手の座標追加
painting[0].draw_paint(); //左手の軌跡描画
painting[1].point_add(hand_pos[1]); //右手の座標追加
painting[1].draw_paint(); //右手の軌跡描画
実行して手を動かしてみても、線が描画されません。
実行画面を見てみると、線でなく点になってしまっています。
そこで、追加した座標や描画している座標を出力させてみたのですが、なんと追加したらその前の座標がみんな最後に追加した座標になってしまっています。
座標追加:[ 408.17795, 504.1026, 1185.2173 ]
[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],きちんとなってる?
painting
-5745259
[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],描画終了
座標追加:[ -251.10933, -11.485046, 1247.2742 ]
[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],きちんとなってる?
painting
-12211937
[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],描画終了
座標追加:[ 394.7011, 511.8561, 1187.2467 ]
[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],きちんとなってる?
painting
-5745259
[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],描画終了
クラスやArrayListの使い方を間違えたでしょうか・・・?