2013-04-14 3 views
0

Я создаю программу в wpf, которая рисует полилинию, а также линию, смещенную параллельно. Он отлично работает для первого набора параллельных линий, но на каждой следующей строке правая линия выключена (отображается красным цветом).C# Линия рисования, параллельная полилинии

enter image description here

код до сих пор:

 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); 
      } 
     } 
    } 

Как убедиться, что на моей второй линии (красный), то параллельно с основной линией (Green)?

+0

Когда вы говорите «смещение», я думаю, вы не имеете в виду фиксированное смещение по x и y? Поскольку это было бы просто, вы всегда добавляли бы это фиксированное смещение в координаты параллельной линии. Однако нам нужна дополнительная информация о том, как она должна работать точно. – Clemens

+0

@Clemens: «Смещение» - это расстояние между двумя линиями. Это расстояние, перпендикулярное нормали, в этом случае я использую переменную 'width' – Ace

ответ

1

Одна часть проблемы довольно легко решить с помощью векторной структуры WPF. Учитывая отрезок линии между двумя точками p1 и 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; 

Однако приведенный выше код создает параллельный сегмент линии той же длины, что и исходный. Это может быть не совсем то, что вы хотите, так как я думаю, вы хотите создать «параллельную полилинию». Если это так, все становится немного сложнее, потому что вам также придется вычислять пересечения между соседними сегментами параллельной полилинии. Возможно даже, что некоторые из этих сегментов исчезают во время этих вычислений.

+0

Будет ли простой способ рассказать о том, чтобы линия не отображалась в прошлом/до некоторой точки? – Ace

+0

В этом контексте я не могу думать о более легком пути, чем просто вычислять пересечения. Это все равно придется делать. – Clemens

+0

Есть ли какой-то способ репликации угла, который дает мне зеленая линия? И использовать это для красного? – Ace

Смежные вопросы