【问题标题】:C# Drawing line parallel to a PolylineC# 绘制与折线平行的线
【发布时间】:2013-04-06 08:08:35
【问题描述】:

我正在 wpf 中创建一个程序,该程序绘制折线以及一条平行的偏移线。它适用于第一组平行线,但在接下来的每条线上,右线都是倾斜的(以红色显示)。

到目前为止的代码:

        private void DrawingCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
        if (polylineLeft != null) {
            var canvas = (Canvas)sender;
            leftSegment.Points[1] = e.GetPosition(canvas);

            var distance = (leftSegment.Points[0] - leftSegment.Points[1]).Length;

            if (distance >= 20) {

                polylineLeft.Points.Add(leftSegment.Points[1]);
                //calculate second line
                var L = Math.Sqrt((leftSegment.Points[0].X - leftSegment.Points[1].X) * 
                    (leftSegment.Points[0].X - leftSegment.Points[1].X) + 
                    (leftSegment.Points[0].Y - leftSegment.Points[1].Y) * 
                    (leftSegment.Points[0].Y - leftSegment.Points[1].Y));
                var x1p = leftSegment.Points[0].X + width * (leftSegment.Points[1].Y-leftSegment.Points[0].Y) / L;
                var x2p = leftSegment.Points[1].X + width * (leftSegment.Points[1].Y-leftSegment.Points[0].Y) / L;
                var y1p = leftSegment.Points[0].Y + width * (leftSegment.Points[0].X-leftSegment.Points[1].X) / L;
                var y2p = leftSegment.Points[1].Y + width * (leftSegment.Points[0].X-leftSegment.Points[1].X) / L;
                if (!initialLeftPoint) {
                    polylineRight.Points.Clear();
                    polylineRight.Points.Add(new Point(x1p, y1p));
                    initialLeftPoint = true;
                }
                polylineRight.Points.Add(new Point(x2p, y2p));
                leftSegment.Points[0] = leftSegment.Points[1];
                rightSegment.Points[0] = rightSegment.Points[1];
            } else {
                if (polylineLeft.Points.Count < 2) {
                    canvas.Children.Remove(polylineLeft);
                }

                polylineLeft = null;
                polylineRight = null;
                leftSegment.Points.Clear();
                rightSegment.Points.Clear();
                canvas.Children.Remove(leftSegment);
                canvas.Children.Remove(rightSegment);
            }
        }
    }

如何确保我的第二条线(红色)与主线(绿色)平行?

【问题讨论】:

  • 当您说“偏移量”时,我猜您的意思不是 x 和 y 中的固定偏移量?因为这很简单,所以您只需始终将该固定偏移量添加到平行线的坐标中。但是,我们需要更多关于它应该如何工作的信息。
  • @Clemens:“偏移”是两条线之间的距离。该距离垂直于法线,在这种情况下,我使用变量“宽度”

标签: c# wpf draw


【解决方案1】:

在 WPF 矢量结构的帮助下,问题的一部分很容易解决。给定两个点 p1p2 之间的线段,您可以像这样计算法向量:

Point p1 = ...
Point p2 = ...
var v = p2 - p1;
var n = new Vector(v.Y, -v.X);
n.Normalize();
// now n is a Vector of length 1, perpendicular to the line p1-p2

您现在可以像这样创建一条平行线段(由点 p3p4 给出):

var distance = 20d;
var p3 = p1 + n * distance;
var p4 = p3 + v;

但是,上面的代码创建了一个与原始长度相同的平行线段。这可能不是您想要的,因为我猜您想创建一条“平行折线”。如果是这种情况,事情会变得有点复杂,因为您还必须计算平行折线的相邻线段之间的交点。甚至在这些计算过程中,其中一些片段可能会消失。

【讨论】:

  • 是否有一种简单的方法来告诉线条不要渲染过去/之前的某个点?
  • 在这种情况下,我想不出比计算交叉点更简单的方法了。无论如何都必须这样做。
  • 有什么方法可以复制绿线给我的角度吗?把它用在红色上?
  • 当然,这是基本几何。 Math.Atan2(p2.Y - p1.Y, p2.X - p1.X) / Math.PI * 180 会给你从 x 轴顺时针测量的角度。你也可以创建一个参考向量并调用AngleBetween
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2016-04-12
  • 2016-07-31
  • 1970-01-01
相关资源
最近更新 更多