2010-12-30 2 views
2

저는 응용 프로그램에 대해 4 포인트 이미지 변환 작업을하고 있습니다. 사용자는 각 구석을 드래그하여 유효한 사변형을 만들거나 "경계 상자"를 사용하여 세로, 가로 및 비례로 크기를 조정할 수 있습니다.4 포인트 이미지 변환에 대한 제한 사항 적용

지금까지 이미지 변환 부분이 작동했습니다. 그러나, 나는 그것에 한계를 부과하는 힘든 시간을 보내고있다. 그래서 ...

  1. 버텍스는 서로 교차하지 않는다. 다른 말로하면 사용자가 모래 시계 모양을 만들 수 있도록 허용하지 않습니다. 항상 사변형이어야합니다.
  2. 마찬가지로 각 모서리 사이의 각도는 0보다 커야합니다. 그렇지 않으면 정점이 한 줄로 끝납니다.
  3. 이 이미지의 최소 크기입니다. 즉, 각 모서리는 서로 일정 거리 떨어져 있어야하며, 반대편 선이 있어야합니다.
  4. 사용자는 이미지를 뒷면으로 "뒤집을"수 없습니다. 4 개의 모서리 (p1, p2, p3 및 p4)는 시계 방향으로 나타나야합니다.
  5. 불규칙한 연 모양과 삼각형이 유효합니다.

이러한 문제와 관련된 수식이나 논문이 있는지 궁금합니다. 나는 현재 2 개의 선분이 교차하고 (그리고 어디서), 또 다른 점에 선상에서 가장 가까운 점을 찾는 지 찾기위한 공식을 가지고있다. 내가 구현 한 대부분의 구현은 내가 좋아하는 것처럼 사용자 친화적이지 않았습니다. 제한을 부과 할 때 구석이 뛰어 넘기 때문입니다.

P. DirectX를 사용하여이 프로젝트에 C#을 사용하고 있습니다. 그러나 응용 프로그램은 2D뿐입니다.

답변

2

나의 제안은 제한을 가하는 것이 아니라 단지 빨간색 와이어 프레임 폴리곤이라고 말하면서 용인 할 수 없다는 뜻입니다.

프로그래머가 양식 입력란에 제한을 두는 경우 다소 좋아집니다. 시작 날짜가 종료 날짜 이전이어야하며 시작 필드의 날짜가 종료 필드의 날짜 다음에 입력되는 것을 허용하지 않습니다. 사용자를 탭에서 필드로 끝내고 종료 날짜를 입력 한 다음 탭 이동 시작 필드로 돌아가 올바른 시작 날짜를 입력하십시오.

필드를 빨간색으로 표시하면 훨씬 더 유용합니다 ... 실제로 적은 코딩이 필요합니다.

사용자 마우스 움직임을 트래핑하는 것은 거의 불가능합니다. 어떤 사용자가 물어 보는 것을 적용 할 수 없다면 움직임을 제약하는 대신에 이것을 분명히해야합니다 ... 사용자가 첫 번째 꼭지점을 움직이고 나중에 다른 꼭지점을 변환을 유효하게 만드는 위치로 이동하려고 할 수 있습니다 (정확하게 두 개의 날짜 필드 예).

정말 잘못된 위치를 항상 방지해야한다고 생각하면 (예 : 변형이 문제없이 뒤집기 작업을 허용하더라도 사용자가 이미지를 뒤집지 못하도록 금지하는 등) 내 마음에 오는 가장 간단한 해결책 isValid() 기능을 가지고 있으며 유효하지 않은 경우 키포인트를 새 위치로 이동하지 않는 것입니다.

유효하지 않은 영역이 "거의 유효하지 않은"영역에 매우 가까워지기 때문에 유효하지 않은 상태 영역 주변을 "슬라이드"하는 코드를 사용하면 IMO를 제대로 처리하기가 매우 어렵습니다. "슬라이딩"이 필요한 경우에도 사용자가 요구하는 점에 가장 가까운 유효한 점을 찾기 위해 키포인트 위치를 중심으로 로컬 검색을 수행하여 내재 된 isValid() 접근 방식을 구현할 것입니다.

모든 슬라이딩 가능성을 분명하게 계산하는 것은 변환 알고리즘에서 무언가를 변경해야하는 경우 (따라서 유효하고 그렇지 않은 경우) 무언가를 변경해야하는 경우에도 올바를 수있는 악몽입니다.

+0

나는 당신의 제안을 좋아하지만,이 응용 프로그램은 사용자가 직접 이미지를 변경할 수 있도록되어 있습니다. 변환을 표시하기 위해 와이어 프레임을 사용하지 않으며 조작 된 이미지에 사용자 실수를 표시 할 수 없습니다. 이상적인 것은 아니지만 마우스 움직임을 트래핑하는 것은 이러한 요구 사항 내에서 차선책으로 보입니다. – Japtar

+0

변환이 유효하지 않은 경우 채워진 빨간색 다각형을 그리는 것이 더 좋을 것이라고 생각하지만 UI 대안을 선택해야만 할 경우 어떻게 할 것인가에 대한 대답을 편집했습니다. 키포인트 편집 중에 항상 변형을 적용하면 수식에 대해 유효 할 수있는 변형이 배제됩니다 (예 : 뒤집기 중 하나에서 뒤집기로 변환하기 때문에 단 하나를 위해 통과해야하고 강제 UI는 그것을 허용하지 않을 것이다). – 6502

+0

저는이 문제와 관련하여 상사와 동료들과 이야기했습니다. 그들은 당신의 첫 번째 아이디어를 받아 들였으므로이 문제를 해결하십시오 :). – Japtar

0

시작할 때마다 그리고 사용자가 핸들을 이동할 때마다 다른 핸들이 통과 할 수없는 수평선과 수직선 집합을 결정하고 끌 때 해당 경계선을 적용하십시오. 이렇게하면 첫 번째 문제가 해결됩니다.

두 번째로 끌기 중에 마우스를 움직이면 커서와 다른 세 개의 핸들 사이의 거리를 계산합니다. 최소 거리보다 작 으면 핸들을 다른 핸들 주위의 원형 경로로 이동하십시오.

+0

첫 번째 규칙으로 사용자가 이미지를 회전하지 못하게하지 않겠습니까? 왜냐하면 나는 그것을 구현해야하기 때문이다. – Japtar

+0

모든 상황에서 예를 적용했지만 모양을 변경하지 않으므로 로테이션/시프 팅에는 동일한 제약 조건이 필요하지 않습니다. – arootbeer