0

マウスポインタで時計回りにマークされた4点のインタラクティブな入力を考えると、描画された形状が四辺形の凸面であるかどうかをMatlabを使用して確認する必要があります。ギフトラッピングアルゴリズムを提案する人を見かけました。私の考えはtan、180度を超える角度を持っている場合、形状が凸状にならないように、を使用することでした。あなたはそれを行うためのより良い方法を提案できますか?次のコードを参照していただければ幸いです。

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
4

1 に答える 1

0

これを行う非常に簡単な方法は次のとおりです。

  • 3点の組み合わせをすべて取ります(合計4点あります)。
  • 4番目の点が、それらの点をコーナーとして使用して定義された三角形内にあるかどうかを確認します。

4番目の点のいずれかが三角形の中にある場合、それは凸ではありません。そうでない場合は、凸です。

n + 1のチェックを行う準備ができていれば、これは一般にnポイントで機能すると思います。

于 2012-11-30T09:36:15.173 に答える