Built with blockbuilder.org
forked from fabid's block: d3 x3dom surface
forked from fabid's block: d3 x3dom surface (no gradient)
Built with blockbuilder.org
forked from fabid's block: d3 x3dom surface
forked from fabid's block: d3 x3dom surface (no gradient)
| !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.d3_x3dom_axis=t.d3_x3dom_axis||{})}(this,function(t){"use strict";function n(t,n,e){function l(a){function l(t){var n;switch(t){case"x":n=[1,0,0];break;case"y":n=[0,1,0];break;case"z":n=[0,0,1]}return n}function d(t){var n;switch(t){case"x":n=[1,1,0,Math.PI];break;case"y":n=[0,0,0,0];break;case"z":n=[0,1,1,Math.PI]}return n}var f,m,h,k,g=null==c?e.ticks?e.ticks.apply(e,o):e.domain():c,y=null==s?e.tickFormat?e.tickFormat.apply(e,o):r:s,x=e.range(),b=x[0],v=x[x.length-1],j=a.selection?a.selection():a;f=l(t),h=l(n),m=d(t),k=d(n);var A=j.selectAll("transform").data([null]),z=j.selectAll(".tick").data(g,e).order(),L=z.exit(),_=z.enter().append("transform").attr("translation",function(t){return f.map(function(n){return e(t)*n}).join(" ")}).attr("class","tick"),D=z.select(".tickLine"),F=z.select("billboard");A=A.merge(A.enter().append("transform").attr("rotation",m.join(" ")).attr("translation",f.map(function(t){return t*(b+v)/2}).join(" ")).append("shape").call(i).attr("class","domain")),z=z.merge(_),D=D.merge(_.append("transform"));var I=_.append("transform");I.attr("translation",h.map(function(t){return-t*p})).append("billboard").attr("axisOfRotation","0 0 0").append("shape").call(i).append("text").attr("string",y).append("fontstyle").attr("size",1).attr("family","SANS").attr("style","BOLD").attr("justify","MIDDLE "),F=F.merge(I),L.remove(),A.append("cylinder").attr("radius",.1).attr("height",v-b),D.attr("translation",h.map(function(t){return t*u/2}).join(" ")).attr("rotation",k.join(" ")).attr("class","tickLine").append("shape").call(i).append("cylinder").attr("radius",.05).attr("height",u)}var o=[],c=null,s=null,u=1,p=1;return l.scale=function(t){return arguments.length?(e=t,l):e},l.ticks=function(){return o=a.call(arguments),l},l.tickArguments=function(t){return arguments.length?(o=null==t?[]:a.call(t),l):o.slice()},l.tickValues=function(t){return arguments.length?(c=null==t?null:a.call(t),l):c&&c.slice()},l.tickFormat=function(t){return arguments.length?(s=t,l):s},l.tickSize=function(t){return arguments.length?(u=+t,l):u},l.tickPadding=function(t){return arguments.length?(p=+t,l):p},l}var e="0.0.1",a=Array.prototype.slice,r=function(t){return t},i=function(t,n){return t.append("appearance").append("material").attr("diffuseColor",n||"black"),t};t.version=e,t.x3domAxis=n}); |
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="http://x3dom.org/download/1.7/x3dom.js"></script> | |
| <script src="//d3js.org/d3.v4.0.0-alpha.50.min.js"></script> | |
| <script src="d3-x3dom-axis.min.js"></script> | |
| <link rel="stylesheet", href="http://x3dom.org/download/1.7/x3dom.css" type="text/css" inline> | |
| <style> | |
| body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; background: #fcfcfc} | |
| canvas {background: white;} | |
| </style> | |
| </head> | |
| <body> | |
| <script> | |
| function makeSolid(selection, color) { | |
| selection.append("appearance").append("material").attr("diffuseColor", color || "black"); | |
| return selection; | |
| } | |
| function drawAxes(scene, x, y, z) { | |
| var xAxis = d3_x3dom_axis.x3domAxis('x', 'y', x).tickSize(z.range()[1] - z.range()[0]).tickPadding(y.range()[0]);; | |
| var yAxis = d3_x3dom_axis.x3domAxis('y', 'x', y).tickSize(z.range()[1] - z.range()[0]); | |
| var zAxis2 = d3_x3dom_axis.x3domAxis('z', 'y', z).tickSize(x.range()[1] - x.range()[0]).tickFormat(function(d){return ''}); | |
| var zAxis = d3_x3dom_axis.x3domAxis('z', 'x', z).tickSize(x.range()[1] - x.range()[0]); | |
| scene.append('group') | |
| .attr('class', 'xAxis') | |
| .call(xAxis) | |
| .select('.domain').call(makeSolid, 'red'); | |
| scene.append('group') | |
| .attr('class', 'yAxis') | |
| .call(yAxis) | |
| .select('.domain').call(makeSolid, 'blue'); | |
| scene.append('group') | |
| .attr('class', 'zAxis') | |
| .call(zAxis) | |
| .select('.domain').call(makeSolid, 'green'); | |
| scene.append('group') | |
| .attr('class', 'zAxis') | |
| .call(zAxis2) | |
| .select('.domain').call(makeSolid, 'green'); | |
| } | |
| function initX3DomScene(selector, width, height) { | |
| var x3d = d3.select("body").append("x3d") | |
| .attr("width", width + 'px') | |
| .attr("height", height +'px' ); | |
| d3.select('.x3dom-canvas') | |
| .attr("width", 2 * width) | |
| .attr("height", 2 * height); | |
| var scene = x3d.append("scene"); | |
| var view_pos = [30, 100, 30]; | |
| var fov = 0.8; | |
| var view_or = [0.02, 1, 1, 2.8]; | |
| scene.append("viewpoint") | |
| .attr("position", view_pos.join(" ")) | |
| .attr("orientation", view_or.join(" ")) | |
| .attr("fieldOfView", fov); | |
| return scene | |
| } | |
| var width = 800, height = 400; | |
| var scene = initX3DomScene('body', width, height); | |
| var x = d3.scaleLinear().range([0, 40]); | |
| var y = d3.scaleLinear().range([0, 40]); | |
| var z = d3.scaleLinear().range([0, 40]); | |
| drawAxes(scene, x, y, z); | |
| var cx = 0.5; | |
| var cy = 0.9; | |
| var f = function(vx, vy) {return (vx - cx)*(vx - cx) + (vy - cy)*(vy - cy);}; | |
| var X = d3.range(0, 1.05, 0.1); | |
| var Y = d3.range(0, 1.05, 0.1); | |
| var nx = X.length, | |
| ny = Y.length; | |
| var data = d3.range(nx).map(function(i) {return d3.range(ny).map( | |
| function(j){ | |
| return [x(X[i]), y(Y[j]), z(f(X[i], Y[j]))]; | |
| });}) | |
| var flattened = d3.merge(data); | |
| var coordinates = d3.merge(flattened).join(' '); | |
| var coordIndex = d3.merge(d3.range(ny - 1).map(function(j) { | |
| return d3.merge(d3.range(nx - 1).map(function(i) { | |
| var start = i + j * nx; | |
| return [start, start + nx, start + nx + 1, start + 1, -1]; | |
| })); | |
| })); | |
| var surfacesData = [{ | |
| points: coordinates, | |
| faces: coordIndex.join(' '), | |
| }] | |
| var surfaces = scene.selectAll('.surface') | |
| .data(surfacesData); | |
| surfaces | |
| .enter() | |
| .append('shape') | |
| .append('indexedfaceset') | |
| .attr('coordIndex', function(d) { return d.faces} ) | |
| .append("coordinate") | |
| .attr('point', function(d){ return d.points;}); | |
| </script> | |
| </body> |