パーソナルブログメモリ

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

世界はかなり平坦

2017-03-28 | Processing
高さのデータの抽出方法がわからず、元画像が白の濃淡だけのようだったので、赤の色だけ抽出して濃淡の比率でざっくり算出しています。
動かしてみると世界の形が自分の思っていた世界像と違っていました。
なんとなく日本と同じように山の海の間の平野に人が住んでいるというイメージだったのですが、
アメリカ大陸もアフリカ大陸もオーストラリア大陸も一部を除いてわりと平坦でした。

平坦な所に人が住んでいるとも思っていたのですが、高低差がしっかりある所の平野部に人が住んでいるようです。
山がないと水が蓄えられないからでしょうか?


<開発環境>
OS
ubuntu 16.04

開発ソフト
Processing 3.3

利用ソフト
初期画像 QGIS 2.14.11  
画像抽出 GIMP 2.8    
データ調査 LibreOffice 5 

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

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


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


world2.png



<操作方法>
左スティックで回転と前後移動
右スティックでズームと上下移動


<スナップショット>
北アメリカ大陸


日本から東南アジア


南アフリカ


オーストラリア


<ソースリスト>
world2.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;

int wx=1602;
int wy=781;
int ws=wx*wy;
int eh=60000;

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

int cn;
int[] hland = new int[ws];
int[] cland = new int[ws];

float ty;
float t=0;

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

int sc=1000;

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);
  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)));
      fill(cland[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); 
  
  size(1400, 700);
  img = loadImage("world2.png");
  himg = loadImage("hi.png");
  noStroke();
  
  /*
  int[] acr = new int[256];
  //analyz
  for (int i=0;i<ws-1;i=i+1){
    int c=img.pixels [i];
    int r=(int)red(c);
    acr[r]=acr[r]+1;
  }
  println("--------------");
  for (int j=0;j<255;j=j+1){
    println(acr[j]);
  }
  println("--------------");
  */
  
  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);
    int b=(int)blue(c);
    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;
      cn=cn+1;
    }  
  }
  cn=cn-1;
  
  convertBaseRed[0]=0;
  for (int i=1;i<40;i++){
    convertBaseRed[i]=int(195+1.538*(i-1));
    hi[i]=i*80;  
  }  

  for (int i=0;i<ws-1;i=i+1){
    int c=img.pixels [i];
    int r=(int)red(c);
    int bs=10000;
    int bh=0;
    for (int j=0;j<cn;j=j+1){
      int s=abs(r-convertBaseRed[j]);
      if (s<bs){
        bs=s;
        hland[i]=hi[j]+160;
        cland[i]=cp[j];
      }
    }  
  }
}
 
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;
  eh=int(eh-ry*50);
  sc=int(sc+rx*50);
 
  if (sc<100)sc=100;
  if (eh<200)eh=200;
 
  px=px+dx*ly*sp;
  py=py+dy*ly*sp;
  
  
  theWorld2();
}

最新の画像もっと見る

コメントを投稿

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