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

Matlab 一旦线接触到预定义正方形的周长,如何停止打印?,matlab,voronoi,Matlab,Voronoi,我试图在不使用Voronoi函数图的情况下重新创建Voronoi图。我有一个预定义的1x1正方形作为“测试”区域。我的代码知道图中的线与周长相交的位置,但这条线并不停在那里。它一直运行,直到到达一个随机点 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(

我试图在不使用Voronoi函数图的情况下重新创建Voronoi图。我有一个预定义的1x1正方形作为“测试”区域。我的代码知道图中的线与周长相交的位置,但这条线并不停在那里。它一直运行,直到到达一个随机点

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=6
y1=x1
x=gallery('uniformdata',[1,x1],0)
y=gallery('uniformdata',[1,y1],1)
sizeofx=尺寸(x,2)
sizeofy=尺寸(y,2)
重塑x=重塑(x,sizeofx,1)
重塑y=重塑(y,sizeofy,1)
[vxx,vyy]=voronoi(x,y)
等等
[v,c]=voronoin([x(:)y(:)])%交点矩阵
对于i=1:numel(c)
v(c{i},:)
ans=ans(~any(isnan(ans)| isinf(ans),2),:)%从多边形点删除INF或NAN
绘图(ans(:,1),ans(:,2),'b-','linewidth',2)%%此代码绘制点
结束
%出于我们的测试目的,voronoi图将仅为1x1的正方形。
v(v1)=inf
v=v(~any(isnan(v)| isinf(v),2),:)%删除inf或nan
DT=Delaunay三角剖分(重塑X,重塑Y)
[V,R]=voronoiDiagram(DT)
sizeofR=大小(R,1)
矩形('位置',[0,0,1,1])
轴相等
xlimit=[01];
ylimit=[01];
xbox=xlimit([1 2 1]);
ybox=ylimit([1,2,1]);
%查找从图表到正方形的交点
对于j=1:长度(vxx(1,:))
直线([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;
如果~是空的(xi)
交叉(j)=席
相交(j)=yi
地块(xi,yi,'r*');
轴相等
结束
结束

我希望直线到达周界点后停止打印。

可以用交点替换直线边缘的坐标

假设直线从(x1,y1)到(x2,y2)。
检查(x1,y1)是否在矩形的边界之外。
I如果
(x11)

如果(x1,y1)在外侧,则用交点(xi,yi)替换(x1,y1)。
注意:仅当存在交点时才进行替换

我忽略了两个交点的情况,因为这种情况在您的情况下永远不会发生(在这种情况下,您需要同时替换这两个交点)

以下是经过修改的完整代码:

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
x1=6;
y1=x1;
x=图库('uniformdata',[1,x1],0);
y=画廊('uniformdata',[1,y1],1);
sizeofx=尺寸(x,2);
sizeofy=尺寸(y,2);
重塑x=重塑(x,sizeofx,1);
重塑y=重塑(y,sizeofy,1);
[vxx,vyy]=voronoi(x,y);
等等
[v,c]=voronoin([x(:)y(:));%交点矩阵
对于i=1:numel(c)
v(c{i},:);
ans=ans(~any(isnan(ans)| isinf(ans),2),:);%从多边形点删除INF或NAN
绘图(ans(:,1),ans(:,2),'b-','linewidth',2);%此代码绘制点
结束
%出于我们的测试目的,voronoi图将仅为1x1的正方形。
v(v1)=inf;
v=v(~any(isnan(v)| isinf(v),2),:);%删除inf或nan
DT=Delaunay三角剖分(重塑X,重塑Y);
[V,R]=voronoiDiagram(DT);
sizeofR=尺寸(R,1);
矩形(‘位置’,[0,0,1,1]);
轴相等
xlimit=[01];
ylimit=[01];
xbox=xlimit([1 2 1]);
ybox=ylimit([1,2,1]);
%Vxx和Vyy将成为一组新的线坐标,取代Vxx和Vyy。
Vxx=Vxx;
Vyy=Vyy;
%查找从图表到正方形的交点
对于j=1:长度(vxx(1,:))
%直线([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;
如果~是空的(xi)
交叉(j)=席;
相交(j)=yi;
地块(xi,yi,'r*','MarkerSize',10);
轴相等
%用截面点替换超出矩形的线边。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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);
%假设矩形的边界为(0,0)到(1,1)
如果你的尺寸超过了1
%将坐标[vxx(1,j),vyy(1,j)]替换为[xi,yi]。
Vxx(1,j)=席;
Vyy(1,j)=yi;
结束
如果你的尺寸超过2
%将坐标[vxx(2,j),vyy(2,j)]替换为[xi,yi]。
Vxx(2,j)=席;
Vyy(2,j)=yi;
结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
结束
%用坐标绘制直线
线([Vxx(1,j)Vxx(2,j)],[Vyy(1,j)Vyy(2,j)],“颜色”,“g”,“线宽”,“1”,“标记”,“加号”);
结束
结果:

原始绘图:

我喜欢你的方法。这真的很有帮助。是否有任何方法可以在直线接触到正方形边界时立即停止绘制?为了“从字面上停止直线绘制”,我想您需要实现自定义的线条绘制功能。从矩形内的点开始逐像素绘制线。对于每个绘制的像素,检查其是否在边界上移动,如果移动,则停止绘制。我曾经试过做[接近的事]()。必须有一个更好的例子来“逐像素”地画一条线。是否有可能使此代码对所有正方形通用,而不仅仅是1x1?是否也可以使用与正方形相交的形状更新这些形状的现有顶点数组?所有正方形:将
(x1<0)| |(y1<0)| |(x1>1)| |(y1>1)
修改为正方形角的坐标。示例:
(x1X2)| |(y1>Y2)
”是否也可以使用int形状更新这些形状的现有顶点数组