2013-09-24 36 views
5

Kullanıcıların birden çok svg öğesi oluşturabileceği web tabanlı bir uygulama üzerinde çalışıyorum. tüm öğeler 'yol' (kapalı yol kare veya dikdörtgen). Kullanıcı herhangi bir elemanı taşıyabilir ve döndürebilir.Svg öğelerinin kesişimini denetleme

Şimdi, bir eleman başka bir elemana dokunduğunda veya kesiştiğinde kullanıcıyı uyarmak istiyorum. Herhangi bir yardım için teşekkür ederiz.

Teşekkürler. Burada

http://jsfiddle.net/nnYSp/

Kod olan jsfiddle linke geçerli: - yollarınız kareler veya dikdörtgenler kapalı olup olmadığını

<body> 
     <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="600" height="500"> 
       <path id="obj1" d="M 100 50 L 150 50 150 120 100 120 z" stroke="black" stroke-width="2" fill="yellow" move transform="translate(10,0) rotate(45,125,85)"/> 

     <path id="obj2" d="M 150 150 L 200 150 200 200 150 200 z" stroke="red" stroke-width="2" fill="black" move transform="translate(10,0)"/> 

     </svg> 

     <script type="text/javascript"> 
      document.addEventListener('mousedown', mousedown, false); 
      document.addEventListener('mousemove', mousemove, false); 
      document.addEventListener('mouseup', mouseup, false); 

      var obj1_rotate_string="rotate(45,125,85)"; 
      var obj1_translate_values={ 
       x:10, 
       y:0 
      } 

      var obj2_rotate_string=""; 
      var obj2_translate_values={ 
       x:10, 
       y:0 
      } 

      var mousedownFlag=false; 
      var mousedown={ 
       x:0, 
       y:0 
      } 

      var targetObj={ 
       t:null, 
       r:null, 
       obj:null 
      }; 

      function mousedown(event){ 
       if(event.target.hasAttribute('move')){ 
        mousedownFlag=true; 
        mousedown.x=event.pageX; 
        mousedown.y=event.pageY; 
        var Obj=event.target.id;     
        if(Obj==='obj1'){       
         targetObj.obj='obj1' 
        } 
        else{       
         targetObj.obj='obj2' 
        } 


       } 

      } 

      function mousemove(event){ 
       if(mousedownFlag){ 
        var dx=event.pageX-mousedown.x; 
        var dy=event.pageY-mousedown.y; 

        if(targetObj.obj==='obj1'){ 
         obj1_translate_values.x+=dx; 
         obj1_translate_values.y+=dy; 
         var obj=document.getElementById(targetObj.obj); 
         obj.setAttribute('transform', 'translate('+ obj1_translate_values.x+','+ obj1_translate_values.y+')'+ obj1_rotate_string); 

        } 
        else if(targetObj.obj==='obj2'){ 
         obj2_translate_values.x+=dx; 
         obj2_translate_values.y+=dy; 
         var obj=document.getElementById(targetObj.obj); 
         obj.setAttribute('transform', 'translate('+ obj2_translate_values.x+','+ obj2_translate_values.y+')'+ obj2_rotate_string); 

        } 

        mousedown.x=event.pageX; 
        mousedown.y=event.pageY; 
       } 
      } 

      function mouseup(event){ 
       mousedownFlag=false; 

      } 
     </script> 

    </body> 
+0

Raphael'i kullanmanızı öneririm ve daha sonra http://raphaeljs.com/reference.html#Element.getBBox ve http://raphaeljs.com/reference.html#Paper.getElementsByPoint'in bir bileşimini kullanarak yazabilirsiniz. mantık ... –

+0

Cevabınız için teşekkürler, raphael kullanmıyorum ve bunu kullanamıyorum, bu yüzden yerel Javascript ve Svg ile çözüm bulmam gerekiyor. Öğe döndürüldüğünde BBOX da düzgün çalışmıyor. – RashFlash

+0

http://stackoverflow.com/questions/5396657/event-when-two-svg-elements-touch sayfasına bakın ve "döndürülen bbox" ı almak için bbox sonucuna dönüşüm uygulayabileceğinizi unutmayın, bkz. Http://my.opera.com/MacDev_ed/blog/getting-screen-boundingboxes-in-svg. –

cevap

1

sorun daha kolay olacaktır.

SVG'nin dom arayüzü checkIntersection

Boole checkIntersection (SVGElement elemanda, SVGRect rect olarak) okuyabilir;