2013-09-12 3 views
0

Доброе утро всем.Как установить идентификацию Canvas Path?

Я строй графика для системы предприятия, где я работаю, но я столкнулся с проблемой, когда мне нужно вставить какое-то идентификация, что я могу быть спасен JavaScript ( имени, идентификатор, этикетки , ...).

Кто-нибудь может сказать мне, как я мог бы сделать, чтобы идентифицировать каждый элемент графика отдельно? Если быть более точным, то, что мне интересно, идентифицирует каждый элемент arc.


Если кто-то хотел, чтобы увидеть код, чтобы лучше понять его, я помещу ссылку здесь:
  - JS Bin

ответ

2

Ничего вы рисуете на холсте автоматически запоминается или меченого с идентификатором ,

Все рисунки на холсте становятся забытыми и недоступными. Однако есть способы отслеживать ваши различные рисунки.

Вместо того, чтобы сохранять ваши posX, posY и информацию о цвете в отдельных параллельных массивах, как насчет создания объекта для каждого узла.

Тогда вы могли бы добавить свойство идентификатора для каждого объекта узла:

var nodes=[]; 

nodes.push({id:"sun", x:100, y:100, color:"yellow"}); 
nodes.push({id:"earth", x:50, y:50, color:"blue"}); 
nodes.push({id:"moon", x:50, y:60, color:"gray"}); 

И, конечно, тянуть Graphing информацию от каждого узла ...

Вы можете нарисовать свой график внутри функции и при необходимости применяйте scaleFactor.

function drawGraph(){ 
     context.clearRect(0,0,canvas.width,canvas.height); 
     context.save(); 
     context.scale(scaleFactor,scaleFactor); 
     for(var i=0; i<nodes.length;i++){ 
      var node=nodes[i]; 
      context.beginPath(); 
      context.moveTo(centerCanvasX,centerCanvasY); 
      context.lineTo(node.x,node.y); 
      context.stroke(); 
      context.beginPath(); 
      context.arc(node.x,node.y,node.radius,0,Math.PI*2,false); 
      context.closePath(); 
      context.stroke(); 
      context.fillStyle=node.color; 
      context.fill(); 
     } 
     context.restore(); 
    } 

Для перетаскивания/щелчка/и т. Д. Вы можете ударить каждый элемент массива узлов до тех пор, пока не найдете совпадение.

function hit(x,y){ 
    for(var i=0;i<nodes.length;i++){ 
     var node=nodes[i]; 
     var dx=node.x-x; 
     var dy=node.y-y; 
     var rr=node.radius; 
     if(dx*dx+dy*dy<rr*rr){ 
      return(i); 
     } 
    } 
    return(-1); 
} 

Соответствующий элемент имеет идентификатор, который вам нужен.

Если ваш график масштабируется, и вы используете координаты мыши перетащить, вы должны настроить координаты, что браузер дает вам текущим scaleFactor вашего графика:

mouseX=parseInt(event.clientX-offsetX)/scaleFactor; 
mouseY=parseInt(event.clientY-offsetY)/scaleFactor; 

Вот код и Скрипки : http://jsfiddle.net/m1erickson/c4hsW/

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 

<style> 
    body{ background-color: ivory; padding:20px; } 
    #canvas{border:1px solid red;} 
</style> 

