Hi Thomas,

Thanks for your answer.

[EMAIL PROTECTED] a écrit :

Hi Thomas,

Thomas Palfray <[EMAIL PROTECTED]> wrote on 10/25/2008 05:08:39 AM:

> Well, i'm working on an application wich need to rotate a JSVGCanvas
> (90°, 180°, 270°). I used AffineTransform and the method
> setRenderingTransform like that :

   If you only need to support 90, 180 & 270 deg rotations.
I would suggest simply hard coding the correction factors.
For 90deg it will be a translate in X by the height before rotation.
for 180 deg it will be translate in X by the width and
in Y by the height (both before rotation), for 270 a
translate in Y by the width before rotation.
I already think about doing that, but it works badder than my current option :

tx.rotate(zoomControl.getAngleRotation(), Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getWidth(null) / 2, Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getHeight(null)/2); if(zoomControl.getAngleRotation()/(Math.PI/2) == 1) tx.translate(Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getWidth(null),0); if(zoomControl.getAngleRotation()/(Math.PI/2) == 2) tx.translate(Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getHeight(null),Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getWidth(null)); if(zoomControl.getAngleRotation()/(Math.PI/2) == 3) tx.translate(0,Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getHeight(null));

When i do
           double sinA = Math.sin(zoomControl.getAngleRotation());
tx.rotate(zoomControl.getAngleRotation(), Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getWidth(null) / 2, Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getImage().getHeight(null)/2); tx.translate(sinA * Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getRect().getX(), -sinA * Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().getRect().getY());

It perfectly work for 180, but 90 and 270 aren't positionning well. I made the same job on a picture in a JPanel and it works perfectly ...

<svg version="1.1" xmlns="http://www.w3.org/2000/svg";
     xmlns:xlink="http://www.w3.org/1999/xlink"; x="0px" y="0px"
     width="800" height="600" viewBox="0 0 800 600">
    <symbol id="obj">
       <rect   x="0" y="0" width="100" height="50" fill="blue"/>
       <path d="M10,25 h80 l-10,10 v-20 l10,10 z" fill="none"
             stroke="black" stroke-width="2"/>
    </symbol>

    <g transform="translate(100, 50)">
       <use xlink:href="#obj"
            transform="rotate(90)"/>
       <use xlink:href="#obj" opacity=".5"
            transform="translate(50,0), rotate(90)"/>
       <circle x="0" y="0" r="1" fill="red"/>
    </g>

    <g transform="translate(150, 300)">
       <use xlink:href="#obj"
            transform="rotate(180)"/>
       <use xlink:href="#obj" opacity=".5"
            transform="translate(100,50), rotate(180)"/>
       <circle x="0" y="0" r="1" fill="red"/>
    </g>

    <g transform="translate(200, 150)">
       <use xlink:href="#obj"
            transform="rotate(270)"/>
       <use xlink:href="#obj" opacity=".5"
            transform="translate(0,100), rotate(270)"/>
       <circle x="0" y="0" r="1" fill="red"/>
    </g>
</svg>
I can't have hardcoded transformation, because the rotation is just use for viewing. The svg file is used by others hands and it need to be clean.
Thanks for trying to help me :)

>
>     public void setSVGAffineTransformation(){
>         double CT=
> zoomControl.getTableauZoomCombo()[zoomControl.getZoomComboBoxValue()];
> AffineTransform tx = new AffineTransform(); > tx.setToScale(CT,CT);
>         if(zoomControl.getAngleRotation() != 0){
>             double sinA = Math.sin(zoomControl.getAngleRotation());
>             tx.rotate(zoomControl.getAngleRotation(),
> Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().
> getImage().getWidth(null)
> / 2,
> Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().
> getImage().getHeight(null)
> / 2);
>             //tx.translate(sinA *
> Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().
> getRect().getX()/CT,
> -sinA *
> Main.getFenetrePrincipale().getFenetreManuscrit().getPaintCanvas().
> getRect().getY()/CT);
>         }
>         svgCanvas.setRenderingTransform(tx);
>     }
>
> I'm trying to rotate, then translate the canvas to correct the rotation
> error, but it doesn't work as week as i want.
> So my question is :
> How to rotate a Canvas for having :
> - bottom left corner at 0,0 with 90° rotate
> - bottom right corner at 0,0 with 180° rotate
> - up right corner at 0,0 with 270° rotate
>
> Best regards, and sorry for my english !
> Thomas
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>

Reply via email to