搞了这么个无聊东西,可以用来做杯垫。我想我肯定是绣十字绣的人们中C++最好的,哈哈。

另外感慨一下,上学项目用Java,找工作学习JS,最后入职做C++。语言只是个工具啊!始终没搞明白Visual Stdio上面怎么画图,于是用字符串打出来了。

#include <iostream>
#include <set>
#include <list>
#include <ctime>
#include <cstdlib>
#include <string>
#include <windows.h>
using namespace std;
//规则:从一点开始画图。每次可以从现有的点上出发,往上下左右四个方向画。但新增的点不能碰到现有的点。画布最外面留白一圈
#define random(x) (rand()%x)  //随机数
#define ROW 50  //行数
#define COL 50  //列数
#define seedX ROW/2  //初始位置,默认为中心
#define seedY COL/2
int b[ROW][COL];  //画布
struct point
{
int x;
int y;
};
struct compare  //set的排序函数
{
bool operator()(const point &p1,const point &p2)const
{
//return p1.x * COL + p1.y < p2.x * COL + p2.y;
return p1.x==p2.x ? p1.y<p2.y: p1.x<p2.x;
}
};
void init()  //初始化,全部置0
{
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
b[i][j]=0;
}
}
}
void print()  //打印画布01序列
{
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
cout<<b[i][j];
}
cout<<endl;
}
}
void printAs()  //以方块形式打印图案
{
string b2[ROW][COL];
int count = 0;
for(int i=0; i<ROW; i++)
{
for(int j=0; j<COL; j++)
{
if(b[i][j])
{
b2[i][j]="■";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xF1);
/*输出颜色说明。导入windows.h,使用SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x71)。参数中的16进制数字第一位表示背景颜色,第二位表示文字颜色,代码含义为
0 = 黑色       8 = 灰色
1 = 蓝色       9 = 淡蓝色
2 = 绿色       A = 淡绿色
3 = 湖蓝色       B = 淡浅绿
4 = 红色       C = 淡红色
5 = 紫色       D = 淡紫色
6 = 黄色       E = 淡黄色
7 = 白色       F = 亮白色
如果背景为“白色”,会显示cmd默认的颜色
*/
count++;
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xF9);
b2[i][j]="□";
}
cout<<b2[i][j];
}
cout<<count<<endl;
}
}
void print(set<point,compare> pl)  //测试函数,打印set中的值
{
set<point,compare>::iterator iter = pl.begin();
for(; iter!=pl.end(); iter++)
{
cout<<iter->x<<","<<iter->y<<" - ";
}
cout<<endl;
}
bool isNext(int x, int y, char dir) //判断某个位置是不是可以画下一笔
{
if(0<x && ROW-1>x && 0<y && COL-1>y)
{
int temp = 0;
switch(dir)
{
case 'U':
{   temp = b[x-1][y-1]+b[x-1][y]+b[x-1][y+1]+b[x][y-1]+b[x][y]+b[x][y+1];
break;
}
case 'D':
{
temp = b[x][y-1]+b[x][y]+b[x][y+1]+b[x+1][y-1]+b[x+1][y]+b[x+1][y+1];
break;
}
case 'L':
{
temp = b[x-1][y-1]+b[x-1][y]+b[x][y-1]+b[x][y]+b[x+1][y-1]+b[x+1][y];
break;
}
case 'R':
{
temp = b[x-1][y]+b[x-1][y+1]+b[x][y]+b[x][y+1]+b[x+1][y]+b[x+1][y+1];
break;
}
}
if(temp==0)
return true;
}
return false;
}
void findAndErase(point p, set<point,compare> &nextSet)  //新添加点之后,删除候选列表中不能继续画的点
{
set<point,compare>::iterator iterErase;
iterErase = nextSet.find(p);
if(iterErase != nextSet.end())
{
nextSet.erase(iterErase);
}
}
void setNextSet(point seed, set<point,compare> &nextSet) //设置候选列表
{
int x = seed.x;//x为行,y为列
int y = seed.y;
point p;
p.x = x-1;
p.y = y;
if(isNext(x-1,y,'U'))
{
nextSet.insert(p);
}
else
{
findAndErase(p,nextSet);
}
p.x = x+1;
p.y = y;
if(isNext(x+1,y,'D'))
{
nextSet.insert(p);
}
else
{
findAndErase(p,nextSet);
}
p.x = x;
p.y = y-1;
if(isNext(x,y-1,'L'))
{
nextSet.insert(p);
}
else
{
findAndErase(p,nextSet);
}
p.x = x;
p.y = y+1;
if(isNext(x,y+1,'R'))
{
nextSet.insert(p);
}
else
{
findAndErase(p,nextSet);
}
p.x = x-1;
p.y = y-1;
findAndErase(p,nextSet);  //角上相邻的
p.x = x+1;
p.y = y-1;
findAndErase(p,nextSet);
p.x = x-1;
p.y = y+1;
findAndErase(p,nextSet);
p.x = x+1;
p.y = y+1;
findAndErase(p,nextSet);
}
//通过随机数获取下一步的位置。种子在main中生成
set<point,compare>::iterator getNextIter(set<point,compare> &nextSet)
{
int count = nextSet.size();
set<point,compare>::iterator iterNext = nextSet.begin();
int pos = int(random(count));
for(int i = 0; i<pos; i++)
{
iterNext++;
}
return iterNext;
}
//画下一格:从候选里面选出一个;更改b的值;判断它四个正方向的候选,如果是候选加入,不是候选尝试查找删除;判断它四个斜方向,从候选列表删除。
void darwNext(set<point,compare> &nextSet)
{
set<point,compare>::iterator iterNext;
iterNext = getNextIter(nextSet);
point next;
next.x = iterNext->x;
next.y = iterNext->y;
b[next.x][next.y]=1;
nextSet.erase(iterNext);
setNextSet(next, nextSet);
}
void generate()  //采用默认seed生成
{
b[seedX][seedY]=1;
set<point,compare> nextSet;
point seed;
seed.x = seedX;
seed.y = seedY;
setNextSet(seed,nextSet);
while(!nextSet.empty())
{
darwNext(nextSet);
}
}
void main()
{
init();
srand(unsigned(time(0)));
generate();
printAs();
}

