图像旋转平移偏移

时间:2014-05-19 22:36:51

标签: c# image rotation drawing transformation

我构建了一个系统,使用对象的最左侧和最垂直中心点作为原点来旋转和缩放对象。转换后,您可以将对象html / css3信息发送到服务器,c#将尝试重绘您创建的场景。 C#以相同的角度旋转对象/图像,但是从垂直和水平中心点旋转它们会导致对象/图像改变尺寸。我已经计算了这些变化,但是对象/图像左上角的x,y坐标出现偏移

这是我一直试图解决偏移问题的方法:

        int[] rotResult = new int[2];

        int[] tLCoord = new int[2];
        int[] tRCoord = new int[2];
        int[] bLCoord = new int[2];
        int[] bRCoord = new int[2];

        int[] tLCoordTmp = new int[2];
        int[] tRCoordTmp = new int[2];
        int[] bLCoordTmp = new int[2];
        int[] bRCoordTmp = new int[2];

        float sin = (float)Math.Sin(angle * Math.PI / 180.0);
        float cos = (float)Math.Cos(angle * Math.PI / 180.0);

        tLCoord[0] = (originalX - Math.Abs(xMin));
        tLCoord[1] = (originalY - Math.Abs(yMin));

        tRCoord[0] = origwidth;
        tRCoord[1] = 0;

        bLCoord[0] = 0;
        bLCoord[1] = (origheight * -1);

        bRCoord[0] = origwidth;
        bRCoord[1] = (origheight * -1);

        tLCoordTmp[0] = Convert.ToInt32((tLCoord[0] * cos) - (tLCoord[1] * sin));
        tLCoordTmp[1] = Convert.ToInt32((tLCoord[1] * cos) + (tLCoord[0] * sin));

        tRCoordTmp[0] = Convert.ToInt32(((tLCoordTmp[0] + tRCoord[0]) * cos) - (tRCoord[1] * sin));
        tRCoordTmp[1] = Convert.ToInt32(((tLCoordTmp[1] + tRCoord[1]) * cos) + (tRCoord[0] * sin));

        bLCoordTmp[0] = Convert.ToInt32(((tLCoordTmp[0] + bLCoord[0]) * cos) - (bLCoord[1] * sin));
        bLCoordTmp[1] = Convert.ToInt32(((tLCoordTmp[1] + bLCoord[1]) * cos) + (bLCoord[0] * sin));

        bRCoordTmp[0] = Convert.ToInt32(((tLCoordTmp[0] + bRCoord[0]) * cos) - (bRCoord[1] * sin));
        bRCoordTmp[1] = Convert.ToInt32(((tLCoordTmp[1] + bRCoord[1]) * cos) + (bRCoord[0] * sin));

        if (angle >= 270)
        {
            rotResult[0] = tLCoordTmp[0];
            rotResult[1] = tRCoordTmp[1];
        }
        else if (angle <= 90)
        {
            rotResult[0] = bLCoordTmp[0];
            rotResult[1] = tLCoordTmp[1];
        }
        else if (angle > 90 && angle <= 180)
        {
            rotResult[0] = bRCoordTmp[0];
            rotResult[1] = bLCoordTmp[1];
        }
        else if (angle > 180 && angle < 270)
        {
            rotResult[0] = tRCoordTmp[0];
            rotResult[1] = bRCoordTmp[1];
        }
        return rotResult;

我立刻知道有一些问题涉及这个公式在坐标平面方面的工作方式以及c#和html / css都呈现视觉元素的方式,我一直在运行小实验来抵消那些和没有什么似乎更接近解决方案,任何想法?

1 个答案:

答案 0 :(得分:0)

答案是首先计算物体左上角的图像X,Y偏移,同时通过TranslateTransform和RotateTransform旋转c#中的图像以防止剪切,然后使用对象独立计算对象的正确X,Y坐标在该对象的最左侧中心点之后,只需要制作一些条件语句来处理基于象限的计算差异