2013-04-10 3 views
1

현재 프로그램은 사용자가 포인트를 클릭 한 다음 다른 포인트 (최소 20 픽셀 이상)를 클릭하고 2 포인트 사이에 선을 그립니다. 이 작업을 여러 번 수행 할 수 있도록 Polyline을 사용했습니다. 모든 라인 집합은 모든 클릭이 완료된 후에 만 ​​나타납니다. 각각의 새로운 라인은 즉시 추가를 클릭 한 후 수 있도록실시간으로 다음 포인트로 라인을 그립니다.

A) 내가 어떻게해야합니까 :

void DrawingCanvas_MouseUp(object sender, MouseButtonEventArgs e) { 
     Point position = e.GetPosition(this); 

     if (leftList == null) { 
      //starting a new set 
      leftList.Add(position); 
      lastPoint = position; 
      return; 
     } 
     //calculate distance, i.e. end click 
     double a = lastPoint.X - position.X; 
     double b = lastPoint.Y - position.Y; 
     double distance = Math.Sqrt(a * a + b * b); 
     if (distance > 20) { 
      //continue to add to list 
      leftList.Add(position); 
      lastPoint = position; 
     } else { 
      //end of the line 
      paint(); 
      leftList = new PointCollection(); 
     } 

    } 

    private void paint() { 
     Polyline line = new Polyline(); 
     line.Visibility = System.Windows.Visibility.Visible; 
     line.StrokeThickness = 2; 
     line.Stroke = System.Windows.Media.Brushes.Black; 
     line.Points = leftList; 
     myCanvas.Children.Add(line); 
    } 

그래서 제 질문은 두 가지입니다. 나는 마지막 점 사이의 라인을 렌더링하려면 어떻게

B) 마우스 커서가) 다음 지점을 선택

답변

2

다음의 간단한 예제는 마우스 왼쪽 버튼을 누르고 마우스를 최소 포인트 거리 20만큼 이동하고 버튼을 계속 누르고있을 때 새 폴리 라인 그리기를 시작합니다. 길이에 따라 빨간색 또는 녹색으로 마지막 폴리 라인 세그먼트 (현재 마우스 위치까지)를 그립니다. 마우스 버튼을 놓고 새 세그먼트의 길이가> = 20이면 폴리 라인에 새 점이 추가됩니다. 그렇지 않으면 폴리선이 종료되고 새 폴리 라인을 만들 수 있습니다.

private Polyline polyline; 
private Polyline segment = new Polyline { StrokeThickness = 2 }; 

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (polyline == null) 
    { 
     var canvas = (Canvas)sender; 
     var point = e.GetPosition(canvas); 

     // create new polyline 
     polyline = new Polyline { Stroke = Brushes.Black, StrokeThickness = 2 }; 
     polyline.Points.Add(point); 
     canvas.Children.Add(polyline); 

     // initialize current polyline segment 
     segment.Stroke = Brushes.Red; 
     segment.Points.Add(point); 
     segment.Points.Add(point); 
     canvas.Children.Add(segment); 
    } 
} 

private void Canvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (polyline != null) 
    { 
     // update current polyline segment 
     var canvas = (Canvas)sender; 
     segment.Points[1] = e.GetPosition(canvas); 

     var distance = (segment.Points[0] - segment.Points[1]).Length; 
     segment.Stroke = distance >= 20 ? Brushes.Green : Brushes.Red; 
    } 
} 

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

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

     if (distance >= 20) 
     { 
      polyline.Points.Add(segment.Points[1]); 
      segment.Points[0] = segment.Points[1]; 
     } 
     else 
     { 
      if (polyline.Points.Count < 2) 
      { 
       canvas.Children.Remove(polyline); 
      } 

      polyline = null; 
      segment.Points.Clear(); 
      canvas.Children.Remove(segment); 
     } 
    } 
} 
+0

굉장! 그 브러시 색상들도 더 좋습니다! – Ace

0

모든 클릭에 점의 컬렉션을 유지하시기 바랍니다 직전 (즉에서 현재입니다. 컬렉션에서 StartPoint와 EndPoint와 같은 두 가지 속성을 가진 하나의 클래스를 추가 할 수 있습니다.

마우스를 처음 클릭 할 때 시작점 만있는 콜렉션에 하나의 클래스 객체 만 추가하면됩니다. 다음 번에 마우스를 클릭하면 광고 끝이 클래스의 마지막 객체를 가리키고 새로운 객체를 만들고이 지점을 시작점으로 지정하고 컬렉션에 추가합니다. 그 후에 paint 함수를 호출합니다.

관련 문제