【发布时间】: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