views:

192

answers:

1

Hi,

I'm trying to build a puzzle game in javascript, using raphael to take care of the drag and drop and rotation of the pieces.

The problem I'm facing is: Whenever I rotate an image, its coordinate system is rotated as well and the drag and drop doesn't work anymore as expected.

Edit2: Here is a simple test case. Drag around the ellipse, rotate it, and then try to drag again: http://www.tiagoserafim.com/tests/dragdrop.html

Edit: To clarify, whenever I move 1 pixel with the mouse to the right (x++), the image also moves 1 pixel on the x-coord, but on its own coordinate system, that maybe rotate, as the image below shows.

alt text

As explained on SVG Essentials, this is the expected behavior.

My question is: Is there an elegant way to do what I want, or I'll be forced to manually calculate the correct coords by using rotation matrix?

Other JS libraries or suggestions will be very welcome, even if they mean losing the IE support.

+2  A: 

As also noted in that article, the order of transformations is important.

  1. Translate object so the center point (Or whatever other point you want to rotate around) is at 0,0
  2. Rotate
  3. Translate back to previous position

Also note that there is an overload of rotate that already does this.

<html>
    <head>
        <script type="text/javascript" src="http://github.com/DmitryBaranovskiy/raphael/blob/master/raphael-min.js?raw=true"&gt;&lt;/script&gt;
        <script type="text/javascript">
            function Draw()
            {
                var x = 150, y = 150;
                var rotation = 0;
                var paper = Raphael(0, 0, 800, 800);
                var e = paper.ellipse(x, y, 30, 10);
                paper.path("M150 150L800 150");
                window.setInterval(function()
                {
                    x += 10;
                    rotation += 10;
                    e.translate(10, 0);
                    e.rotate(rotation, x, y);
                }, 500);
            }
        </script>
    </head>
    <body onload="Draw()">
    </body>
</html>
Dark Falcon
Hi! Yes, this is exactly what I'm doing. The problem is afterwards, when I try to drag and the image moves on its own x-coord, instead of the default horizontal x-coord, for example.
Tiago
Hi again! Thanks for your time working on this code. I tried it here and if you translate by 10 pixels instead of 1, you can see my problem happening: the image doesn't follow an straight, horizontal line.
Tiago
I added a straight horizontal line and increased both the distance moved and the angle of rotation. It still follows a straight line.Are you using an old version of Raphael, perhaps? I am using a fresh copy.
Dark Falcon
Mine didn't work as expected because I increased the translation to 10 pixels, but I didn't change the x+= 10 too. Thanks to you, now I see another use to rotate(trans, x, y).But still, I think that this doesn't solve the original problem. Suppose that you rotate the image by 45 degrees, and then translate it by (10, 0). It won't move on the horizontal anymore because of the new coord system. Therefore, it breaks the dragging and dropping, because it gives delta values relatives to the default coordinate system. Thanks again for your time and patience.
Tiago
I still cannot reproduce. Every time I rotate using the version that takes a point, it works perfectly. Can you provide code that fails?
Dark Falcon
http://www.tiagoserafim.com/tests/dragdrop.htmlHi Dark! By making this code, I was able to verify that you're right: translate(dx, dy) does, indeed, work as it should. My problem is that I'm messing around with the internal {cx, cy} attributes. I'll dig into raphael source to see how translate works and see if I can make it work with the default drag and drop method provided. Thank you so much for your time and patience!
Tiago
Tiago, should you select Dark Falcon's answer as selected? Don't bother answering me :)
Fabiano PS
@Fabiano: Yes, silly me for not accepting the answer right way :-)
Tiago