任意正六边形随机撒点

是通信仿真里经常用到的,无奈网上资料很少,参照http://www.ilovematlab.cn/thread-136761-1-1.html,我又苦思敏想里一下午,这个问题才得以完美解决。废话不多说了,先来看看怎么画正六边形。

theta =

linspace(0,2*pi,7);

plot(cos(theta),sin(theta),'g-');

两句代码就可以画出一个正六边形了,其中第一句也可以这样写:N=6;

theta = 0:2*pi/N:2*pi;

效果是一样的,无非是通过【cos(theta),sin(theta)】计算出七个点,将这七个点首尾依次相连,画出六条边。

如下图所示:

这个正六边形有点小特殊,它的中心在坐标轴的原点(0,0)处,边长d=1.网上还有另外一种画正六边的方法,是通过给顶中心O和边长d来计算出每个顶点的位置,用一个for循环画六次,相当麻烦,我未采用。但这种两句话画出的正六边形相当特殊,不能满足使用需要,用这种计算cos、sin得到点坐标的画法,网上再无资料了,怎么用这种画法画出任意中心O,边长d的正六变形呢?先来看我们把边长弄为d。首先看下面的图:

当边长为1时,正六边形最右边的点C坐标为(cos(0),sin(0)),也就是(1,0),当边长为d时C的坐标变成(d,0),通过计算不难发现A点的坐标变成(d/2,

根号3 *d),也就是(d*cos(theta),

d*sin(theta))。所以画出边长为d的正六边形程序改为:

N=6;

theta = 0:2*pi/N:2*pi;

D=1;

plot(D*cos(theta),D*sin(theta),'g-');就可以了,D是边长。假设我们的正六边形中心点P(x,y),而现在的中心在坐标原点O(0,0),两者构成一个向量PO(x,y)。所谓的d*cos(theta),d*sin(theta)算的其实就是六个顶点的坐标,将这些坐标按向量PO平移,得到平移后的6个顶点坐标为:d*cos(theta)+x,

d*sin(theta)+y。因此画出边长为D,中心坐标为P(X,Y)的正六边形,程序可以这样写:

theta = linspace(0,2*pi,7);

D=2; %边长

X=1;  %中心横坐标

Y=2;  %中心纵坐标

plot(Dcos(theta)+X,D*sin(theta) + Y,'g-');这远比那个for循环来循环去的方法简单吧!

随机撒点问题:

首先看这里是往咱们画的第一个正六边形里撒一百个随机点的程序:

%%

theta =

linspace(0,2*pi,7);

plot(cos(theta),sin(theta),'g-');

axis square

i = 0;

while i <

100

x = 2*rand(1,2)-1;

if (abs(x(1)) + abs(x(2))/sqrt(3) )

<= 1 && abs(x(2)) <=

sqrt(3)/2

i = i+1;

hold on

plot(x(1),x(2),'r*');

end

end

hold off这里i是撒点的个数。我们要彻底搞懂这个程序。我们先将这个程序扩展为边长为d的情况。x

= 2*rand(1,2)-1;这句话是为了将随机点的横纵坐标锁定在[-1,

1](这是正六变形的最左点和最右点),当边长为d时,这句话变为:x

= 2*d*rand(1,2)-d

最让人蛋疼的是if (abs(x(1)) +

abs(x(2))/sqrt(3) ) <= 1 && abs(x(2)) <= sqrt(3)/2

这句话,足足让我想了一个下午!显然这是为了给随机点加限制,保证随机点在正六边形内。这里x(1)是横坐标,x(2)是纵坐标。abs(x(2))

<= sqrt(3)/2,先看这句。在第一象限内,随机点纵坐标的值应该小于第二个图中AB的距离,当边长为d,而AB的最大值 =

d*sqrt(3)/2.

另外一个条件abs(x(1)) + abs(x(2))/sqrt(3) ) <=

1。我们这样想,随机点最边界的情况就是在正六边形的边上,在第一象限为例,当随机点在边AC上时,OB+BC=1,为了和随机点的横纵坐标联系起来,这么写:OB

+ AB/tan(60) = 1, 边长为d时,边长OB + AB/tan(60) = d,所以临界条件是:OB +

AB/tan(60)  <=  d.

假设中心点坐标为P(x,y),则随机点的坐标也要平移。平移后的坐标变成x(1) + x,

x(2) +

y,至此大功告成!最终的程序如下,如果需要连续在多个正六边形随机撒点,则要多次调用x = 2*D*rand(1,2)-1*D;

if (abs(x(1)) + abs(x(2))/sqrt(3) ) <= D && abs(x(2))

<=

D*sqrt(3)/2 ,这样就能保证每次撒的随机点一定是随机的,且相互无影响。

大家可以根据需要把程序封装成函数调用:

%%

theta = linspace(0,2*pi,7);

D=2; %边长

X=1;  %中心横坐标

Y=2;  %中心纵坐标

plot(D*cos(theta)+X,D*sin(theta) +

Y,'g-');

axis square

i = 0;

while i < 3

x =

2*D*rand(1,2)-1*D;

if (abs(x(1)) + abs(x(2))/sqrt(3) ) <= D && abs(x(2))

<= D*sqrt(3)/2

i = i+1;

hold on

plot(x(1) + X, x(2) + Y,'r*');  end

