# Different answers for the same algorithm

143 views (last 30 days)
farah fadel on 20 Mar 2020 at 15:28
Commented: farah fadel on 28 Mar 2020 at 11:12
I am getting different values of the width upon calling the findwidth function or writing its algorithm (exactly the same) in the main script. Is there a reason to justify that and know what is true?
The main script looks like this:
for i=1:10
:
for j=1:13
for p=1:length(c1)
:
P1new=[P11(concavev(i):n,:);P11(1:c1(p),:)];
width(i,j,p)=findwidth(P1new)
end
end
end
%the width function :
function width=findwidth(P11)
[k,av] = convhull(P11);
CP=[P11(k,1),P11(k,2)];
for x=1:(length(CP)-1)
z=1:(length(CP)-1);
for z=1:(length(CP)-1);
D(x,z)=Seg_point_dis(CP(z,:),CP(z+1,:),CP(x,:))
end
end
D1=max(D,[],2)
width=min(D1);
end

Aditya Patil on 27 Mar 2020 at 6:26
Can you attach the files here?
farah fadel on 27 Mar 2020 at 6:38
Done, thank you
Guillaume on 27 Mar 2020 at 7:33
I've only checked the first few lines of your code and stopped at CheckConc.
You're still using length on a 2-column matrix (both in the script and in CheckConc. I recommend that you never use length. For a vector, use numel. For a matrix, use size and explicitly specify which dimension you want to know the size of, rather than assuming that length will return the size of the dimension you are hoping for. So, use size(P1, 1) and size(v, 1)
The reason I stopped at CheckConc is that the function is wrong. It only performs N-1 checks for a N sided polygon so is missing one vertex in the concavity check. I've not tried to understand the math you're doing. There are more efficient algorithm to check that concavity. See stackoverflow and math.stackexhange. If you're guaranteed that your polygon is not self-intersecting that latter one would be best. It can be implemented without any loop in matlab.

Aditya Patil on 27 Mar 2020 at 9:16
Inside findwidth function, you have modified the variable D, which is a global variable. This creates the issue.
Instead, pass D as a parameter to the function, as follows ( parameter named E in the code below)
function width=findwidth(P11,ncc, E)
if ncc~=0
[k1,av] = convhull(P11);
CP=[P11(k1,1),P11(k1,2)];
else
CP=P11;
end
for q=1:(length(CP)-1)%:(length(CP)-1)
for z=1:(length(CP)-1)
E(q,z)=Seg_point_dis(CP(z,:),CP(z+1,:),CP(q,:));
end
end
D1=max(E,[],2) ;
width=min(D1);
end

#### 1 Comment

farah fadel on 28 Mar 2020 at 11:12
I am still getting different answer