문제

Windows Forms 응용 프로그램에서 클라이언트 영역에 UI 핸들 (회전, 크기 조정 등)을 그리는 기능을 작성하고 있습니다. 객체를 선택할 때 함수가 호출됩니다.

발신자는 더 큰 사물 체계에 맞게 그래픽 객체를 올바르게 회전하고 스케일링하고 번역합니다 (선택된 객체에는 자체 회전/번역/스케일이 있으며 UI 핸들에는 상대적인 변환 및 회전이 선택된 개체를 갖습니다). 이제 부모의 스케일 (선택된 개체)에 관계없이 UI 핸들이 동일한 크기가되기를 원합니다.

변환 매트릭스에서 스케일 팩터를 제거/재설정하려면 어떻게합니까? 귀중한 번역과 회전 값을 유지하면서 1의 스케일로 어떻게 재설정합니까?

도움이 되었습니까?

해결책

곡물 방지 기하학 변환의 스케일링을 결정하기위한 기본 방법을 사용합니다 (AGG_TRANS_AFFINE.CPP에서 찾은 구현). 그렇게합니다.

  1. 변환의 회전 계산
  2. 변환을 복제하고 반대 회전을 적용합니다
  3. 알려진 두 가지 지점을 변환하고 결과에서 척도 계산

C#로 번역되면 다음과 같습니다.

Matrix transform = (Matrix)graphics.Transform.Clone();

PointF[] rotationPoints = new PointF[] { new PointF(0, 0), new PointF(1, 0) };
transform.TransformPoints(rotationPoints);

double rotationRadians = Math.Atan2(rotationPoints[1].Y - rotationPoints[0].Y, rotationPoints[1].X - rotationPoints[0].X);
transform.Rotate((float)(-rotationRadians * (180.0 / Math.PI)));

PointF[] scalePoints = new PointF[] { new PointF(0, 0), new PointF(1, 1) };
transform.TransformPoints(scalePoints);

float xScale = scalePoints[1].X - scalePoints[0].X;
float yScale = scalePoints[1].Y - scalePoints[0].Y;

AGG 코드에는 또한 제대로 작동하지 않는 퇴화 사례가 있지만 상황에 유용 할 수 있다는 경고가 포함되어 있습니다.

다른 팁

변화의 순서가 중요하다는 것을 알고 있어야합니다. 따라서 스케일을 제거하면 다음 번역의 "의미"가 변경 될 수 있습니다 (예 : 오프셋).

아마도 지금까지 적용된 규모의 기록을 유지할 수도 있습니다 (이것을 부르자. currentscale) 그리고 스케일을 추가하십시오 1/currentscale 당신의 트랜 포맷에.

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