【发布时间】: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:“偏移”是两条线之间的距离。该距离垂直于法线,在这种情况下,我使用变量“宽度”