WPF PolyLine 개체에서 모든 좌표를 이동하는 방법은 무엇입니까?
문제
폴리라인 개체를 사용하여 동적으로 만든 그래픽이 있습니다.흥미로운 결과가 나오지만 마지막 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]
, 상황을 고려하여:
- 당신은
Point
다른 것과X
값. - 변수를 수정할 수 없습니다.
foreach
루프이므로for
고리. myPolyline.Points[i].X -= 50
방식 때문에 작동하지 않습니다Point
struct는 배열에서 검색된 다음 자동으로 다시 할당되지 않습니다.
단순히 전체를 옮기고 싶다면 PolyLine
, 내가 제안했을 수도 있습니다 LayoutTransform
또는 RenderTransform
, 하지만 다음의 하위 집합을 이동하고 있습니다. Point
s 다음에는 다른 항목을 추가합니다.
편집하다: 해당 작업을 실제로 리팩토링하려면 다음에서 확장 메서드를 만들 수 있습니다. 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
더 읽기 쉽게 만듭니다.
다른 팁
대신 캔버스 전체를 왼쪽으로 이동하고 항상 새로운 포인트의 삽입 점을 늘리십시오.
수많은 아이템이 있다면 렌더링 성능도 향상됩니다 (특히 움직임을 애니메이션하는 경우).