パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

沖縄

2017-03-29 | Processing
先ほど投稿した日本に沖縄県が入っていなかったので追加で作成。
レイヤに土地被覆の情報を追加してセレクトボタンを押している時に表示させてみました。
画像にほんの少しのズレがあります。

<開発環境>
OS
ubuntu 16.04

開発ソフト
Processing 3.3

利用ソフト
初期画像 QGIS 2.14.11  
画像抽出 GIMP 2.8    

インターフェイス
PS3のコントローラーUSB接続

<参考サイト>
さわってみようQGIS (QGIS初級中級編 for ver.2.14 at FOSS4G 2016 Hokkaido)
地球地図日本
画像ファイルに関しての著作権 Copyright. Geospatial Information Authority of Japan. ALL RIGHTS RESERVED.


ソースリストと同じフォルダに必要な画像ファイル
hi.png


okinawa.png


okinawacover.png


<操作方法>
左スティックで回転と前後移動
右スティックでズームと上下移動
selectボタンでスキン変更


<スナップショット>


googlemapで確認

やっぱりgoogle最強だな。


ソースリスト
okinawa.pde
import org.gamecontrolplus.*;
import java.util.List;

ControlIO control;
ControlDevice device;
List<ControlDevice> list;


ControlButton button;
ControlSlider[] sliders = new ControlSlider[4];

PImage img;
PImage himg;
PImage coverimg;

int wx=1680;
int wy=934;
int ws=wx*wy;

int[] cp = new int[40];
int[] cr = new int[40];
int[] cg = new int[40];
int[] cb = new int[40];

int cn;
//int hi[] = {-1500,-1000,-500,-300,-100,-80,-60,-40,-20,-10,0,20,40,60,80,100,125,150,175,200,225,250,275,300,350,400,450,500,600,700,800,900,1000,1500,2000,3000,4000,5000,6000,7000};
int hi[] = {-20,-20,-20,-20,-20,-20,-20,-20,-20,-10,0,20,40,60,80,100,125,150,175,200,225,250,275,300,350,400,450,500,600,700,800,900,1000,1500,2000,3000,4000,5000,6000,7000};
int[] hland = new int[ws];

float ty;
float t=0;

float px=180;
float py=150;
int pt;//muki
int ph=2000;//height

int sc=1000;
int eh=60000;

void theWorld2(){
  int tm=millis();
  int el=1400;
  float ez;
  float ex;
  int ep;
  int hwix=700;
  int hwiy=200;
  int mx;
  int my;
  float cot=cos(t);
  float sit=sin(t);
  boolean b=button.pressed();//select button
  for (int y=3;y<500;y=y+1){
    ez=el*eh/y;
    for (int x=0;x<1400;x=x+1){
      ex=(x-hwix)*ez/el;
      float tx=(ex*cot-ez*sit)/sc;
      float ty=(ex*sit+ez*cot)/sc;
      mx=(int)(px+tx);
      if (mx<0 || mx>wx) continue;
      my=(int)(py-ty);
      ep=mx+my*wx;
      if (ep<0 || ep>=ws) continue;
      int h=(int)(hland[ep]*6/(sqrt(tx*tx+ty*ty)));
      if (b){
        fill(coverimg.pixels[ep]);
      }else{
        fill(img.pixels[ep]);
      }  
      rect(x,y+hwiy-h,1,h);
    }
  }
  text(millis()-tm,10,10);
}

void setup() {
  control = ControlIO.getInstance(this);
  list = control.getDevices();
  device = list.get(0);
  device.open();

  button = device.getButton(0);
  sliders[0] = device.getSlider(0);
  sliders[1] = device.getSlider(1);
  sliders[2] = device.getSlider(2);
  sliders[3] = device.getSlider(3);
  
  button = device.getButton(0);

  size(1400, 700);
  img = loadImage("okinawa.png");
  himg = loadImage("hi.png");
  coverimg = loadImage("okinawacover.png");
  noStroke();
  cn=0;
  
  for (int i=20;i<420;i=i+10){
    int c=himg.pixels [i+40*421];
    int r=(int)red(c); 
    int g=(int)green(c);//& 0xf0;
    int b=(int)blue(c);// & 0xf0;
    c=color(r,g,b);
    int sw=0;
    for (int j=0;j<cn;j=j+1){
      if (c==cp[j]){
        sw=1;
        break;
      }  
    }  
    if (sw==0){
      cp[cn]=c;
      cr[cn]=r;
      cg[cn]=g;
      cb[cn]=b;
      println(c);
      cn=cn+1;
    }  
  }
  cn=cn-1;

  for (int i=0;i<ws-1;i=i+1){
    int c=img.pixels [i];
    int r=(int)red(c);
    int g=(int)green(c);
    int b=(int)blue(c);
    int bs=10000;
    int bh=0;
    for (int j=0;j<cn;j=j+1){
      int s=abs(r-cr[j])+abs(g-cg[j])+abs(b-cb[j]);
      if (s<bs){
        bs=s;
        hland[i]=hi[j]+160;
      }
    }  
  }
}
 
void draw() {
  background(0);
  
  float lx=sliders[0].getValue();
  float ly=sliders[1].getValue();
  float rx=sliders[2].getValue();
  float ry=sliders[3].getValue();
  if (abs(lx)<0.1)lx=0;
  if (abs(ly)<0.1)ly=0;
  if (abs(rx)<0.1)rx=0;
  if (abs(ry)<0.1)ry=0;

  t=t-lx/3;
  float dx=cos(t-1.57);
  float dy=-sin(t-1.57);
  
  float sp=20;
 
  px=px+dx*ly*sp;
  py=py+dy*ly*sp;
  
  eh=int(eh-ry*50);
  sc=int(sc+rx*50);
 
  if (sc<100)sc=100;
  if (eh<200)eh=200;
  
  theWorld2();
}

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。