2012-11-29 3 views
0

마우스 포인터로 시계 방향으로 4 점을 표시하는 대화식 입력이 주어진다면, 그려진 모양이 사변형인지 아닌지 Matlab을 사용하여 확인해야합니다. 선물 포장 알고리즘을 제안한 사람들을 보았습니다. 내 생각은 방금 tan을 사용하여 180도 이상의 각도를 가지면 모양이 볼록하지 않습니다. 더 좋은 방법을 제안 해 줄 수 있습니까? 나는 다음과 같은 코드를 참조 고맙겠 :convex square - matlab

여기
showImage(imageA) 
hold on 
% Initially, the list of points is empty. 
xy = []; 
n = 0; 
% Loop, picking up the points. 
disp('Please enter corners of place to insert image in clockwise order.') 

for i = 1:4 
[xi,yi] = ginput(1); 
plot(xi,yi,'yo') 
xy(:,i) = [xi;yi]; 
end 

%check if this is a convex quadrillateral 
a1 = (xy(2,2) - xy(2,1))/(xy(1,2) - xy(1,1)); 
a2 = (xy(2,3) - xy(2,2))/(xy(1,3) - xy(1,2)); 
a3 = (xy(2,4) - xy(2,3))/(xy(1,4) - xy(1,3)); 
a4 = (xy(2,1) - xy(2,4))/(xy(1,1) - xy(1,4)); 

tan1 = abs(atand((a2-a1) /(1+a1*a2))); 
tan2 = abs(atand((a3-a2)/(1+a3*a2))); 
tan3 = abs(atand((a4-a3)/(1+a4*a3))); 
tan4 = abs(atand((a1-a4)/(1+a1*a4))); 

if ((tan1 > 180) | (tan2 > 180) | (tan3 > 180) | (tan4 > 180)) 
disp('this is not a convex quadrillateral!!') 
end 
+0

더 나은 점은 무엇입니까? 2 차원 평면의 4 점이 볼록한 모양인지 확인하는 것이 어렵지 않습니다. –

+0

제 생각은 tan() = m2-m1/(1 + m1 * m2)를 사용하는 것이 었습니다. 이후로 나는 4 좌표, 나는 이것이 가장 쉬운 방법이라고 생각합니다. – Gilad

+0

누구든지 내 코드에 어떤 문제가 있다고 말할 수 있습니까? 나는 볼록하지 않은 사변형 위에 그것을 시험해 보았고 볼록하다는 답을 얻는다. 나는 180보다 큰 degress를 얻지 못합니다 – Gilad

답변

0

은 그것을 할 수있는 매우 간단한 방법입니다 :

  • 3 점의 모든 조합을 가지고 (총 4 있습니다).
  • 네 번째 점이이 점들을 모서리로 사용하여 정의 된 삼각형에 있는지 확인하십시오.

네 번째 점 중 하나가 삼각형에 있으면 볼록하지 않습니다. 그렇지 않으면입니다.

n + 1 검사를 할 준비가되어 있으면 일반적으로 n 포인트에서 작동한다고 생각합니다.

+0

포인트가 삼각형 안에 있는지 어떻게 확인합니까? – Gilad

+0

몇 가지 기본 교차 곱 계산을 수행하여 점이 삼각형 안에 있는지 확인할 수 있습니다. http://math.stackexchange.com/questions/51326/determining-if-an-arbitrary-point-lies-inside-a-triangle-defined-by-three-points – FakeDIY