画出来的图形效果(每次运行画的都不一样哦!)

C++生成的线性十字绣图案相关推荐

  1. C++生成十字绣图案(二) 面向对象

    基本的十字绣线性生成中提供了判断下一步可以画的位置并且逐步生成的函数.以这些基本函数为基础,可以进行更多变化的图案设计. 为了方便的扩展,可以把线性生成写成一个类,以后的修改继承这个类. 头文件Bas ...

  2. 利用微软平台生成报表,线性图,柱形图

    说来惭愧,以前的工作中一直借助第三方dll进行报表制作,比如线性图,柱形图. 因为现在工作的这家公司不允许随便引入第三方dll,听同事说起可以建rdl类型文件进行引入到winform窗体中,窗体上使用 ...

  3. Arduino开发板点阵Led屏自动生成想要的图案教程--附【PCtoLCD】字模生成软件

    第一步:确保点阵屏与Arduino正确连接 首先点阵屏幕一定要正确连接上Arduino开发板,并通过上传代码,能够正确点亮Led屏幕. 第二步:用自动生成字模软件生成字模 在点阵屏显示文字教程的代码中 ...

  4. Java 控制台生成标题大字母图案

    去这个网址生成 http://patorjk.com/software/taag/ 点击

  5. 无理数,用于图案自动生成

    图案的自动生成,不仅能为工艺设计.建筑设计.镭射线条提供资源,还能为加密.结构光设计等方面提供更多的方案.由于研究视觉算法需要,产品中要识别各种曲线,也要在仿真中生成各种曲线.在中学学习阶段,大家都学 ...

  6. CSS 背景色 背景图片 渐变背景 - 重复线性渐变 background-image: repeating-linear-gradient()

    repeating-linear-gradient() 用来生成重复的线性渐变图案 基础语法 background-image: repeating-linear-gradient(angleValu ...

  7. c语言如何判断数据是否符合正态分布_如何判断机器学习数据集是否是线性的?...

    首先,线性和非线性函数之间的区别: (左)线性函数(右)非线性函数 线性函数:可以简单定义为始终遵循以下原则的函数: 输入/输出=常数. 线性方程总是1次多项式(例如x+2y+3=0).在二维情况下, ...

  8. 在VC++中生成伪随机数祥解

    摘 要 伪随机数在计算机软件设计中有很广泛的用途.本文介绍了基于数学方法的利用计算机产生伪随机数的一种方法,即线性同余法,任何伪随机数的产生都是运用递推的原理来生成的.以及在Visual C++环境中 ...

  9. 基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能

    NextQRCode ZXing开源库的精简版 **基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能 原文博客 附源码下载地址** 与原ZXingMini项目对比 N ...

最新文章

  1. Android merge 标签 显示错乱
  2. Spring与Struts1的集成
  3. 利用pip3 install --upgrade批量更新已过期的python库
  4. 怎么回事?在测量时仪器数值不稳
  5. 23种设计模式C++源码与UML实现--装饰者模式
  6. ELK学习3_使用redis+logstash+elasticsearch+kibana快速搭建日志平台
  7. 基于EM的多直线拟合实现及思考
  8. SpringMVC的请求-获得请求参数-获得请求头信息
  9. 虚拟机vmnet8每次都要先禁用再启用_【零成本 amp; 超详细】使用Win10自带的Hyper-V管理工具搭建虚拟机...
  10. Managing Gigabytes--文本压缩
  11. python识别图片上的文字_Python如何识别图片中的文字 【转】
  12. python判断密码强度并输出_密码强度判断
  13. git 上传修改文件
  14. Symantec Backup Exec 2014 备份Exchange 2013之四设备初始化
  15. 简单理解javascript中的原型对象,实现对之间共享属性和行为
  16. java quic kcptun_Server-网络加速Kcptun
  17. NOI OJ 1.3 13:反向输出一个三位数 C语言
  18. Comdo安全防火墙
  19. LOL英雄联盟代打外挂程序-java实现
  20. 六年级计算机信息技术教案反思,小学六年级信息技术教学反思.doc

热门文章

  1. Android仿超级课程表的课程界面设计
  2. Abb工业机器人,用函数测出两点间的距离
  3. 于殿泓 图像检测与处理技术_图像检测与处理技术(21世纪高等学校仪器仪表及自动化类专业规划教材)...
  4. 类 ArrayList<E>
  5. 2015.4.10学习mybatis
  6. 解决C++的错误: stray ‘\243‘ in program
  7. Photoshop 文字特效
  8. 关于公网对讲平台的那点事
  9. 5g智慧灯杆网关充电桩系统的应用案例
  10. 奈何本人没文化,一句卧槽行天下