如何绘制方形渐开线
2015-09-20 17:14
183 查看
方形渐开线:
![](http://img.blog.csdn.net/20150920164809247?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
方形渐开线是指:
由一点向外扩散的方形线(博主自己总结的,如果不会欢迎评论)
具体思路:
先确定一个点坐标,之后自行决定点的起始方向。
![](http://img.blog.csdn.net/20150920165346455?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
之后,我们假设这个点的运动规则是:
上 → 右 → 下 → 左
那么,一次轮回就是四次,一次轮回就是一圈。
![](http://img.blog.csdn.net/20150920165802527?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们即可找到规律:
当方向向上的时候,移动一格
当方向向右的时候,移动一格
当方向向下的时候,移动两格
当方向向左的时候,移动两格
根据这样的规律,我们便很容易进行编码
但,如果你不注意的话,很容易结果呈现以下的样子
![](http://img.blog.csdn.net/20150920170244480?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
然而我们看到的是一片蓝色。
为什么?
相信你通过上文的Excel表可以看到原因
如果让我们把Excel表继续画下去
![](http://img.blog.csdn.net/20150920170610479?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
相信如果我没有标记数字,那么眼前的是似海水般的忧郁蓝
不要忧郁,我们试着找找原因:
很快我们就知道,是不是我们的格子没有间隔。
很好,如果有间隔的话,我们的结果会是这样的:
![](http://img.blog.csdn.net/20150920171028863?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
很好,我们很容易就可以发现一个规律:
向上移动1格,向右移动2格,向下移动3格,向左移动4格
根据这样的规律,我们很容易可以编码。效果图就在文顶处
基于Qt框架写的代码如下:
方形渐开线是指:
由一点向外扩散的方形线(博主自己总结的,如果不会欢迎评论)
具体思路:
先确定一个点坐标,之后自行决定点的起始方向。
之后,我们假设这个点的运动规则是:
上 → 右 → 下 → 左
那么,一次轮回就是四次,一次轮回就是一圈。
我们即可找到规律:
当方向向上的时候,移动一格
当方向向右的时候,移动一格
当方向向下的时候,移动两格
当方向向左的时候,移动两格
根据这样的规律,我们便很容易进行编码
但,如果你不注意的话,很容易结果呈现以下的样子
然而我们看到的是一片蓝色。
为什么?
相信你通过上文的Excel表可以看到原因
如果让我们把Excel表继续画下去
相信如果我没有标记数字,那么眼前的是似海水般的忧郁蓝
不要忧郁,我们试着找找原因:
很快我们就知道,是不是我们的格子没有间隔。
很好,如果有间隔的话,我们的结果会是这样的:
很好,我们很容易就可以发现一个规律:
向上移动1格,向右移动2格,向下移动3格,向左移动4格
根据这样的规律,我们很容易可以编码。效果图就在文顶处
基于Qt框架写的代码如下:
void Widget::paintEvent(QPaintEvent *e)
{
paint=new QPainter;
paint->begin(this);
paint->setPen(QPen(Qt::blue,15)); //设置画笔形式
paint->setBrush(QBrush(Qt::red,Qt::SolidPattern)); //设置画刷形式
//x y 是起始坐标,direct是方向,t每次画线的时候增加的步长
int x = this->width() / 2, y = this->height() / 2 , direct = 0 , t = 5;
//循环500圈
for(int i=1;i<=500;i++)
{
//每四次循环为一圈
for(int j=0;j<3;j++)
{
//判断方向
switch (direct) {
case 0:
paint->drawLine(x,y,x,y+t);
y+=t;
break;
case 1:
paint->drawLine(x,y,x+t,y);
x+= t;
break;
case 2:
paint->drawLine(x,y,x,y-t);
y-=t;
break;
case 3:
paint->drawLine(x,y,x-t,y);
x-=t;
break;
}
t += 20; //每一次画线都增加一次步长
direct = direct >= 3 ? 0 : ++direct; //重置方向
}
}
paint->end();
}
相关文章推荐
- 上千个主分片--Kagillion Shards--es横向扩展设计
- 版本控制系统(VCS→DVCS)
- The Balance 1709 (母函数 技巧(相加和相减)) 好题
- Activity,intent,bundle,请求码,结果码,服务,广播
- VBend、unload、exit sub、 end sub、close、hide的比较
- 《大道至简》第一章读后感
- 学习日志---动态规划(背包问题)
- Codeblocks的编译器配置
- Servlet读取资源文件的三种方式
- 实现顶部轮播,下部listview经典布局的两种方式
- 主分片平衡--Shard Overallocation--es横向扩展设计
- Crisis of HDU(母函数)
- 表驱动法
- 2015 ACM-ICPC 沈阳网络赛总结
- sublime安装与配置
- iOS开发笔记--UISlider的相关属性设置
- docker学习笔记(一)
- Move Zeroes——Leetcode
- tail -f log.txt命令的小技巧------观察日志log.txt的动态变化
- C++虚继承的概念