一旦线接触到预定义正方形的周长,如何停止绘图?

How to stop plotting once line touches perimeter of predefined square?

我试图在不实际使用 Voronoi 函数图的情况下重新创建 Voronoi 图。我有一个预定义的 1x1 正方形作为我的 "test" 区域。我的代码知道图表的线条与周界相交的位置,但线条并不止于此。它一直前进,直到到达一个随机点。

x1 = 6
y1 = x1
x = gallery('uniformdata',[1,x1],0)
y = gallery('uniformdata',[1,y1],1)
sizeofx = size(x,2)
sizeofy = size(y,2)
reshapedx = reshape(x,sizeofx,1)
reshapedy = reshape(y,sizeofy,1)
[vxx,vyy] = voronoi(x,y)

hold on
[v,c] = voronoin([x(:) y(:)]) %intersection point matrix
for i=1:numel(c)
    v(c{i},:)
    ans = ans( ~any( isnan( ans ) | isinf( ans ), 2 ),: )%deletes infs or nans from polygon points
    plot(ans(:,1),ans(:,2),'b-','linewidth',2) %%this code plots the points 
end

%for our test purposes , the voronoi diagram will only be in a 1x1 square.
v(v<0) = inf
v(v>1) = inf
v = v( ~any( isnan( v ) | isinf( v ), 2 ),: ) %deletes the inf or nan

DT = delaunayTriangulation(reshapedx,reshapedy)
[V,R] = voronoiDiagram(DT)
sizeofR = size(R,1)
rectangle('Position',[0,0,1,1])
axis equal

xlimit = [0 1];
ylimit = [0 1];
xbox = xlimit([1 1 2 2 1]);
ybox = ylimit([1 2 2 1 1]);

%finds intersection from diagram to square
for j=1:length(vxx(1,:))
    line([vxx(1,j) vxx(2,j)],[vyy(1,j) vyy(2,j)]);
    [xi, yi, ii] = ...
      polyxpoly([vxx(1,j) vxx(2,j)], [vyy(1,j) vyy(2,j)], xbox, ybox);
        if ~isempty(xi)
                intersectx(j) = xi
                intersecty(j) = yi
                plot(xi,yi,'r*');
                axis equal
        end
 end

我希望线在到达周边点后停止绘制。

您可以用交点代替线的边缘坐标。

假设直线从 (x1,y1) 到 (x2,y2)。
检查 (x1,y1) 是否在矩形边界之外。
如果 (x1<0) || (y1<0) || (x1>1) || (y1>1).
我你的情况 (x1,y1) 在边界之外 如果 (x1,y1) 在外面,将 (x1,y1) 替换为交点 (xi,yi)。
注意:只有有交点才替换。

我忽略了两个交点的情况,因为这种情况在你的情况下永远不会发生(在那种情况下,你需要更换两者)。

这里是修改后的完整代码:

x1 = 6;
y1 = x1;
x = gallery('uniformdata',[1,x1],0);
y = gallery('uniformdata',[1,y1],1);
sizeofx = size(x,2);
sizeofy = size(y,2);
reshapedx = reshape(x,sizeofx,1);
reshapedy = reshape(y,sizeofy,1);
[vxx,vyy] = voronoi(x,y);

hold on
[v,c] = voronoin([x(:) y(:)]); %intersection point matrix
for i=1:numel(c)
    v(c{i},:);
    ans = ans( ~any( isnan( ans ) | isinf( ans ), 2 ),: );%deletes infs or nans from polygon points
    plot(ans(:,1),ans(:,2),'b-','linewidth',2); %%this code plots the points 
end

%for our test purposes , the voronoi diagram will only be in a 1x1 square.
v(v<0) = inf;
v(v>1) = inf;
v = v( ~any( isnan( v ) | isinf( v ), 2 ),: ); %deletes the inf or nan

DT = delaunayTriangulation(reshapedx,reshapedy);
[V,R] = voronoiDiagram(DT);
sizeofR = size(R,1);
rectangle('Position',[0,0,1,1]);
axis equal

xlimit = [0 1];
ylimit = [0 1];
xbox = xlimit([1 1 2 2 1]);
ybox = ylimit([1 2 2 1 1]);

%Vxx and Vyy are going to be a new set of line coordinates, replacing vxx and vyy.
Vxx = vxx;
Vyy = vyy;

%finds intersection from diagram to square
for j=1:length(vxx(1,:))

    %line([vxx(1,j) vxx(2,j)],[vyy(1,j) vyy(2,j)]);

    [xi, yi, ii] = ...
      polyxpoly([vxx(1,j) vxx(2,j)], [vyy(1,j) vyy(2,j)], xbox, ybox);
        if ~isempty(xi)
                intersectx(j) = xi;
                intersecty(j) = yi;
                plot(xi,yi,'r*', 'MarkerSize', 10);
                axis equal

                %Replace line edges outsize the rectangle with the inersection point.
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                x1 = vxx(1,j);
                x2 = vxx(2,j);
                y1 = vyy(1,j);
                y2 = vyy(2,j);
                is_outsize1 = (x1 < 0) || (y1 < 0) || (x1 > 1) || (y1 > 1);
                is_outsize2 = (x2 < 0) || (y2 < 0) || (x2 > 1) || (y2 > 1);

                %Assume rectangle's boundaries are (0,0) to (1,1)
                if is_outsize1
                    %Replace the coordinate [vxx(1,j), vyy(1,j)] with [xi, yi].
                    Vxx(1,j) = xi;
                    Vyy(1,j) = yi;
                end

                if is_outsize2
                    %Replace the coordinate [vxx(2,j), vyy(2,j)] with [xi, yi].
                    Vxx(2,j) = xi;
                    Vyy(2,j) = yi;
                end
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        end

    %Plot the line with the replaces coordinates
    line([Vxx(1,j) Vxx(2,j)],[Vyy(1,j) Vyy(2,j)], 'color', 'g', 'LineWidth', 1, 'Marker', '+');
end

结果:

原剧情: