Upgrade to Pro — share decks privately, control downloads, hide ads and more …

地球を作り上げる:世界天気のアニメーション地図(Building Earth: An Animated Map Of Global Weather)

地球を作り上げる:世界天気のアニメーション地図(Building Earth: An Animated Map Of Global Weather)

2017年12月26日にIndeed Tokyo 目黒オフィスで開催されたData Visualization meetup 2017( https://data-visualization-japan.conn... )にて、Cameron Beccario さんのプレゼンテーションです。

Data Visualization Japan

April 18, 2018
Tweet

More Decks by Data Visualization Japan

Other Decks in Research

Transcript

  1. intro Cedar Rapids, Iowa Computer Eng BSc, Iowa State University

    Microsoft, Seattle TradingScreen, Tokyo Indeed, Tokyo
  2. fragment shader “pixel color program” each pixel runs the same

    program written in GLSL: OpenGL Shading Language void main() { // R G B A gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }
  3. uniform float u_R2; // scale R, squared uniform float u_lon0;

    // origin longitude uniform float u_sinlat0; // sin(lat0) uniform float u_Rcoslat0; // R * cos(lat0) uniform float u_coslat0dR; // cos(lat0) / R vec2 invert(in vec2 p) { float d = 1.0 - dot(p, p) / u_R2; float cosc = sqrt(d); float lon = u_lon0 + atan(p.x, cosc * u_Rcoslat0 - p.y * u_sinlat0); float lat = asin(cosc * u_sinlat0 + p.y * u_coslat0dR); return vec2(lon, lat); }
  4. uniform float u_R2; // scale R, squared uniform float u_lon0;

    // origin longitude uniform float u_sinlat0; // sin(lat0) uniform float u_Rcoslat0; // R * cos(lat0) uniform float u_coslat0dR; // cos(lat0) / R vec2 invert(in vec2 p) { float d = 1.0 - dot(p, p) / u_R2; float cosc = sqrt(d); float lon = u_lon0 + atan(p.x, cosc * u_Rcoslat0 - p.y * u_sinlat0); float lat = asin(cosc * u_sinlat0 + p.y * u_coslat0dR); return vec2(lon, lat); }
  5. uniform float u_R2; // scale R, squared uniform float u_lon0;

    // origin longitude uniform float u_sinlat0; // sin(lat0) uniform float u_Rcoslat0; // R * cos(lat0) uniform float u_coslat0dR; // cos(lat0) / R vec2 invert(in vec2 p) { float d = 1.0 - dot(p, p) / u_R2; float cosc = sqrt(d); float lon = u_lon0 + atan(p.x, cosc * u_Rcoslat0 - p.y * u_sinlat0); float lat = asin(cosc * u_sinlat0 + p.y * u_coslat0dR); return vec2(lon, lat); }
  6. uniform float u_R2; // scale R, squared uniform float u_lon0;

    // origin longitude uniform float u_sinlat0; // sin(lat0) uniform float u_Rcoslat0; // R * cos(lat0) uniform float u_coslat0dR; // cos(lat0) / R vec2 invert(in vec2 p) { float d = 1.0 - dot(p, p) / u_R2; float cosc = sqrt(d); float lon = u_lon0 + atan(p.x, cosc * u_Rcoslat0 - p.y * u_sinlat0); float lat = asin(cosc * u_sinlat0 + p.y * u_coslat0dR); return vec2(lon, lat); }
  7. uniform float u_R2; // scale R, squared uniform float u_lon0;

    // origin longitude uniform float u_sinlat0; // sin(lat0) uniform float u_Rcoslat0; // R * cos(lat0) uniform float u_coslat0dR; // cos(lat0) / R vec2 invert(in vec2 p) { float d = 1.0 - dot(p, p) / u_R2; float cosc = sqrt(d); float lon = u_lon0 + atan(p.x, cosc * u_Rcoslat0 - p.y * u_sinlat0); float lat = asin(cosc * u_sinlat0 + p.y * u_coslat0dR); float asin(in float v) { float x = abs(v); float ret = -0.0187293; ret *= x; ret += 0.0742610; ret *= x; ret -= 0.2121144; ret *= x; ret += 1.5707288; ret = PI / 2.0 - sqrt(1.0 - x) * ret; return sign(v) * ret; }
  8. filter 50 54 48 48 50 50 49 50 51

    49 47 52 52 51 53 50
  9. °Lon °Lat filter 47 49 49 50 48 50 50

    52 48 50 51 52 51 54 53 50
  10. °Lon °Lat filter 49 49 50 50 52 52 47

    48 50 48 50 51 51 54 53 50
  11. °Lon °Lat A B C P X Δ = P

    - X P = A + B - C filter
  12. 50 54 48 48 50 50 49 50 51 49

    47 52 52 51 53 50 -1 -1 -1 -0 -0 -0 -0 -0 -2 47 -1 -1 -3 -2 -4 -1 filter