我在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);
}
这就是我得到角度的罪和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
,但我认为这也适用于绘制线。
答案 0 :(得分:1)
在您的情况下,结果会失败,因为您将线条垂直或水平偏移3个像素,而不考虑线条的实际方向。偏移矢量需要与线一起旋转以实现这种效果。那么问题是线条不会在一起并且有间隙或重叠。要解决这个问题,你需要一些数学。
绘制平行线(或多边形)不是一个小问题。请参阅this答案,了解如何操作,但在您的情况下,您可以使用compound lines。
平行线示例