Создание 3D-диаграммы рассеяния в стиле Matplotlib в Vispy

В настоящее время я работаю с воздушными шарами на холсте. Но поскольку баллон с указателем завернут в div, некоторые ссылки под ним больше не будут доступны. В этом случае я не могу использовать extjs. См. базовый пример для моего учебника по речевому шару , который требует HTML5

. Поэтому я решил собрать все координаты ссылок изнутри воздушных шаров в массиве.

var clickarray=[];
function getcoo(thatdiv){
         thatdiv.find(".link").each(function(){
                 var offset=$(this).offset();           
                 clickarray.unshift([(offset.left),
                                     (offset.top),
                                     (offset.left+$(this).width()),
                                     (offset.top+$(this).height()),
                                     ($(this).attr('name')),
                                     1]);
                                     });
         }

Я вызываю эту функцию на каждом (новом) шаре. Он захватывает координаты левого / верхнего и правого / нижних углов link.class - дополнительно атрибут name для того, что делать, если кто-то нажимает на эти координаты, и я любил устанавливать 1, что означает, что он не щелкнул струей , И переместите этот массив на клик. Вы можете использовать push тоже.

Чтобы работать с этим массивом:

$("body").click(function(event){
          event.preventDefault();//if it is a a-tag
          var x=event.pageX;
          var y=event.pageY;
          var job="";
          for(var i in clickarray){
              if(x>=clickarray[i][0] && x<=clickarray[i][2] && y>=clickarray[i][1] && y<=clickarray[i][3] && clickarray[i][5]==1){
                 job=clickarray[i][4];
                 clickarray[i][5]=0;//set to allready clicked
                 break;
                }
             }
          if(job.length>0){   
             // --do some thing with the job --
            }
          });

Эта функция проверяет координаты события щелчка тела или уже была нажата и возвращает атрибут имени , Я думаю, что нет необходимости идти глубже, но вы видите, что это не так сложно. Надеюсь, что это было ...

0
задан jon 17 January 2019 в 16:22
поделиться

1 ответ

Я столкнулся с той же проблемой, занимаясь исследованиями глубины изображения с камеры и радиолокационных данных. Так как vispy поддерживает 2d только для осей, вы можете вращать ось Z после создания. здесь, немного измененная версия вашего кода:

import sys
import numpy as np
from vispy import app, scene
from vispy.util.filter import gaussian_filter

canvas = scene.SceneCanvas(keys='interactive', bgcolor='w')
view = canvas.central_widget.add_view()
view.camera = scene.TurntableCamera(up='z', fov=60)

z = np.random.normal(size=(250, 250), scale=200)
z[100, 100] += 50000
z = gaussian_filter(z, (10, 10))

p1 = scene.visuals.SurfacePlot(z=z, color=(0.3, 0.3, 1, 1))
p1.transform = scene.transforms.MatrixTransform()
p1.transform.scale([1/249., 1/249., 1/249.])
view.add(p1)

xax = scene.Axis(pos=[[0, 0], [1, 0]], tick_direction=(0, -1), axis_color='r', tick_color='r', text_color='r', font_size=16, parent=view.scene)
yax = scene.Axis(pos=[[0, 0], [0, 1]], tick_direction=(-1, 0), axis_color='g', tick_color='g', text_color='g', font_size=16, parent=view.scene)

zax = scene.Axis(pos=[[0, 0], [-1, 0]], tick_direction=(0, -1), axis_color='b', tick_color='b', text_color='b', font_size=16, parent=view.scene)
zax.transform = scene.transforms.MatrixTransform()  # its acutally an inverted xaxis
zax.transform.rotate(90, (0, 1, 0))  # rotate cw around yaxis
zax.transform.rotate(-45, (0, 0, 1))  # tick direction towards (-1,-1)

if __name__ == '__main__':
    canvas.show()
    if sys.flags.interactive == 0:
        app.run()

С уважением

0
ответ дан m6c7l 17 January 2019 в 16:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: