声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

声振论坛 展示 行业应用 土木工程 查看内容

【分享】随机圆生成程序

2012-9-11 10:37| 发布者: aspen| 查看: 1945| 评论: 0|原作者: funi|来自: 声振论坛

摘要: clear clc format compact %depth画图范围,radi为圆的半径,number对应各种半径的圆的数量 . depth=10 radi=0.8:-0.1:0.1 number=8:-1:1 %产生画第一批最大的圆 xxold= yyold= =huacirstart(depth,nu ...
  1. clear
  2. clc
  3. format compact
  4. %depth画图范围,radi为圆的半径,number对应各种半径的圆的数量 .
  5. depth=10
  6. radi=0.8:-0.1:0.1
  7. number=8:-1:1
  8. %产生画第一批最大的圆
  9. xxold=[]
  10. yyold=[]
  11. [x,y]=huacirstart(depth,number(1),radi(1),xxold,yyold)
  12. xxold=x
  13. yyold=y
  14. %产生第二批圆及以后的圆
  15. for i=2:length(radi)
  16.     radrawn=radi(1:i-1)
  17.     numberdrawn=number(1:i-1)
  18.     [x,y]=huacir(depth,number(i),radi(i),xxold,yyold,radrawn,numberdrawn)
  19.     xxold=x
  20.     yyold=y
  21. end
  22. %改变画圆的方法
  23. aa=[]
  24. for i=1:length(radi)
  25. aa=[aa ones(1,number(i))*radi(i)]
  26. end
  27. for i=1:length(aa)
  28. rectangle('position',[x(i)-aa(i),y(i)-aa(i),2*aa(i),2*aa(i)],'curvature',[1,1],'facecolor','b')
  29. axis([0,depth,0,depth])
  30. grid
  31. hold on
  32. end
复制代码
  1. %开始画第一批最大的圆的方法
  2. function [xxnew,yynew]=huacirstart(depth,number,radi,xxold,yyold)
  3. xxlen=length(xxold)
  4. yylen=length(yyold)
  5. xxold(xxlen+1)=radi+(depth-2*radi)*rand
  6. yyold(yylen+1)=radi+(depth-2*radi)*rand
  7. for i=2:number
  8.      while 1
  9.         xxold(xxlen+i)=radi+(depth-2*radi)*rand
  10.         yyold(yylen+i)=radi+(depth-2*radi)*rand
  11.         for j=1:xxlen+i-1
  12.             distance(j)=((xxold(xxlen+i)-xxold(j))^2+(yyold(yylen+i)-yyold(j))^2)^0.5
  13.         end
  14.         judg=distance-2*radi
  15.        if judg>0
  16.        break
  17.         end
  18.      end
  19. end
  20. xxnew=xxold
  21. yynew=yyold
复制代码
  1. %画第二批及以后的圆的方法
  2. function [xxnew,yynew]=huacir(depth,number,radi,xxold,yyold,radrawn,numberdrawn)
  3. xxlen=length(xxold)
  4. yylen=length(yyold)
  5. for i=1:number
  6.      while 1
  7.         xxold(xxlen+i)=radi+(depth-2*radi)*rand
  8.         yyold(yylen+i)=radi+(depth-2*radi)*rand
  9.         for j=1:xxlen+i-1
  10.             distance(j)=((xxold(xxlen+i)-xxold(j))^2+(yyold(yylen+i)-yyold(j))^2)^0.5
  11.         end
  12.         %产生对比的矩阵
  13.           aa=[]
  14.           for I=1:length(radrawn)
  15.           aa=[aa ones(1,numberdrawn(I))*radrawn(I)]
  16.            end
  17.           aa=[aa ones(1,i-1)*radi]
  18.           aa=aa+radi
  19.          judg=distance-aa
  20.        if all(judg>0)
  21.        break
  22.        end
  23.      end
  24. end
  25. xxnew=xxold
  26. yynew=yyold
复制代码

本文内容由 funi 提供

最新评论

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-4-20 18:30 , Processed in 0.053746 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部