<script> 
$(function(){ 

    var canvas=document.getElementById("canvas"); 
    var context=canvas.getContext("2d"); 
    var canvasOffset=$("#canvas").offset(); 
    var offsetX=canvasOffset.left; 
    var offsetY=canvasOffset.top; 
    var centerCanvasX=canvas.width/2; 
    var centerCanvasY=canvas.height/2; 

    var startX; 
    var startY; 
    var isDown=false; 

    var nodes=[]; 
    var dragNode; 

    var scaleFactor=1.00; 

    nodes.push({id:"sun", x:centerCanvasX, y:centerCanvasY, radius:20, color:"yellow"}); 
    nodes.push({id:"earth", x:50, y:50, radius:5, color:"blue"}); 
    nodes.push({id:"moon", x:50, y:65, radius:3, color:"gray"}); 

    drawGraph(); 

    function drawGraph(){ 
     context.clearRect(0,0,canvas.width,canvas.height); 
     context.save(); 
     context.scale(scaleFactor,scaleFactor); 
     for(var i=0; i<nodes.length;i++){ 
      var node=nodes[i]; 
      context.beginPath(); 
      context.moveTo(centerCanvasX,centerCanvasY); 
      context.lineTo(node.x,node.y); 
      context.stroke(); 
      context.beginPath(); 
      context.arc(node.x,node.y,node.radius,0,Math.PI*2,false); 
      context.closePath(); 
      context.stroke(); 
      context.fillStyle=node.color; 
      context.fill(); 
     } 
     context.restore(); 
    } 

    function hit(x,y){ 
     for(var i=0;i<nodes.length;i++){ 
      var node=nodes[i]; 
      var dx=node.x-x; 
      var dy=node.y-y; 
      var rr=node.radius; 
      if(dx*dx+dy*dy<rr*rr){ 
       return(i); 
      } 
     } 
     return(-1); 
    } 


    function handleMouseDown(e){ 
     mouseX=parseInt(e.clientX-offsetX)/scaleFactor; 
     mouseY=parseInt(e.clientY-offsetY)/scaleFactor; 

     var i=hit(mouseX,mouseY); 
     if(i>=0){ 
      startX=mouseX; 
      startY=mouseY; 
      isDown=true; 
      dragNode=nodes[i]; 
     } 
    } 

    function handleMouseUp(e){ 
     isDown=false; 
    } 

    function handleMouseOut(e){ 
     isDown=false; 
    } 

    function handleMouseMove(e){ 
     if(!isDown){return;} 

     // get the current mouse position 
     mouseX=parseInt(e.clientX-offsetX)/scaleFactor; 
     mouseY=parseInt(e.clientY-offsetY)/scaleFactor; 
     // reposition the dragged node 
     dragNode.x+=(mouseX-startX); 
     dragNode.y+=(mouseY-startY); 
     startX=mouseX; 
     startY=mouseY; 
     // redraw the graph 
     drawGraph(); 
    } 

    $("#canvas").mousedown(function(e){handleMouseDown(e);}); 
    $("#canvas").mousemove(function(e){handleMouseMove(e);}); 
    $("#canvas").mouseup(function(e){handleMouseUp(e);}); 
    $("#canvas").mouseout(function(e){handleMouseOut(e);}); 

    $("#bigger").click(function(){ 
     scaleFactor+=0.20; 
     drawGraph(); 
    }); 

    $("#smaller").click(function(){ 
     scaleFactor-=0.20; 
     drawGraph(); 
    }); 

}); // end $(function(){}); 
</script> 

</head> 

<body> 
    <button id="bigger">Scale Up</button> 
    <button id="smaller">Scale Down</button><br> 
    <canvas id="canvas" width=300 height=300></canvas> 
</body> 
</html> 
+0

Я адаптировал ваш пример для работы в своем коде, но в итоге я создал другую проблему. Мне нужен способ «вызвать» эти узлы внешнего места, без необходимости воссоздать весь граф. –

+0

С удовольствием ... Не могли бы вы объяснить «вызвать эти узлы извне»? – markE

+0

Код, который я представил, представляет собой резюме того, что у меня есть. Есть и другие функции, которых нет, с масштабированием, сопровождающим окно пользователя. Проблема в том, что когда пользователь меняет размер окна, просто создайте еще одну диаграмму выше. И это проблема. Мне нужно отделить «criaGrafico» «events.setStage». Но при этом я теряю анимацию. Поэтому мне нужен идентификатор для каждого узла, так что он может быть вызван из JavaScript без необходимости воссоздавать диаграмму. –