1

私はポリラインと平行なオフセット離れた線を描画するプログラムを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);
            }
        }
    }

2 番目の線 (赤) が主線 (緑) と平行になるようにするにはどうすればよいですか?

4

1 に答える 1

1

この問題の一部は、WPF の Vector 構造を使用して簡単に解決できます。p12 つの Pointとの間の線分が与えられるとp2、次のように法線ベクトルを計算できます。

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

次のように、平行線分 (ポイントp3と で指定p4)を作成できます。

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

ただし、上記のコードは、元の線分と同じ長さの平行線分を作成します。「平行ポリライン」を作成したいと思うので、これはまさにあなたが望むものではないかもしれません。その場合、平行ポリラインの隣接するセグメント間の交点も計算する必要があるため、状況は少し複雑になります。これらの計算中に、これらのセグメントの一部が消えることさえあるかもしれません。

于 2013-04-14T21:31:43.350 に答える