メモっていると便利

日々学んだことを綴っていきます。

Rをはじめる

Rをはじめようと思います。
Rというのは、

R is ‘GNU S’, a freely available language and environment for statistical computing and graphics which provides a wide variety of statistical and graphical techniques: linear and nonlinear modelling, statistical tests, time series analysis, classification, clustering, etc

だそうです。

以下のページからダウンロード。
http://cran.md.tsukuba.ac.jp/bin/windows/base/

そして以下のリンクをクリックするとダウンロードが始まります。
Download R 3.0.2 for Windows (52 megabytes, 32/64 bit)

ダウンロードしたものをクリック。

f:id:yusuke1235:20140113232952p:plain

なにかサンプル的なものを実行しようとしたのですが、自前で読み込むファイルを用意した方がよいようなので次回はそれから行います。関数もたくさんあったり、事前にライブラリの取得、インストールがあったり、敷居が高そう。
なお、途中で接続するサーバーを決める必要がありますが、Tokyoを選ぶとうまくいかない。Tsukubaにするとうまくいきました。

f:id:yusuke1235:20140113232957p:plain

processing ブロック崩しゲームの作り始め

processingにてブロック崩しゲームを作ろうと思います。
今回はまるとしかくを表示。そして動くまるとキー入力にて動くしかくの作成。
そして、しかくにあたるとまるが反射する処理を付け加えます。
なお、その反射の処理がうまくいかず。これは後日の課題とします。

f:id:yusuke1235:20140112224245p:plain


//しかく
float x = 200.0;
float speed = 3.0;

//まる
float mx = 25;
float my = 150;
float mvx = 2.0;
float mvy = 1.5;
float space = 0;

int c_type = 0;

void setup() {
  size(400, 400);

//これは何か
  noStroke();
  smooth();
}

void keyPressed() {
  if (key == CODED) {      // コード化されているキーが押された
    if (keyCode == RIGHT) {    // キーコードを判定
          x += speed;
          
          if(x > 270){  //右の限界 四角の幅が120、枠の幅が400のため。
            x = 270;  
          }
          
    } else if (keyCode == LEFT) {
           x -= speed;
           
           if(x < 10){  //左の限界
             x = 10;
           }
    }
  }
}

void draw() {
    background(204);
    //background(0);
    
    fill(255);
    //colorSet1();
    rect(x, 360, 120, 30);
    
    mx = mx + mvx;
    my = my + mvy;
    
    
    if(mx <= 25 || mx >= width - 25){
      mvx = - mvx;
      colorChange();
    }
    if(my <= 25 || my >= height - 25){
      mvy = - mvy;
      colorChange();
    }else{
      colorSet1();
    }

   ellipse(mx,my,50,50);
   
   Conflict(); 
}

void colorChange(){
  c_type = c_type%7;
  
  switch(c_type) {
    case 0:
        //red
        fill(255,0,0);
        break;
    case 1:
        //yellow
        fill(255,255,0);
        break;
    case 2:
        //green
        fill(0,255,0);
        break;
    case 3:
        //lightblue
        fill(0,0,255);
        break;
    case 4:
        //blue
        fill(255,0,255);
        break;
    case 5:
        //purple
        fill(255,0,255);
        break;
    case 6:
        //whihe
        fill(255,255,255);
        break;
    default:
      println("None");    // どのcaseにも該当しなかったとき
      break;
  }
    c_type = c_type + 1;
}

void colorSet1(){
    switch(c_type) {
    case 0:
        //red
        fill(255,0,0);
        break;
    case 1:
        //yellow
        fill(255,255,0);
        break;
    case 2:
        //green
        fill(0,255,0);
        break;
    case 3:
        //lightblue
        fill(0,0,255);
        break;
    case 4:
        //blue
        fill(255,0,255);
        break;
    case 5:
        //purple
        fill(255,0,255);
        break;
    case 6:
        //whihe
        fill(255,255,255);
        break;
    default:
    // どのcaseにも該当しなかったとき
      break;
  }
}

void Conflict(){

  space = (x-mx)*(x-mx) + (360-my)*(360-my);
  
//  if(space < 50*50){
    if(my + 25 > 360){
      if((x <= mx) && (x+120 >= mx) ){
         mvx = - mvx;
         mvy = - mvy;
      }
    }
//  }
}

processing 、しかくの可動域

