Why restrict yourself to one constellation,
when galaxies await?
With the overwhelming amount of digital information
available to us, most people rely on a search function
to find what they need in large document collections.
But searches only reveal results directly tied to the terms
you’ve entered, missing the surrounding context of
related ideas that deepen your understanding of a topic.
Laniakea maps the entire landscape of a document set
according to its most meaningful content, enabling
users to quickly grasp and navigate thousands — or even
millions — of documents.
Explore the striking landscape of
information in any document set.
Discover new insights through
the symbiosis of machine learning
and expert information design.
To use Laniakea, visit this site in a
larger window or rotate your tablet.
#ifdef GL_ES
precision mediump float;
#endif
attribute vec2 a_oldPosition;
attribute float a_oldSize;
attribute float a_oldTopic;
attribute float a_newTopic;
attribute float a_oldAlpha;
attribute float a_delay;
uniform float u_step;
uniform float u_steps;
uniform float u_factor;
uniform float u_palette_1;
uniform float u_palette_2;
varying vec4 v_color_1;
varying vec4 v_color_2;
varying float v_progress;
uniform sampler2D u_src_colors;
void main() {
v_progress = clamp((u_step / u_steps) * 2.0 - 0.5 + a_delay, 0.0, 1.0);
v_color_1 = texture2D(u_src_colors, vec2(1.5, a_oldTopic + u_palette_1 + 0.5) / 32.0);
v_color_2 = texture2D(u_src_colors, vec2(1.5, a_newTopic + u_palette_2 + 0.5) / 32.0);
v_color_1.w = a_oldAlpha;
v_color_2.w = a_oldAlpha;
float x = a_oldPosition.x;
float y = a_oldPosition.y;
float s = a_oldSize * u_factor;
if (s <= 0.0) {
gl_Position = vec4(10.0, 10.0, 0.0, 1.0);
} else {
gl_Position = vec4(x, y, 0.0, 1.0);
}
gl_PointSize = s;
}
#ifdef GL_ES
precision mediump float;
#endif
#ifdef GL_OES_standard_derivatives
#extension GL_OES_standard_derivatives : enable
#endif
varying vec4 v_color_1;
varying vec4 v_color_2;
varying float v_progress;
uniform sampler2D u_image;
mediump float side = 0.002;
vec4 rgb2hsv(vec4 c);
vec4 hsv2rgb(vec4 c);
void main(){
vec4 imageColor = texture2D(u_image, gl_PointCoord.st);
vec4 rgba = (1.0 - v_progress) * v_color_1 + v_progress * v_color_2;
gl_FragColor = vec4(rgba.rgb, rgba.a * imageColor.a);
}
// http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl
vec4 rgb2hsv(vec4 c) {
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
vec4 p = c.g < c.b ? vec4(c.bg, K.wz) : vec4(c.gb, K.xy);
vec4 q = c.r < p.x ? vec4(p.xyw, c.r) : vec4(c.r, p.yzx);
float d = q.x - min(q.w, q.y);
float e = 1.0e-10;
return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x, c.a);
}
vec4 hsv2rgb(vec4 c) {
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
vec3 rgb = c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
return vec4(rgb, c.a);
}