end

hold off

上面程序画出的图:

这里我们先找到边长为D,中心在(0, 0)时的撒出的随机点,然后通过向量平移plot(x(1) +

X, x(2) + Y,'r*')画出中心在(X, Y)时的随机点,

哈哈,高一学的数学还真是有用啊!计算那个不等式关系好像是初三几何里,怀念我的老师们 和 那段难忘的日子!

matlab坐标画正六边形,Matlab任意正六边形随机撒点实现相关推荐

  1. matlab如何画波特图,matlab画波特图

    Matlab 中 Bode 图的绘制技巧 学术收藏 2010-06-04 21:21:48 阅读 54 评论 0 字号:大中小 订阅 我们经常会遇到使用 Matlab 画伯德图的情况,可能我们我们都. ...

  2. matlab怎么画x 1,matlab画出y=1 (x 1)的函数曲线

    请matlab高手教教 matlab编写一段程序,画出函数y=x^3*e^(-x^2),-1 clearx=-1:0.01:1;y=(x.^3).*exp(-x.^2);plot(x,y);title ...

  3. matlab fft画频谱图,matlab 用 fft画频谱

    matlab 用 fft画频谱 关注:193  答案:2  手机版 解决时间 2021-01-19 14:14 提问者挥映在沉默里的渲染 2021-01-18 18:27 在这样一段程序中 clear ...

  4. matlab表示函数波形,matlab如何画冲激函数波形 matlab画冲激函数波形的方法

    今天给大家带来matlab如何画冲激函数波形,matlab画冲激函数波形的方法,让您轻松解决问题.        在学习理工科的过程中, matlab软件的使用是一个不可或缺的过程.对于初学者来说,学 ...

  5. matlab给定坐标画卫星轨道,Matlab仿真实例-卫星轨迹

    卫星轨迹 一.问题提出 设卫星在空中运行的运动方程为: 其中是k 重力系数(k=401408km3/s).卫星轨道采用极坐标表示,通过仿真,研究发射速度对卫星轨道的影响.实验将作出卫星在地球表面(r= ...

  6. matlab如何画一个圆柱,matlab下在空间任意位置绘制圆柱

    参考链接:https://blog.csdn.net/weixin_44492796/article/details/88583536 绘制圆柱需要提供上底面和下底面的圆心的绝对坐标.以及半径.通过得 ...

  7. matlab如何画一个圆柱,matlab怎么画圆柱

    用Matlab 画函数图像一.螺旋线 1.静态螺旋线 a=0:0.1:20*pi... 例 在区间[0,2π]画sin(x),并分别标注"sin(x)""cos(x)&q ...

  8. matlab 传递函数 画出频率响应,MATLAB环境下频率响应曲线的绘制方法

    matlab的使用啊 黄伟,聂 东 , 陈英俊 (广东肇庆学院电子信息工程系,肇庆526061) 摘要:本文给出了MATLAB环境下线性系统的Bode图.Nyquist图.Nichoh图的绘制方法,为 ...

  9. matlab坐标旋转平移缩放,MATLAB实现RGB图像的平移、缩放和旋转

    Func的1 2 3分别对应平移.旋转.缩放功能 function []=transition(func,I) if func==1 delta_x=str2double(inputdlg('请输入向 ...

最新文章

  1. window 服务器不稳定,服务器Windows系统突发情况的解决办法
  2. python核心数据类型_Python核心数据类型——字符串
  3. vs2013 qt5.1出现“无法找到源文件ui.xxx.h”解决办法详细步骤
  4. 【iOS系列】-iOS中内存管理
  5. 分享 | 开源的中文语音识别系统
  6. Java中几种高性能的队列
  7. 因在Java中不会优雅地判空,被CTO屌的快哭了。。。
  8. 【网络技术题库整理4】IP地址规划技术
  9. andriod studio 自带模拟器设置开发者模式
  10. Mysql查询不为null值和字段为null 阿星小栈
  11. OCR:ECCV 2020 论文了解
  12. 「 iOS知识小集 」2018 · 第 35 期
  13. Unresolved defparam reference to 'read_aclr_synch' in dcfifo_component.read_aclr_synch
  14. 爱莫科技升级KISS人工智能算法平台,更好赋能实体零售
  15. STC11F04E——电子工艺实习
  16. MySQL 8.0.12安装教程(windows 64位)
  17. M-03-01.[紫猫·界面]静态界面
  18. 前端 各种API网站,教程网站,素材网站,工具网站,非常好用
  19. Practical Webix 免积分下载
  20. 虚拟主机使用phpmailer发送邮件

热门文章

  1. php json_decode 转义,关于​PHP json_decode中文转义的问题
  2. 萌新学习C++容易漏掉的知识点看看你中招了没有(二)
  3. 触宝助手与微信各取所需合作共赢
  4. prepareStatement用法
  5. Macbook Pro屏幕闪烁的解决办法
  6. 百度域名解析API+python实现百度云DDNS功能绑定动态公网ip
  7. ES6 语法 之 let、const、模板字符串、箭头函数
  8. 汽车电子行业入门指南「人类的出行发展史」
  9. 岁月温柔-22 妈妈转到省医院第3天 综合科icu医生的劝诫
  10. 当AI成为专家,要警惕话语权威的力量