Guest User

Untitled

a guest
Jul 8th, 2014
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var Renderer = function(canvas)
  2. {
  3.     var canvas = $(canvas).get(0);
  4.     var ctx = canvas.getContext("2d");
  5.     var particleSystem;
  6.  
  7.     function draw_line(a, b, color, width){
  8.  
  9.         color = color || "rgba(0,0,0, .555)";
  10.         width = width || 1;
  11.  
  12.         if(width > 1 ){width = Math.floor(Math.log(width) * 1.5)};
  13.         ctx.beginPath();
  14.         ctx.strokeStyle = color;
  15.         ctx.lineWidth =  width;
  16.         ctx.moveTo(a.x, a.y);
  17.         ctx.lineTo(b.x, b.y);
  18.         ctx.stroke();
  19.     }
  20.  
  21. //    var selected_items = [{src: 'v1', dst: 'v2'}, {src: 'v2', dst: 'v3'}, {src: 'v3', dst: 'v4'}];
  22.     var selected_items = [];
  23.     var selected_change = true;
  24.  
  25.     var that = {
  26.  
  27.             init:function(system){
  28.             //начальная инициализация
  29.             particleSystem = system;
  30.             particleSystem.screenSize(canvas.width, canvas.height);
  31.             particleSystem.screenPadding(80);
  32.             that.initMouseHandling();
  33.         },
  34.  
  35.         selector: function(){
  36.  
  37.             if(selected_change){
  38.                selected_items.forEach(
  39.                   function(item){
  40.                         var edge = particleSystem.getEdges( item.src, item.dst )[0] || particleSystem.getEdges( item.dst, item.src )[0]  ;
  41.                         edge.data.selected = true;
  42.             });
  43.  
  44.             selected_change = false;
  45.           }
  46.  
  47.         },
  48.  
  49.  
  50.         add_selected_edge: function(pt1, pt2){
  51.  
  52.             selected_change = true;
  53.             selected_items.push({src: pt1, dst: pt2});
  54.         },
  55.  
  56.         remove_selected_edge: function(pt1, pt2){
  57.  
  58.             selected_items.splice(selected_items.indexOf({ src: pt1, dst: pt2 }));
  59.             selected_change = true;
  60.         },
  61.  
  62.         redraw:function(){
  63.             //действия при перересовке
  64.             ctx.fillStyle = "white";
  65.             ctx.fillRect(0,0, canvas.width, canvas.height);
  66.  
  67.             that.selector();
  68.  
  69.             particleSystem.eachEdge( //отрисуем каждую грань
  70.  
  71.                 function(edge, pt1, pt2){ //будем работать с гранями и точками её начала и конца
  72.  
  73.                     if(edge.data.selected){
  74.                         draw_line(pt1, pt2, "red", 10);
  75.                     }
  76.                     else{
  77.                         draw_line(pt1, pt2, "rgba(0,0,0, .444)", edge.data.weigh);
  78.                     }
  79.  
  80.         // подписываем грани
  81.                     ctx.fillStyle = "blue";
  82.                     ctx.font = 'italic 13px Helvetica';
  83.                     ctx.fillText (edge.data.weigh, (pt1.x + pt2.x) / 2 + 15, (pt1.y + pt2.y) / 2 + 15);
  84.                 });
  85.  
  86.             particleSystem.eachNode( //теперь каждую вершину
  87.                 function(node, pt){  //получаем вершину и точку где она
  88.                     var w = 15;   //ширина квадрата
  89.                     ctx.fillStyle = "orange";
  90.                     ctx.fillRect(pt.x-w/2, pt.y-w/2, w,w);
  91.                     ctx.fillStyle = "black";
  92.                     ctx.font = 'bold 14px Helvetica';
  93.                     ctx.fillText (node.name, pt.x+15, pt.y+15); //пишем имя у каждой точки
  94.                 });
  95.         },
  96.  
  97.         initMouseHandling:function(){ //события с мышью
  98.             var dragged = null;   //вершина которую перемещают
  99.             var handler = {
  100.                 clicked:function(e){ //нажали
  101.                     var pos = $(canvas).offset(); //получаем позицию canvas
  102.                     _mouseP = arbor.Point(e.pageX-pos.left, e.pageY-pos.top); //и позицию нажатия кнопки относительно canvas
  103.                     dragged = particleSystem.nearest(_mouseP); //определяем ближайшую вершину к нажатию
  104.                     if (dragged && dragged.node !== null){
  105.                         dragged.node.fixed = true; //фиксируем её
  106.                     }
  107.                     $(canvas).bind('mousemove', handler.dragged); //слушаем события перемещения мыши
  108.                     $(window).bind('mouseup', handler.dropped);  //и отпускания кнопки
  109.                     return false;
  110.                 },
  111.                 dragged:function(e){ //перетаскиваем вершину
  112.                     var pos = $(canvas).offset();
  113.                     var s = arbor.Point(e.pageX-pos.left, e.pageY-pos.top);
  114.  
  115.                     if (dragged && dragged.node !== null){
  116.                         var p = particleSystem.fromScreen(s);
  117.                         dragged.node.p = p; //тянем вершину за нажатой мышью
  118.                     }
  119.  
  120.                     return false;
  121.                 },
  122.                 dropped:function(e){ //отпустили
  123.                     if (dragged===null || dragged.node===undefined) return; //если не перемещали, то уходим
  124.                     if (dragged.node !== null) dragged.node.fixed = false; //если перемещали - отпускаем
  125.                     dragged = null; //очищаем
  126.                     $(canvas).unbind('mousemove', handler.dragged); //перестаём слушать события
  127.                     $(window).unbind('mouseup', handler.dropped);
  128.                     mouseP = null;
  129.                     return false;
  130.                 }
  131.             }
  132.             // слушаем события нажатия мыши
  133.             $(canvas).mousedown(handler.clicked);
  134.         }
  135.     }
  136.     return that;
  137.  
  138.  
  139. }
Advertisement
Add Comment
Please, Sign In to add comment