1

我想问一下是否可以在不实际移动的情况下剪切物体。这是我现在正在做的代码

        Matrix matrix = new Matrix();
        matrix.Shear(2, 0);            

        g.Transform = matrix ;
        g.DrawRectangle(Pens.Black, new Rectangle(200, 200, 100, 100));
        g.ResetTransform();

在此处输入图像描述

4

2 回答 2

4

剪切因子相对于坐标系的原点。

因此,要将剪切结果保持在“相同”位置,您需要添加一个平移矩阵。

  1. 创建一个平移,将应该是静态的点移动到坐标系的原点。在示例中,静态点为 (200,300),因此平移为 (-200, -300)
  2. 应用翻译
  3. 剪切
  4. 创建翻译的逆。在示例中:(200, 300)
  5. 应用反向翻译

顺便说一句:确保你Dispose有矩阵和其他 GDI+ 对象!!

Matrix matrix = new Matrix();
matrix.Translate(200, 300);
matrix.Shear(2, 0);            
matrix.Translate(-200, -300);
g.Transform = matrix ;
g.DrawRectangle(Pens.Black, new Rectangle(200, 200, 100, 100));
g.ResetTransform();

或者

using (var g = this.CreateGraphics())
{
    using(Matrix translation = new Matrix(),
                 reverseTranslation = translation.Clone(),
                 sheer = new Matrix()
                 combination = new Matrix())
    {
        translation.Translate(200, 300);
        reverseTranslation.Invert();
        sheer.Shear(2, 0);
        combination.Multiply(translation);
        combination.Multiply(sheer);
        combination.Multiply(reverseTranslation);

        g.Transform = combination;
        g.DrawRectangle(Pens.Black, new Rectangle(200, 200, 100, 100));
        g.ResetTransform();
        g.DrawRectangle(Pens.Black, new Rectangle(200, 200, 100, 100));
    }
}
于 2013-04-26T08:48:18.083 回答
2

这是你需要做的:

  1. 将矩形的左下角平移到原点。让偏移量为(-dX, -dY)
  2. 应用你的剪切变换。
  3. 将反向平移应用于您的矩形,即(dX, dY).
于 2013-04-26T10:19:37.423 回答