2d旋转后变形的物体

时间:2014-09-08 10:18:18

标签: c# wpf graphics 2d vector-graphics

我在2D平面上有某些物体。我正在使用绘画技术(绘制视觉效果),它绘制元素,就像它将它们推到堆栈上,第一个元素在底部第二个 - 在它上面等等。现在,问题是我需要所有对象,除了其中一个(背景),在同一个Z级别上,因为在当前状态下我的程序碰巧以某种3D方式旋转一切都是假设以2D方式旋转它。我明白这个解释并不好,所以请参考下面的图片。

在以θ角度旋转之前:enter image description here 旋转θ角度后:enter image description here

你可以看到这两条线是如何开始重叠的,这一定不会发生。当我旋转图形时,它们会彼此靠近,并且有一个角度,两条线完全重叠,它们看起来像一条线我想避免这种情况。

我用于轮换的论坛:

        foreach(var item in Visuals){
           var p = new Point(item.Position.X - center.X, item.Position.Y - center.Y);
           var xnew = p.X * cos - p.Y * sin;
           var ynew = p.X * sin + p.Y * cos;
           p.X = xnew + center.X;
           p.Y = ynew + center.Y;
           item.Update(p.X, p.Y);
        }

这就是我得到角度的罪和cos的方法

     var pos = new Point(position.Y - center.Y, position.X - center.X);
     var rad = Math.Atan2(pos.Y, pos.X);
     var deg = rad.ToDegrees();
     var diff = RotationLastAngle - deg;//The last angle that we rotated to.
     RotationLastAngle = deg;
     var ans = diff.ToRadians();
     Host.Representation.Rotate(Math.Cos(ans), Math.Sin(ans), center);

Update()基本上将item的坐标设置为一行。

我认为造成这个问题的原因是DrawingVisual在图层上呈现项目,因此其中一条线高于另一条线(如果我错了,请纠正我)。我需要找到一种方法来避免这种情况。

这是我绘制线条的方式:

                    var dx = FromAtom.Atom.X - ToAtom.Atom.X;
                    var dy = FromAtom.Atom.Y - ToAtom.Atom.Y;
                    var slope = dy / dx;
                    if (slope > 0)
                    {
                        context.DrawLine(new Pen(Brushes.Black, Thickness), new Point(FromAtom.Position.X + 3, FromAtom.Position.Y + 3), new Point(ToAtom.Position.X + 3, ToAtom.Position.Y + 3));
                        context.DrawLine(new Pen(Brushes.Black, Thickness), new Point(FromAtom.Position.X - 3, FromAtom.Position.Y - 3), new Point(ToAtom.Position.X - 3, ToAtom.Position.Y - 3));
                    }
                    else
                    {
                        context.DrawLine(new Pen(Brushes.Black, Thickness), new Point(FromAtom.Position.X + 3, FromAtom.Position.Y - 3), new Point(ToAtom.Position.X + 3, ToAtom.Position.Y - 3));
                        context.DrawLine(new Pen(Brushes.Black, Thickness), new Point(FromAtom.Position.X - 3, FromAtom.Position.Y + 3), new Point(ToAtom.Position.X - 3, ToAtom.Position.Y + 3));
                    }

取自Adam Nathan的WPF 4.5 Unleashed说:“

  

后面的图纸放在早期图纸的顶部,因此它们保留了正确的Z排序

引用GeometryDrawing,但我认为这也适用于绘制线。

1 个答案:

答案 0 :(得分:1)

在您的情况下,结果会失败,因为您将线条垂直或水平偏移3个像素,而不考虑线条的实际方向。偏移矢量需要与线一起旋转以实现这种效果。那么问题是线条不会在一起并且有间隙或重叠。要解决这个问题,你需要一些数学。

绘制平行线(或多边形)不是一个小问题。请参阅this答案,了解如何操作,但在您的情况下,您可以使用compound lines

平行线示例

Form

相关问题