如何剪切矩形而不移动它?

时间:2013-04-26 08:32:26

标签: c# graphics rectangles

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:4)

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

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

  1. 创建一个平移,将应该是静态的点移动到坐标系的原点。在示例中,静态点是(200,300),因此转换为(-200,-300)
  2. 应用翻译
  3. 剪切
  4. 创建翻译的反转。在示例中:(200,300)
  5. 应用反向翻译
  6. BTW:确保你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));
        }
    }
    

答案 1 :(得分:2)

这是你需要做的:

  1. 将矩形的左下角翻译为原点。 设偏移为(-dX, -dY)
  2. 应用剪切变换。
  3. 将反向平移应用于矩形,即(dX, dY)