문제

폴리라인 개체를 사용하여 동적으로 만든 그래픽이 있습니다.흥미로운 결과가 나오지만 마지막 10개 좌표만 유지하고 싶습니다. 10번째 위치에 도달하면 모든 좌표가 X 픽셀만큼 왼쪽으로 이동하고 끝에 새 값이 추가됩니다.

내 드로잉 클래스의 추가 기능에서 다음과 같은 코드를 시도했습니다.

        if (points.Count > 10)
        {
            myPolyline.Points.RemoveAt(0);

            foreach(Point p in myPolyline.Points)
            {
                p.X = p.X - 50;//Move all coord back to have a place for the new one
            }   
        }

ForEach 루프에서는 컬렉션의 변수를 수정할 수 없기 때문에 작동하지 않습니다.WPF/C#에서 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

더 많은 정보

다음을 수행하여 수행할 수 있습니다.

            for (int i = 0; i < this.myPolyline.Points.Count; i++)
            {
                this.myPolyline.Points[i] = new Point(this.myPolyline.Points[i].X - 50, this.myPolyline.Points[i].Y);
            }

하지만 나는 포인트 객체를 매우 시간을 들여 생성하지 않고도 이를 수행할 수 있는 보다 깔끔한 방법을 원합니다.

도움이 되었습니까?

해결책

글쎄, Point 구조체이므로 새 구조체를 만드는 오버헤드가 나쁘지 않아야 합니다.다음을 수행합니다 ...

Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;

...구조체가 값으로 전달되기 때문에 실제로 다르지 않습니다.

당신은 꽤 많이 붙어 있습니다 for 루프 및 재할당 myPolyline.Points[i], 상황을 고려하여:

  1. 당신은 Point 다른 것과 X 값.
  2. 변수를 수정할 수 없습니다. foreach 루프이므로 for 고리.
  3. myPolyline.Points[i].X -= 50 방식 때문에 작동하지 않습니다 Point struct는 배열에서 검색된 다음 자동으로 다시 할당되지 않습니다.

단순히 전체를 옮기고 싶다면 PolyLine, 내가 제안했을 수도 있습니다 LayoutTransform 또는 RenderTransform, 하지만 다음의 하위 집합을 이동하고 있습니다. Points 다음에는 다른 항목을 추가합니다.

편집하다: 해당 작업을 실제로 리팩토링하려면 다음에서 확장 메서드를 만들 수 있습니다. PointCollection 에 대한 for 루프 및 포인트 조정은 다음과 같습니다.

static public void ChangePoints( this PointCollection pc, Vector v ) {
    for (int i = 0; i < pc.Count; i++ ) {
        pc[i] += v;
        // the above works on the indexer because you're doing an operation on the
        // Point rather than on one of the Point's members.
    }
}

용법:

myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );

여전히 변경해야 합니다. Point같은 방식이지만 사용법을 더 읽기 쉽도록 다른 곳에서 리팩토링되었습니다.그리고 사용법 Vector 더 읽기 쉽게 만듭니다.

다른 팁

대신 캔버스 전체를 왼쪽으로 이동하고 항상 새로운 포인트의 삽입 점을 늘리십시오.

수많은 아이템이 있다면 렌더링 성능도 향상됩니다 (특히 움직임을 애니메이션하는 경우).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top