2011-01-19 28 views
5

All,SVG - thay đổi kích thước một hình chữ nhật đặt ở một góc

Tôi có một hình chữ nhật SVG trong ứng dụng của tôi có thể được kéo dài theo chiều ngang bằng cách kéo thanh cuối (trái & phải) ở hai bên của hình chữ nhật. Hình chữ nhật có thể

(1) thay đổi kích cỡ (bằng cách kéo dài theo trên),

(2) kéo,

(3) & xoay.

Mọi thứ hoạt động tốt, tuy nhiên, một trải nghiệm lạ là khi tôi xoay hình chữ nhật đến mức gần 90, & rồi cố gắng thay đổi kích thước hình chữ nhật, nó bắt đầu kéo dài từ biên đối diện của hình chữ nhật thay vì đường viền gốc . (Đây là hình ảnh):

rendition of functionality

Nó dường như bị lẫn lộn giữa trái và phải khi tôi sử dụng chức năng xoay.

Dưới đây là HTML sửa đổi, JS & SVG:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 
<!--  <script type="text/javascript" src="CPolyline.js"> 

     </script>--> 
    </head> 
    <body> 
     <object id="oo" data="rect2.svg" style="position:fixed;width: 800px;height:800px;bottom:-100px;right: 375px;"> 

    </object> 
     path: <input type="button" id="path" onclick="X()"> 
     path2: <input type="button" id="path2" onclick="Y()"> 
    <input type="button" value="Rotate" onclick="Rotate1()"> 


     <script type="text/javascript"> 
      var ob=document.getElementById("oo") 

      var svgDoc=null; 
      var svgRoot=null; 
      var MyGroupObjectsObj = null; 
      var svgNS = "http://www.w3.org/2000/svg"; 
      var dragTarget = null; 
      var rectTemplate = null; 
      var grabPoint = null; 
      var clientPoint = null; 
      var rectX = null; 
      var rectY = null; 
      var rectWidth = null; 
      var rectHeight = null; 
      var arr=new Array(); 
      var resizingLeft = false; 
      var resizingRight = false; 
      var rectrot=null 

      ob.addEventListener("load", function(){ 

       svgDoc=ob.contentDocument; 

       svgRoot=svgDoc.documentElement; 
       grabPoint = svgRoot.createSVGPoint(); 
       clientPoint = svgRoot.createSVGPoint(); 
       rectTemplate = svgDoc.getElementById('rectTemplate') 

     rectrot=svgDoc.getElementById("rect1") 



}, false) 



var angel=0 


function Rotate1() 
{ 

     angel=angel+10 
     //alert(rectrot) 

     var c=rectTemplate.getAttribute("transform"); 
     var widt=Number(rectTemplate.getAttribute("width"))/2; 

     var hie=Number(rectTemplate.getAttribute("height"))/2 
     var tran=c.match(/[\d\.]+/g); 
     var newxpo=Number(tran[0])+widt; 
     var newypo=Number(tran[1])+hie; 
     var r=Math.tan((newxpo)/(newypo)) 
     rectTemplate.parentNode.setAttribute("transform","translate("+newxpo+" "+newypo+")"+"rotate("+angel+") translate("+(newxpo*-1)+" "+(newypo*-1)+")"); 



} 


