2012-09-26 2 views
7

아래는 Android 코드입니다. WPF에, 나는 다음과 같은 코드를 사용하고 올 때경로 모양의 WPF 선분을 부드럽게하는 방법

날카로운 모서리을 제거하기 위해
path.moveTo(xx, yy); 
for (...) { 
    path.lineTo(xx, yy); 
} 
canvas.drawPath(this.path, paint); 

enter image description here

, 나는

final CornerPathEffect cornerPathEffect = new CornerPathEffect(50); 
paint.setPathEffect(cornerPathEffect); 

enter image description here

을 사용하고 있습니다 .

PathFigure pathFigure = new PathFigure(); 
pathFigure.StartPoint = new Point(xx, yy); 
for (...) { 
    LineSegment lineSegment = new LineSegment(new Point(xx, yy), true); 
    lineSegment.IsSmoothJoin = true; 
    pathFigure.Segments.Add(lineSegment); 
} 
PathGeometry pathGeometry = new PathGeometry(new PathFigure[] { pathFigure }); 
drawingContext.DrawGeometry(null, new Pen(Brushes.White, 3), pathGeometry); 

다음과 같은 효과가 나타납니다.

enter image description here

하는 것으로, 나는 PolyQuadraticBezierSegment 또는 PolyBezierSegment를 사용하지 마십시오. 경향이 불안정한. 즉, 새 점을 선 그래프에 추가 할 때마다 새로 추가 된 점은 이미 화면에 그려져있는 이전 경로를 변경하는 경향이 있습니다. 최종 결과로서, 전체 라인 그래프가 흔들리는 것을 관찰 할 수 있습니다.

라인 세그먼트를 부드럽게 만들 수 있습니까? 내가 lineSegment.IsSmoothJoin = true;을 사용했지만, 나는 여전히 날카로운 구석을 볼 수 있습니다. Android의 CornerPathEffect와 동일한 기능을 사용할 수 있습니까?

답변

0

나는 알고있다, 좀비 실 포스트. 당신은 아마 이미 스무딩 이후


내가 보이는 스무딩 알고리즘을 찾기 위해 매우 어려울 것이라고 생각 라인에서 여러 지점에 따라 달라집니다 ...이 문제를 해결하지만, 여기에 사실 후 내 생각 년입니다 최첨단에서 약간의 불안정성을 유발하지 않으면 서 합리적이다. 아마도 불안정의 범위를 줄일 수는 있지만 매우 이상한 추적을 생성 할 위험이 있습니다.

첫 번째 옵션은 프로젝션 아티팩트를 제한하는 스플라인 알고리즘을 사용하는 것입니다. 예를 들어 Catmull-Rom 알고리즘은 보간되는 곡선 세그먼트의 양쪽에 두 개의 알려진 점을 사용합니다. 곡선의 각 끝에 두 개의 추가 점을 합성하거나 단순히 첫 번째 곡선 부분을 직선으로 그릴 수 있습니다. 이렇게하면 마지막 부분으로 직선이 생기고 마지막 부분으로 두 번째 부분으로 커브가 추가됩니다.이 부분은 다른 점이 추가 될 때 거의 변하지 않습니다.

또는 초기 스플라인 계산을 통해 실제 데이터 점을 실행하여 점을 곱한 다음 스플라인 고고를 통해 두 번째 점을 실행할 수 있습니다. 가장 최근의 2m 포인트 (여기서 m은 첫 번째 패스의 배율 임)를 업데이트해야합니다. 그렇지 않으면 출력이 왜곡되어 보입니다.

내가 생각할 수있는 유일한 다른 옵션은 이전의 데이터를 기반으로 몇 가지 예측을 시도하는 것인데, 이는 상당히 규칙적인 입력으로도 어려울 수 있습니다. 이 방법을 사용하여 곡선의 끝 부분에 대한 베 지어 제어점을 합성했습니다. 모든 점에 대해 CP를 계산하고 최종 점에 사용할 항목이 필요했습니다. 마지막 곡선 세그먼트가 끔찍하게 변형되는 것을 막으려는 흥미로운시기가있었습니다. .

아, 하나 더 ... 최종 곡선 세그먼트를 그래프로 나타내지 마십시오. P n-1에서 커브를 종료하면 커브가 안정적으로 유지됩니다. 최종 세그먼트를 표시해야하는 경우 다른 스타일로 마지막 세그먼트를 그립니다. C-R 스플라인은 보간에서 +/- 2 개의 알려진 점만 필요하므로 세그먼트 P n-2 -P n-1이 충분히 안정되어야합니다.

C-R 알고리즘에 대한 코드가없는 경우 기본적으로 합성 베 지어 제어점을 사용하여 동일한 작업을 수행 할 수 있습니다. 프로세스를 설명하기보다는 프로세스의 붕괴를 상당히 줄이는 this blog post을 확인하십시오. This article에는 유용한 코드가 첨부되어 있습니다.

관련 문제