昨日の続き。
表示したしかくの可動域を指定します。
これはしかくが枠の外に行かないようにするため。
左の可動域は、x >= 10。
右の可動域は、X <= 270。
とする。
これは、しかくの横幅が、120、枠の幅が400であるため。
270 + 120 = 390。つまり枠から10左まで。
(しかくの左が270となる。)

float x = 200.0;
float speed = 3.0;

void setup() {
  size(400, 400);
}

void keyPressed() {
  if (key == CODED) {      // コード化されているキーが押された
    if (keyCode == RIGHT) {    // キーコードを判定
          x += speed;
          
          if(x > 270){  //右の限界 四角の幅が120、枠の幅が400のため。
            x = 270;  
          }
          
    } else if (keyCode == LEFT) {
           x -= speed;
           
           if(x < 10){  //左の限界
             x = 10;
           }
    }
  }
}

void draw() {
  background(204);
 rect(x, height*0.9, 120, 30);
}

processing キー入力で左右にしかくを動かす。

processingにて四角を表示、そしてキー入力によって左右に動かす。

右矢印キーでしかくを右、左矢印キーでしかくを左に動かす。

キーをタイプすることで、keyPressed()が呼び出される。その中でキーの中身を判別。

float x = 200.0;
float speed = 3.0;

void setup() {
  size(400, 400);
}

void keyPressed() {
  if (key == CODED) {      // コード化されているキーが押された
    if (keyCode == RIGHT) {    // キーコードを判定
          x += speed;
    } else if (keyCode == LEFT) {
           x -= speed;
    }
  }
}

void draw() {
  background(204);
 rect(x, height*0.9, 120, 30);
}

f:id:yusuke1235:20140109224847p:plain

衝突について

2つのまるの衝突処理について考える。
あまりにまるが速いとうまくいかない。

一ターンで動くまるの距離、つまり速度はまるの直径が限度だと思う。
そうでないとまるが通りぬけてしまい、衝突の処理がなされない。

//no1
float x1 = 50;
float y1 = 150;
float vx1 = 2;
float vy1 = 2;

//no2
float x2 = 150;
float y2 = 50;
float vx2 = 2;
float vy2 = 2;


int c_type1 = 0;
int c_type2 = 0;

float space = 0;

void setup(){
    size(600,300);
    background(0);
    noStroke();
    fill(255);
    smooth();
}

void draw(){
    background(0);
    
    x1 = x1 + vx1;
    y1 = y1 + vy1;
    
    x2 = x2 + vx2;
    y2 = y2 + vy2;
  
    if(x1 <= 25 || x1 >= width - 25){
      vx1 = - vx1;
      colorChange1();
      c_type1 = c_type1 + 1;
    }
    if(y1 <= 25 || y1 >= height - 25){
      vy1 = - vy1;
      colorChange1();
      c_type1 = c_type1 + 1;
    }
    
    //no1の描画
    colorSet1();
    ellipse(x1,y1,50,50);
    
    if(x2 <= 25 || x2 >= width - 25){
      vx2 = - vx2;
      colorChange2();
      c_type2 = c_type2 + 1;
    }
    if(y2 <= 25 || y2 >= height - 25){
      vy2 = - vy2;
      colorChange2();
      c_type2 = c_type2 + 1;
    }
    
    //no2の描画
    colorSet2();
    ellipse(x2,y2,50,50);
    
    Conflict();
}

void Conflict(){

  space = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
  
  if(space < 50*50){
    vx1 = - vx1;
    vx2 = - vx2;
    vy1 = - vy1;
    vy2 = - vy2;
  }
}

void colorChange1(){
    c_type1 = c_type1%7;
}

void colorSet1(){
    switch(c_type1) {
    case 0:
        //red
        fill(255,0,0);
        break;
    case 1:
        //yellow
        fill(255,255,0);
        break;
    case 2:
        //green
        fill(0,255,0);
        break;
    case 3:
        //lightblue
        fill(0,0,255);
        break;
    case 4:
        //blue
        fill(255,0,255);
        break;
    case 5:
        //purple
        fill(255,0,255);
        break;
    case 6:
        //whihe
        fill(255,255,255);
        break;
    default:
      println("None");    // どのcaseにも該当しなかったとき
      break;
  }
}

void colorChange2(){
    c_type2 = c_type2%7;
}