function MouseDown(evt) 
{ 

    var targetElement = evt.target; 
     var checkForResizeAttempt = false; 

     if (targetElement == rectTemplate) 
     { 
      //arr.push(cir ,cir1,rectTemplate) 

       dragTarget = targetElement; 
       checkForResizeAttempt = true; 

         var transMatrix = dragTarget.getCTM(); 


     grabPoint.x = evt.clientX - Number(transMatrix.e); 
     grabPoint.y = evt.clientY - Number(transMatrix.f); 

     } 

     var transMatrix = dragTarget.getCTM(); 



//var transMatrix = dragTarget.getCTM().inverse(); 

     grabPoint.x = evt.clientX - Number(transMatrix.e); 
     grabPoint.y = evt.clientY - Number(transMatrix.f); 

     if (window.console) console.log(grabPoint.x + " " + grabPoint.y); 
     if (window.console) console.log(evt.clientX + " " + evt.clientY); 

     if (checkForResizeAttempt) 
     { 
      clientPoint.x = evt.clientX; 
      clientPoint.y = evt.clientY; 
      rectX = Number(dragTarget.getAttributeNS(null, "x")); 
      rectY = Number(dragTarget.getAttributeNS(null, "y")); 
      rectWidth = Number(dragTarget.getAttributeNS(null, "width")); 
      rectHeight = Number(dragTarget.getAttributeNS(null, "height")); 

      if ((grabPoint.x - rectX) < 10) 
      { 
      resizingLeft = true; 
      } 
      else if (((rectX + rectWidth) - grabPoint.x) < 10) 
      { 
      resizingRight = true; 
      } 

      if (resizingLeft || resizingRight) 
      { 
      dragTarget.setAttributeNS(null,"stroke","green"); 
      } 
      else 
      { 
      dragTarget.setAttributeNS(null,"stroke","black"); 
      } 
     } 
     } 

function MouseMove(evt) 
{ 
evt.stopPropagation(); 
if (dragTarget == null) 
     { 
     return; 
     } 
     if (resizingLeft) 
     { 
     if (window.console) console.log(evt.clientX + " " + evt.clientY); 
     deltaX = (clientPoint.x - evt.clientX); 
     if (window.console) console.log("deltaX = " + deltaX); 
     dragTarget.setAttributeNS(null,"width",rectWidth + deltaX); 
     dragTarget.setAttributeNS(null,"x",rectX - deltaX); 
     } 
     else if (resizingRight) 
     { 
     deltaX = (clientPoint.x - evt.clientX); 
     if (window.console) console.log("rectWidth = " + rectWidth + " deltaX = " + deltaX); 
     dragTarget.setAttributeNS(null,"width",rectWidth - deltaX); 


     } 
     else 
     { 


     var newXX = evt.clientX-grabPoint.x; 
     var newYX = evt.clientY-grabPoint.y; 


     dragTarget.setAttributeNS(null,'transform','translate(' + newXX + ',' + newYX + ')'); 
     } 

} 
function MouseUp(evt) 
{ 
    evt.stopPropagation(); 
    if (dragTarget == null) 
     { 
     return; 
     } 
     resizingLeft = false; 
     resizingRight = false; 
     resizingTop = false; 
     resizingBottom = false; 
    // var transMatrix = dragTarget.getCTM().inverse(); 
     dragTarget.setAttributeNS(null,"stroke","blue"); 
     dragTarget = null; 


} 


     </script> 
    </body> 
</html> 



-- 



=======SVG ==== 

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" 
    x="0px" y="0px" width="612px" height="792px" xml:space="preserve" 
onmousedown="ecmascript:top.MouseDown(evt)" 
onmousemove="ecmascript:top.MouseMove(evt)" 
onmouseup="ecmascript:top.MouseUp(evt)"> 




<g id="rect1"> 
    <rect id="rectTemplate" x="0" y="0" stroke="blue" width="100" height="30" /> 

</g> 
+0

Sẽ thực sự hữu ích nếu bạn đăng ví dụ đầy đủ nhưng không hoạt động (ví dụ: bao gồm tệp SVG). Ngoài ra, mã thụt lề của bạn cần một số định dạng nghiêm trọng yêu thương so với cách bạn đã dán nó. – Phrogz

+0

Cảm ơn Phrogz, tôi sẽ xem liệu tôi có thể đăng một phiên bản được viết xuống hay không. – Kayote

+0

Cập nhật mã để cải thiện tốt hơn các bit cần chú ý. Tốt nhất, – Kayote

Trả lời

1

Bạn đã cố gắng để thay đổi mã của bạn để xoay hình dạng xung quanh trung tâm của hình dạng?

