我想做一些其他人通常避免做的事:
我有两个多边形(多边形对象)
layer1
和
layer2
.
第一层
由两个多边形的交点延伸。根据定义,这些点与
第一层
. 我想这对任何多边形都有效。
例子:
假设这两个多边形的定义是:
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提供了两个有前途的工具:每个布尔函数(intersect、union、xor、subtract)都可以被指示保持共线点。每个布尔函数也返回
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]);
没有理想的结果)
我觉得我的问题一定有一个优雅的解决方案,我只是还没有找到。我很感激你的帮助。