2012-11-29 44 views
0

给定一个用鼠标指针顺时针方向标记4点的交互式输入,我需要用Matlab检查绘制的图形是否是四边形的凸形。我看到一些人提出了礼品包装算法。我的想法只是使用tan,如果我有一个大于180度的角度,形状不是凸面。 你能提出一个更好的方法来做到这一点吗?我会感激你参考下面的代码:凸平方 - 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

你的意思是说更好?不应该很难确定2D平面上的四个点是否为凸形。 –

+0

我的想法是使用tan()= m2-m1 /(1 + m1 * m2)。因为我有4个坐标,我认为这将是最简单的方法。 – Gilad

+0

任何人都可以告诉我我的代码有什么问题吗?我已经尝试过非凸四极管,我得到一个答案,它是一个凸。我不会超过180 – 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