Here is an excerpt của dự thảo W3C về transform:

rotate(<rotate-angle> [<cx> <cy>]), 
which specifies a rotation by <rotate-angle> degrees about a given point. 

If optional parameters <cx> and <cy> are not supplied, the rotate is about the origin of the current user coordinate system. 

The operation corresponds to the matrix [cos(a) sin(a) -sin(a) cos(a) 0 0]. 

If optional parameters <cx> and <cy> are supplied, the rotate is about the point (cx, cy). 

The operation represents the equivalent of the following specification: 
translate(<cx>, <cy>) rotate(<rotate-angle>) translate(-<cx>, -<cy>). 

Nếu bạn đặt cx và cy đến trung tâm của dải ruy băng của bạn, điều này có thể giúp từ những gì tôi có thể bối cảnh nhặt từ mã của bạn.

+0

tôi làm điều tương tự để xoay nhưng khi tôi xoay hình chữ nhật nắm tay thời gian của nó thay đổi tọa độ của nó và không thay đổi kích cỡ. .. –

+0

Cảm ơn Garet, cuối cùng tôi đã có cơ hội quay trở lại vấn đề này. Chúng tôi đang đi qua 'hình chữ nhật vào một nhóm' và sau đó xoay nhóm từ trung tâm. Đây là mã: rectTemplate.parentNode.setAttribute ("transform", "translate (" + newxpo + "" + newypo + ")" + "rotate (" + angel + ") dịch (" + (newxpo * -1) + "" + (newypo * -1) + ")"); – Kayote

+0

Garet, Ive đã thêm vào câu hỏi ban đầu ở trên, ngoài câu trả lời cho bài đăng của bạn và Phrogz. – Kayote

5

Tôi đã đăng một mẫu kéo và thay đổi kích thước dễ phân biệt SVG chuyển trong câu trả lời của tôi ở đây:
SVG coordinates with transform matrix

Bạn có thể xem ví dụ làm việc trên trang web của tôi ở đây:
http://phrogz.net/svg/drag_under_transformation.xhtml

Điều quan trọng là :

  1. Khi bạn bắt đầu kéo (mousedown) ghi lại vị trí chuột (trong không gian toàn cầu SVG).
  2. Trong khi kéo (mousemove) tính toán độ lệch (trong không gian toàn cầu SVG) để kéo và sau đó
  3. Chuyển đổi bù đắp từ không gian toàn cục vào không gian cục bộ của đối tượng và sử dụng nó để thông báo thay đổi của bạn.

Công trình này không phụ thuộc vào hệ thống phân cấp chuyển đổi được áp dụng (như minh họa trong ví dụ của tôi).

+0

THanx phrogz, thay đổi kích thước của tôi là worinkg đúng, Nhưng khi tôi xoay hình chữ nhật và muốn thay đổi kích thước nó một lần nữa hình chữ nhật đang di chuyển hướng khác (đối diện với vị trí con trỏ) vì tọa độ của nó được di chuyển từ vị trí ban đầu của nó ... giúp tôi sau khi thay đổi kích thước quay số –

+0

@AbdulRauf Mã và ví dụ của tôi không gặp phải vấn đề như vậy. Nếu tôi có thêm thời gian, tôi sẽ xem xét để phân tích mã của bạn, nhưng những gì tôi đang cung cấp là mã làm việc. – Phrogz

+0

Cảm ơn Phrogz. Chúng tôi đang làm tương tự và đạt được kết quả tương tự. Tuy nhiên, trong kịch bản của chúng tôi, ngoài 'người dùng có thể kéo ở đầu của hình chữ nhật và kéo dài nó', họ cũng có thể xoay hình chữ nhật. Vấn đề bắt nguồn từ vòng xoay, tức là khi chúng ta xoay hình chữ nhật sang một mức thậm chí lớn hơn một chút so với 20, tất cả chức năng thay đổi kích thước sẽ quay đầu. – Kayote

Các vấn đề liên quan