用MATLAB一直画直线竟然得到了简单的禅绕画,论一直画直线的人有多无聊

之前看过一个视频,有个人把纸面分割成一个一个三角后一直画直线,慢慢的图纸上的图案变得复杂了起来,大概是像下面这样:

在这里插入图片描述

在这里插入图片描述
上面这个图便是我用matlab模拟的效果,过程很简单,就是用了泊松云盘采点构建三角网格,之后一直在三角型内部画直线即可,

泊松云盘采点可以看一下图片三角化那篇:
MATLAB 图片三角风格化(low poly)

三角型画线可以参照一下这一篇:
matlab 旋转的三角形

参数说明
  • rows=560; 画布高度
  • cols=750; 画布宽度
  • r=min([rows,cols])./6; 两点之间距离
  • LW=1.2; 线条初始粗细
  • k1=1/8; 取三角型一顶点及另外两点连线1/8处两点做新的连线
  • k2=0.8; 线条变细的速度
  • t=20; 每个三角型内画3*t个线条

例如将参数r改为r=min([rows,cols])./3;则得到下图:
在这里插入图片描述

完整代码
function tris
rows=560;
cols=750;
r=min([rows,cols])./6;
LW=1.2;
k1=1/8;
k2=0.8;
t=20;


fig=figure('units','pixels',...
        'position',[20 60 (cols+1) (rows+1)],...
        'Color',[1 1 1]);
ax=axes('Units','pixels',...
        'parent',fig,...  
        'Color',[1 1 1],...
        'Position',[0 0 (cols+1) (rows+1)],...
        'XLim',[-1 cols+1],...
        'YLim',[-1 rows+1],...
        'XColor','none',...
        'YColor','none');
hold(ax,'on')
bkgMat=ones([rows,cols]);
bkgMat(2:(rows-1),2:(cols-1))=0;
bkgMat(1,cols)=0;bkgMat(1,1)=0;bkgMat(rows,1)=0;bkgMat(rows,cols)=0;
[edgeX,edgeY]=find(bkgMat==1);
edgePntList=[edgeY,edgeX];

edgePntList=poissonEdge(rows,cols,edgePntList,r);
pntList=poissonDisk(rows,cols,r,30,edgePntList);
DT=delaunay(pntList(:,1),pntList(:,2));
triplot(DT,pntList(:,1),pntList(:,2),'Color',[0,0,0],'Linewidth',LW);
pause(0.1)

for k=1:size(DT,1)
    A=pntList(DT(k,1),:);
    B=pntList(DT(k,2),:);
    C=pntList(DT(k,3),:);
    drawABC(A,B,C,LW,k1,k2,t)
end

%==========================================================================
    function resultSet=poissonEdge(m,n,edgeList,R)
        preSet=edgeList;
        resultSet=[1,1;n,m;1,m;n,1];
        
        times=0;
        while times<150
            tempPos=randi([1,size(preSet,1)],1);
            selectedPnt=preSet(tempPos,:);
            dis=sqrt(sum((edgeList-selectedPnt).^2,2));
            candidate=dis>=R&dis<=2*R;
            pntSet=edgeList(candidate,:);
            flag=0;
            for j=1:size(pntSet,1)
                pnt=pntSet(j,:);
                dis=sqrt(sum((resultSet-pnt).^2,2));
                if all(dis>=R)
                    resultSet=[resultSet;pnt];
                    preSet=[preSet;pnt];
                    flag=1;
                end
            end
            if flag==1
                preSet(tempPos,:)=[];times=0;
            else
                times=times+1;
            end 
        end
    end

    function resultSet=poissonDisk(m,n,r,K,edgePntList)
        preSet=edgePntList;
        resultSet=edgePntList;
        
        times=0;
        while times<500
            tempPos=randi([1,size(preSet,1)],1);
            selectedPnt=preSet(tempPos,:);
            theta=rand(K,1).*2*pi;
            radius=rand(K,1).*r+r;
            x=radius.*cos(theta)+selectedPnt(1);
            y=radius.*sin(theta)+selectedPnt(2);
            
            flag=0;
            for j=1:K
                pnt=[x(j),y(j)];
                if pnt(1)>=1&&pnt(2)>=1&&pnt(1)<=n&&pnt(2)<=m
                    if size(resultSet,1)==0
                        resultSet=[resultSet;pnt];
                        preSet=[preSet;pnt];
                        flag=1;
                    else
                        dis=sqrt(sum((resultSet-pnt).^2,2));
                        if all(dis>=r)
                            resultSet=[resultSet;pnt];
                            preSet=[preSet;pnt];
                            flag=1;   
                        end
                    end 
                end
            end
            if flag==1
                preSet(tempPos,:)=[];times=0;
            else
                times=times+1;
            end
        end    
    end

    function drawABC(A,B,C,LW,k1,k2,times)
        for i=1:times
            b=k1*(C-B)+B;plot([A(1);b(1)],[A(2);b(2)],'color',[0,0,0],'Linewidth',LW);B=b;
            pause(0.001)
            c=k1*(A-C)+C;plot([B(1);c(1)],[B(2);c(2)],'color',[0,0,0],'Linewidth',LW);C=c;
            pause(0.001)
            a=k1*(B-A)+A;plot([C(1);a(1)],[C(2);a(2)],'color',[0,0,0],'Linewidth',LW);A=a;
            pause(0.001)
            LW=LW*k2;
        end
    end

end
  • 35
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

slandarer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值