void colorSet2(){
    switch(c_type2) {
    case 0:
        //red
        fill(255,0,0);
        break;
    case 1:
        //yellow
        fill(255,255,0);
        break;
    case 2:
        //green
        fill(0,255,0);
        break;
    case 3:
        //lightblue
        fill(0,0,255);
        break;
    case 4:
        //blue
        fill(255,0,255);
        break;
    case 5:
        //purple
        fill(255,0,255);
        break;
    case 6:
        //whihe
        fill(255,255,255);
        break;
    default:
      println("None");    // どのcaseにも該当しなかったとき
      break;
  }
}

話の聞き方

日経SYSTEMSの2013年6月号に、「悪い聞き方、よい聞き方」という特集が載っていたのでそれについて。

大切なのは以下の3点。

  • 傾聴 -- 相手の心の内も理解しようとする。
  • アイスブレイク -- 事前に相手と親しくする。趣味など聞いておく。
  • ページング -- 相手の話すスピード、感情に合わせる。

また、話を聞くときに便利な言葉として、「他には?」、「具体的には?」、「なぜか?」が紹介されていた。
個人的にはそれに、「それから?」、「そのあとは?」を付け加えたい。
他にもあるだろう。みつけたらまとめておきたい。

processingでまるを2つ

processingでまるを2つ表示し、なおかつ衝突時の処理を加えます。
メソッドの補足。

fillメソッドは色の指定のみ。
実際の描画はellipseメソッドで行う。直近のfillメソッドで指定した色で描画を行う。
衝突の処理が未完成なので後日修正する。

f:id:yusuke1235:20140104235921p:plain

//no1
float x1 = 25;
float y1 = 150;
float vx1 = 2.0;
float vy1 = 1.0;

//no2
float x2 = 35;
float y2 = 170;
float vx2 = 30.0;
float vy2 = 30.0;


int c_type1 = 0;
int c_type2 = 0;

float space = 0;

void setup(){
    size(600,300);
    background(0);
    noStroke();
    fill(255);
    smooth();
}

void draw(){
    background(0);
    
    x1 = x1 + vx1;
    y1 = y1 + vy1;
    
    x2 = x2 + vx2;
    y2 = y2 + vy2;
  
    if(x1 <= 25 || x1 >= width - 25){
      vx1 = - vx1;
      colorChange1();
      c_type1 = c_type1 + 1;
    }
    if(y1 <= 25 || y1 >= height - 25){
      vy1 = - vy1;
      colorChange1();
      c_type1 = c_type1 + 1;
    }
    
    //no1の描画
    colorSet1();
    ellipse(x1,y1,50,50);
    
    if(x2 <= 25 || x2 >= width - 25){
      vx2 = - vx2;
      colorChange2();
      c_type2 = c_type2 + 1;
    }
    if(y2 <= 25 || y2 >= height - 25){
      vy2 = - vy2;
      colorChange2();
      c_type2 = c_type2 + 1;
    }
    
    //no2の描画
    colorSet2();
    ellipse(x2,y2,50,50);
    
    Conflict();
}

void Conflict(){

  space = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1);
  
  if(space < 40*40){
    vx1 = - vx1;
    vx2 = - vx2;
    vy1 = - vy1;
    vy2 = - vy2;
  }
}

void colorChange1(){
    c_type1 = c_type1%7;
}

void colorSet1(){
    switch(c_type1) {
    case 0:
        //red
        fill(255,0,0);
        break;
    case 1:
        //yellow
        fill(255,255,0);
        break;
    case 2:
        //green
        fill(0,255,0);
        break;
    case 3:
        //lightblue
        fill(0,0,255);
        break;
    case 4:
        //blue
        fill(255,0,255);
        break;
    case 5:
        //purple
        fill(255,0,255);
        break;
    case 6:
        //whihe
        fill(255,255,255);
        break;
    default:
      println("None");    // どのcaseにも該当しなかったとき
      break;
  }
}

void colorChange2(){
    c_type2 = c_type2%7;
}

void colorSet2(){
    switch(c_type2) {
    case 0:
        //red
        fill(255,0,0);
        break;
    case 1:
        //yellow
        fill(255,255,0);
        break;
    case 2:
        //green
        fill(0,255,0);
        break;
    case 3:
        //lightblue
        fill(0,0,255);
        break;
    case 4:
        //blue
        fill(255,0,255);
        break;
    case 5:
        //purple
        fill(255,0,255);
        break;
    case 6:
        //whihe
        fill(255,255,255);
        break;
    default:
      println("None");    // どのcaseにも該当しなかったとき
      break;
  }
}