[英]Delaunay triangulation makes me lose symmetry
我正在使用Delaunay三角剖分将多边形拆分为三角形。 我使用大型代码处理FEM,而我的“检查点”之一是对称的(如果数据是对称的,则输出也必须是对称的)。 但是,由于我无法控制Delaunay三角剖分,因此使我失去了对称性。
我写了一个小代码来说明我的问题:我们考虑了两个不相交的三角形和一个与它们相交的大矩形。 我们想用矩形对那些三角形的减法进行三角剖分:
clear all
close all
warning off % the warning is about duplicate points, not important here
figure
hold on
p =[.3 .3
.4 .3
.3 .4
.7 .6
.6 .7
.7 .7]; % coordinates of the points for the triangles
px = 1/3;
py = 1/3;
lx = 1/3;
ly = 1/3; % size and position of the rectangle
% rearrange the polygon with clockwise-ordered vertices
[x1,y1]=poly2cw([px; px+lx; px+lx; px],[py; py; py+ly; py+ly]); % rectangle
patch(x1,y1, 1, 'EdgeColor', 'k');
for i=1:2
pc = p(3*i-2:3*i,:); % current triangle
% rearrange the polygon with clockwise-ordered vertices
[x0,y0]=poly2cw(pc(:,1),pc(:,2)); % triangle
[x2,y2] = polybool('intersection',x1,y1,x0,y0); % intersection
[x3,y3] = polybool('subtraction',x0,y0,x2,y2); % subtraction
DT = delaunayTriangulation(x3,y3);
triplot(DT,'Marker','o')
end
XL = xlim; xlim(XL+[-1 +1]*diff(XL)/10);
YL = ylim; ylim(YL+[-1 +1]*diff(YL)/10);
axis equal;
box on;
如您所见,Delaunay三角剖分在两个三角形中的行为不同,因此失去了对称性。
有恢复对称性的简单方法吗?
我使用Matlab R2013a。
似乎您正在使用MatLab R2013,因为在我的R2011b中没有delaunayTriangulation
函数。 为了能够运行您的代码,我对其进行了一些更改:
clear all
close all
warning off % the warning is about duplicate points, not important here
figure
hold on
p =[.3 .3
.4 .3
.3 .4
.7 .6
.6 .7
.7 .7]; % coordinates of the points for the triangles
px = 1/3;
py = 1/3;
lx = 1/3;
ly = 1/3; % size and position of the rectangle
% rearrange the polygon with clockwise-ordered vertices
[x1,y1]=poly2cw([px; px+lx; px+lx; px],[py; py; py+ly; py+ly]); % rectangle
patch(x1,y1, 1, 'EdgeColor', 'k');
for i=1:2
pc = p(3*i-2:3*i,:); % current triangle
% rearrange the polygon with clockwise-ordered vertices
[x0,y0]=poly2cw(pc(:,1),pc(:,2)); % triangle
[x2,y2] = polybool('intersection',x1,y1,x0,y0); % intersection
[x3,y3] = polybool('subtraction',x0,y0,x2,y2); % subtraction
%DT = delaunayTriangulation(x3,y3);
%triplot(DT)
% This is triangulation of subtraction
DT = delaunay(x3,y3);
triplot(DT,x3,y3, 'Marker','.', 'Color','r')
% This is triangulation of intersection
DT = delaunay(x2,y2);
triplot(DT,x2,y2, 'Marker','o', 'Color','b', 'LineWidth',1)
end
axis equal;
axis tight;
box on;
XL = xlim; xlim(XL+[-1 +1]*diff(XL)/10);
YL = ylim; ylim(YL+[-1 +1]*diff(YL)/10);
text(0.5,0.55,'triangulation of subtraction', 'HorizontalAlignment','center', 'VerticalAlignment','bottom', 'Color','r');
text(0.5,0.45,'triangulation of intersection', 'HorizontalAlignment','center', 'VerticalAlignment','top', 'Color','b');
这是我看到的结果
它和你的相似吗? 您能否在问题中添加一张图片,说明您得到的结果出了什么问题?
看来这不是错误。 您的结果实际上来自您的数据。
我玩了你的代码
clear all
close all
warning off % the warning is about duplicate points, not important here
figure
hold on
p =[.3 .3
.4 .3
.3 .4
.7 .6
.6 .7
.7 .7]; % coordinates of the points for the triangles
px = 1/3;
py = 1/3;
lx = 1/3;
ly = 1/3; % size and position of the rectangle
% rearrange the polygon with clockwise-ordered vertices
[x1,y1]=poly2cw([px; px+lx; px+lx; px],[py; py; py+ly; py+ly]); % rectangle
patch(x1,y1, 1, 'EdgeColor', 'k');
for i=1:2
pc = p(3*i-2:3*i,:); % current triangle
% rearrange the polygon with clockwise-ordered vertices
[x0,y0]=poly2cw(pc(:,1),pc(:,2)); % triangle
[x2,y2] = polybool('intersection',x1,y1,x0,y0); % intersection
[x3,y3] = polybool('subtraction',x0,y0,x2,y2); % subtraction
% This is for R2013a
%DT = delaunayTriangulation(x3,y3);
%triplot(DT,'Marker','o');
% This is for R2011b
%DT = DelaunayTri(x3,y3);
%triplot(DT,'Marker','o');
% This is plain delaunay version
DT = delaunay(x3,y3);
triplot(DT,x3,y3,'Marker','o')
% we break here to analyze the first triangulation
break
end
XL = xlim; xlim(XL+[-1 +1]*diff(XL)/10);
YL = ylim; ylim(YL+[-1 +1]*diff(YL)/10);
axis equal;
box on;
% % % % % % % % % % % % % % % % % %
% Checking the triangulation
% % % % % % % % % % % % % % % % % %
% Wrong triangulation for i=2 is hard-coded
DT2 = [
2 1 6
6 5 2
5 3 2
5 4 3
2 3 1 ];
figure;
hold all;
triplot(DT2,x3,y3,'Marker','o', 'Color','r', 'LineWidth',1)
axis equal;
axis tight;
box on;
XL = xlim; xlim(XL+[-1 +1]*diff(XL)*0.5);
YL = ylim; ylim(YL+[-1 +1]*diff(YL)*0.5);
% circumcircle: http://www.mathworks.com/matlabcentral/fileexchange/17300
ca = linspace(0,2*pi);
cx = cos(ca);
cy = sin(ca);
hl = [];
for k=1:size(DT2,1)
tx = x3(DT(k,:));
ty = y3(DT(k,:));
[r,cn]=circumcircle([tx,ty]',0);
if ~isempty(hl)
%delete(hl);
end
fprintf('Circle %d: Center at (%.23f,%.23f); R=%.23f\n',k,cn,r);
text( cn(1),cn(2), sprintf('c%d',k) );
hl = plot( cx*r+cn(1), r*cy+cn(2), 'm-' );
drawnow;
%pause(3); %if you prefere to go slowly
end
这是我看到的输出:
圈子1:以(0.28333333333333333000000,0.35000000000000003000000)为中心; R = 0.05270462766947306400000圆2:以(0.34999999999999998000000,0.34999999999999998000000)为中心; R = 0.02357022603955168100000第3圈:中心位于(0.28333333333333338000000,0.34999999999999992000000); R = 0.05270462766947289800000圆4:中心位于(0.35000000000000003000000,0.28333333333333355000000); R = 0.05270462766947290500000圆5:以(0.35000000000000003000000,0.28333333333333333000000)为中心; R = 0.05270462766947312000000
和图:
因此,圆1和3以及圆4和5几乎相同。 因此,您的结果与我的结果之间的差异甚至可能来自舍入误差,因为相应的四个点在float数学精度内位于同一圆上。 您必须重新设计点才能获得不依赖于此类因素的可靠结果。
玩得开心; o)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.