我想做其他人通常避免的事情:
我有两个多边形(多边形对象),layer1
和layer2
。 layer1
将通过两个多边形的交点扩展。根据定义,这些点与layer1
的边缘共线。我希望它适用于任何多边形。
示例:
假设两个多边形的定义如下:
square = polyshape([0,0;0,6;6,6;6,0]);
layer1 = addboundary(square, [1,2,5,4], [1,1,5,5]);
layer2 = addboundary(square, [4,5,2,1], [1,1,5,5]);
添加扩展名后的预期结果:
>> layer1.Vertices
ans =
0 0
0 6.0000
6.0000 6.0000
6.0000 0
NaN NaN
1.0000 1.0000
2.0000 1.0000
3.0000 2.3333
3.5000 3.0000
5.0000 5.0000
4.0000 5.0000
3.0000 3.6667
2.5000 3.0000
解决方法:
Matlab提供了两个有前途的工具:可以指示每个布尔函数(相交,并集,异或,相减)保持共线点。每个布尔函数还返回shapeID
和vertexID
,告诉您每个点的来源。
shapeID == 0
添加所有点就足够了。但是我不知道如何将这些额外的点与现有的点按正确的顺序放置。layer1 = union(layer1, subtract(layer1, layer2), 'KeepCollinearPoints', true);
不能捕获所有交叉点(出于我不了解的原因-它适用于layer2 = union(layer2, subtract(layer2, layer1), 'KeepCollinearPoints', true);
)。类似
[layer1,shapeID,~] = intersect(layer1,layer2);
layer1 = polyshape(layer1.Vertices(shapeID~=2,:), 'KeepCollinearPoints', true);
似乎可行,但并非对所有多边形都有效(例如layer1 = addboundary(square, [1,5,2.5], [2,2,4]);
并非理想结果)
我觉得必须为我尚未发现的问题找到一个优雅的解决方案。感谢您的帮助。