【问题标题】:Deformed object after 2d rotation二维旋转后变形的物体
【发布时间】:2014-09-12 07:08:43
【问题描述】:

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

在旋转θ角之前: 旋转θ角后:

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

我用于轮换的论坛:

        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);
        }

这就是我得到角度的 sin 和 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,但我认为这也适用于画线。

【问题讨论】:

  • 那么有什么问题。从图片中不清楚您的预期。您的代码围绕平面旋转,这就是您得到的结果。
  • 在二维正常旋转中,您通常不会得到重叠的线条。重叠的原因是因为其中一条线的深度低于另一条线。
  • 请解释一下。旋转不会使形状变形,在上面的图片中它完全显示了这一点。你在说什么重叠线?请清楚地展示你得到什么和你期望什么(用另一张草图)。
  • 我更新了更合适的图片。
  • sin 和 cos 的值是什么?另外:你能发布更新的代码吗?可能是您没有更新所有点(从而移动线)

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


【解决方案1】:

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

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

平行线示例

【讨论】:

  • 绝对惊人的答案。从来没想过这可能是问题,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多