2016-07-27 33 views
1

我工作的一个修改vis.js的Graph3d做填充的线路图,就像这样:查找“视图”坐标在vis.js

filled line graph

困难的部分 - 意料之中 - 正在制定多边形的渲染顺序。我想我可以通过检查从观众到给定线B光线是否越过A线做到这一点:

enter image description here

在本例中,A线是“在路上” B线,我们应先画线A.我将使用How do you detect where two line segments intersect?中的一段代码来检查这些行是否交叉。

但是,我还没有想到如何找到用户视图的位置。我有种以为这将是相机对象,所以写的调试代码一点点绘制在相机上图:

var camera = this._convert3Dto2D(this.camera.getCameraLocation()); 
ctx.strokeStyle = Math.random()>0.5 ? 'ff0000' : '00ff00'; 
ctx.beginPath(); 
ctx.moveTo(camera.x, camera.y); 
ctx.lineTo(camera.x, camera.y+5); 
ctx.stroke(); 

事实上,通过这种测定照相机坐标始终为0 ,图上的0,0(这将在上面的屏幕抓图的最右上角)。我认为,我需要的是屏幕的底部。

我该如何找到它?还是有更好的方法来实现我想要做的事情?

回答

1

我不知道这是否仍然是一个活跃的问题,但FWIW,Graph3D有排序顺序的内部处理。

所有图形点均使用名为point.bottom的代表坐标相对于视点进行排序。然后使用这个顺序完成渲染,最先画出最远的元素。只要没有任何元素相交,这可以正常工作;在这种情况下,你可以期待文物。

基本上,所有你需要做的,就是定义point.bottom每个图形多边形,然后Graph3D将从那里捡起它。

如果你仍然有兴趣在这方面的工作:

这发生在Graph3d.js,方法Graph3d.prototype._calcTranslations()。例如,查看Graph3d.prototype._getDataPoints()中图表元素GridSurface的初始化过程。相关的代码是:

obj = {}; 
obj.point = point3d; 
obj.trans = undefined; 
obj.screen = undefined; 
obj.bottom = new Point3d(x, y, this.zRange.min); 
+0

谢谢!由于这个问题,我最终使用了three.js作为图表而不是vis.js,但希望对别人有用。 (如果您有兴趣,可以在http://cycle.travel/map上看到完成的图形;规划路线,单击高程图标,然后单击“3D”。) –

+0

不是问题!我很高兴你找到了适合你的东西。 我认为这种图类型是一个很酷的想法;它现在在我的TODO上。 –