pointLocation doesn't work for points on boundary edges.
2 次查看(过去 30 天)
显示 更早的评论
pointLocation sometimes doesn't work for points on the boundary edge, but sometimes it does work. Is it a bug or am I missing anything? Code below:
TP= [0 0;1 0;0 0.55362;0.34043 0;0 1;0.32885 0.30133;0.24765 0.71525;0.21437 1;0.41137 0.54785;1 0.30028;1 0.52531;1 0.74369;1 1]
C=[7 3 5;7 8 5;6 3 7;6 9 7;11 10 6;11 9 6;1 3 6;1 4 6;4 6 10;4 2 10;11 9 7;11 12 7;12 7 8;12 13 8]
TR = triangulation(C,TP)
triplot(TR)
hold on
P=[0.3,1]
plot(P(:,1),P(:,2),'k*')
ID = pointLocation(TR,P) %output NaN
ID2 = pointLocation(TR,[0.301,1]) %output 14
0 个评论
回答(1 个)
Divyam
2024-8-30
编辑:Divyam
2024-9-5
This is a numerical precision issue which may arise because the point you have selected lies exactly on the edge or vertex of the triangle. Thus, the floating-point precision error is causing the "pointLocation" function to assert that the point is located outside the triangle.
To determine whether the point chosen lies on the edge, fetch the "Barycentric coordinates" using the "pointLocation" method. The points which lie on an edge have at least one "Barycentric coordinate" equal to "zero" while the ones which lie on a vertex have the "Barycentric coordinate" corresponding to that vertex equal to "one" and others equal to "zero".
TP = [0 0; 1 0; 0 0.55362; 0.34043 0; 0 1; 0.32885 0.30133; 0.24765 0.71525; 0.21437 1; 0.41137 0.54785; 1 0.30028; 1 0.52531; 1 0.74369; 1 1];
C = [7 3 5; 7 8 5; 6 3 7; 6 9 7; 11 10 6; 11 9 6; 1 3 6; 1 4 6; 4 6 10; 4 2 10; 11 9 7; 11 12 7; 12 7 8; 12 13 8];
TR = triangulation(C,TP);
P1 = [0.3, 1];
P2 = [0.301, 1];
[ID1, B1] = pointLocation(TR,P1);
[ID2, B2] = pointLocation(TR,P2);
% P1 lies on the edge of the triangle
B1
% P2 also lies on the edge of the triangle
B2
As you have correctly determined, adjusting the point location slightly may help your case as it will mitigate the precision error.
Another workaround to this issue is to code a tolerance-based approach which will solve the floating-point precision error by introducing a certain tolerance to the distances calculated for determining whether a point lies inside the triangle or not.
This issue has been fixed in MATLAB R2022b, you can download the latest version using this link: https://www.mathworks.com/downloads
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Triangulation Representation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!