简体   繁体   English

Delaunay三角剖分使我失去对称性

[英]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;

Delaunay三角剖分

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM