[英]Delaunay triangulation makes me lose symmetry
I am using Delaunay triangulation to split polygons into triangles. 我正在使用Delaunay三角剖分将多边形拆分为三角形。 I work on FEM with a large code, and one of my "checkpoints" is symmetry (if the data is symmetric, the output has to be symmetric too).
我使用大型代码处理FEM,而我的“检查点”之一是对称的(如果数据是对称的,则输出也必须是对称的)。 However, since I have no control over the Delaunay triangulation, it makes me lose the symmetry.
但是,由于我无法控制Delaunay三角剖分,因此使我失去了对称性。
I have written a small code that illustrates my problem: we consider two disjoint triangles and a big rectangle that intersects them. 我写了一个小代码来说明我的问题:我们考虑了两个不相交的三角形和一个与它们相交的大矩形。 We want to triangulate the subtractions of those triangles with the rectangle:
我们想用矩形对那些三角形的减法进行三角剖分:
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;
As you can see, the Delaunay triangulation does not have the same behaviour in both triangles, hence the loss of symmetry. 如您所见,Delaunay三角剖分在两个三角形中的行为不同,因此失去了对称性。
Is there a simple way to recover symmetry? 有恢复对称性的简单方法吗?
I use Matlab R2013a. 我使用Matlab R2013a。
Seem like you are using MatLab R2013 because in my R2011b there is no delaunayTriangulation
function. 似乎您正在使用MatLab R2013,因为在我的R2011b中没有
delaunayTriangulation
函数。 To be able to run your code I changed it slightly: 为了能够运行您的代码,我对其进行了一些更改:
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');
Here is the result I see 这是我看到的结果
Is it similar to yours? 它和你的相似吗? Could you add an image to your question describing what is wrong with the result you get?
您能否在问题中添加一张图片,说明您得到的结果出了什么问题?
It seems this is not a bug. 看来这不是错误。 Your result comes from your data, actually.
您的结果实际上来自您的数据。
I played a little with your code 我玩了你的代码
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
And this is the output I seee: 这是我看到的输出:
Circle 1: Center at (0.28333333333333333000000,0.35000000000000003000000);
圈子1:以(0.28333333333333333000000,0.35000000000000003000000)为中心; R=0.05270462766947306400000 Circle 2: Center at (0.34999999999999998000000,0.34999999999999998000000);
R = 0.05270462766947306400000圆2:以(0.34999999999999998000000,0.34999999999999998000000)为中心; R=0.02357022603955168100000 Circle 3: Center at (0.28333333333333338000000,0.34999999999999992000000);
R = 0.02357022603955168100000第3圈:中心位于(0.28333333333333338000000,0.34999999999999992000000); R=0.05270462766947289800000 Circle 4: Center at (0.35000000000000003000000,0.28333333333333355000000);
R = 0.05270462766947289800000圆4:中心位于(0.35000000000000003000000,0.28333333333333355000000); R=0.05270462766947290500000 Circle 5: Center at (0.35000000000000003000000,0.28333333333333333000000);
R = 0.05270462766947290500000圆5:以(0.35000000000000003000000,0.28333333333333333000000)为中心; R=0.05270462766947312000000
R = 0.05270462766947312000000
And the figure: 和图:
So circles 1 and 3 as well as circles 4 and 5 are almost the same. 因此,圆1和3以及圆4和5几乎相同。 So the difference between yours and mine results might come even from round-off errors, because the corresponding four points are on the same circle within the float math precision.
因此,您的结果与我的结果之间的差异甚至可能来自舍入误差,因为相应的四个点在float数学精度内位于同一圆上。 You have to redesign your points in order to get reliable result which does not depend on such things.
您必须重新设计点才能获得不依赖于此类因素的可靠结果。
Have fun ;o) 玩得开心; o)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.