C# 绘图及古诗填字

news2024/11/28 22:52:49

绘图

绘图的结果如下:

绘图部分主要使用了 Bitmap、Graphics 

具体的函数是 MakeMap

入参说明

string bg : 背景图
Rectangle rect :绘图区域
int row_count :行数
int col_count :列数
string fn :保存到的文件

代码如下:

        public void MakeMap(string bg ,Rectangle rect ,int row_count,int col_count ,string fn)
        {
            Bitmap bmp = new Bitmap(bg);
            Graphics g = Graphics.FromImage(bmp);           

            SHIUtils u = new SHIUtils();
            u.init_data(data);
            
            int line_w = 1;
            int cell_w = (rect.Width - line_w*(col_count+1)) / col_count;
            int cell_h = (rect.Height - line_w * (row_count + 1)) / row_count;

            int w = line_w * (col_count + 1) + cell_w * col_count;
            int h = line_w * (row_count + 1) + cell_h * row_count;
            int x0 = rect.X + (rect.Width - w) / 2;
            int y0 = rect.Y + (rect.Height - h ) / 2;

            Pen pen = new Pen(Color.FromArgb(196, 196, 196));
            for (int col = 0; col <= col_count; col++)
            {
                int x = x0 + (line_w + cell_w) * col;
                g.DrawLine(pen, x, y0, x, y0 + h - line_w);
            }
            for (int row = 0; row <= row_count; row++)
            {
                int y = y0 + (line_w + cell_h) * row;
                g.DrawLine(pen, x0, y, x0 + w - line_w, y);
            }

            // g.SmoothingMode = SmoothingMode.HighQuality;
            g.TextRenderingHint = TextRenderingHint.AntiAlias;
            Font font = new Font("汉呈波波浓墨行楷", cell_w*90/100, FontStyle.Regular);
            SolidBrush brush = new SolidBrush(Color.Black);
            SolidBrush brush_cell = new SolidBrush(Color.FromArgb(225, 225, 225));
            StringFormat sf = new StringFormat();
            SHIMap map = u.make_map(col_count, row_count);
            for (int col = 0; col < col_count; col++)
                for (int row = 0; row < row_count; row++)
                {
                    MapHole cell= map.map[col, row];
                    if (cell.chr != ' ')
                    {
                        int x = x0 + (line_w + cell_w) * col + line_w;
                        int y = y0 + (line_w + cell_h) * row + line_w;
                        g.FillRectangle(brush_cell, new Rectangle(x , y , cell_w  , cell_h));
                        string s = cell.chr.ToString();
                        if (cell.sentence_list.Count == 2)
                            s = "?";
                        sf.Alignment = StringAlignment.Center;
                        sf.LineAlignment = StringAlignment.Center;
                        g.DrawString(s, font, brush, new Rectangle(x, y, cell_w, cell_h), sf);
                    } 
                }            

            g.Dispose(); 
            bmp.Save(fn, ImageFormat.Png);
            bmp.Dispose();
        }

 古诗填字

绘图的内容由SHIUtils生成。

SHIMap map = u.make_map(col_count, row_count);

 函数中使用了随机数,每次调用生成的内容都不一样,具体的代码如下:

 public class SHIUtils
    {
        public static Char Char_comma = ',';
        public static Char Char_period = '。';
        public static Char Char_period_1 = '!';
        public static Char Char_period_2 = '?';
        public static Char Char_period_3 = '、';
        public static Char Char_period_4 = ';';
        public static Char Char_period_5 = ':';
        public static Char Char_period_6 = '\r';
        public static Char Char_period_7 = '\n';
        public Random rd = new Random(Guid.NewGuid().GetHashCode());
        public void clear()
        {

        }
        private SHIData _data = null;
        private Dictionary<char, int> _char_dict = new Dictionary<char, int>();
        private Dictionary<int, SHI> _shi_dict = new Dictionary<int, SHI>();
        private Dictionary<int,  Sentence> _sentence_dict= new Dictionary<int, Sentence>();
        private Dictionary<char, Dictionary<int, Sentence>> _sentence_index = new Dictionary<char, Dictionary<int, Sentence>>();
        private Dictionary<char, List<Sentence>> _sentence_index_list = new Dictionary<char, List< Sentence>>();
        private Dictionary<int, Dictionary<int, Sentence>> _sentence_index_len = new Dictionary<int, Dictionary<int, Sentence>>();
        private Dictionary<int, List< Sentence>> _sentence_index_len_list = new Dictionary<int, List<Sentence>>();
        public Dictionary<int, List<Sentence>> get_sentence_index_len_list()
        {
            return _sentence_index_len_list;
        }
        public Dictionary<int, SHI> get_shi_dict()
        {
            return _shi_dict;
        }
        private void do_init()
        {
            clear();
            make_char_dict();
            make_sentence_list();
        }
        private void make_char_dict()
        {
            _char_dict.Clear();
            foreach (SHI i in _data.Items)
            {
                foreach (Char ch in i.contson)
                {
                    if (_char_dict.ContainsKey(ch))
                        continue;
                    _char_dict[ch] = _char_dict.Count;
                }
            }
        }
        private void make_sentence_list()
        {
            _shi_dict.Clear();
            _sentence_dict.Clear();
            _sentence_index.Clear();
            _sentence_index_list.Clear();
            _sentence_index_len.Clear();
            _sentence_index_len_list.Clear();
            foreach (SHI i in _data.Items)
            {
                _shi_dict[i.id] = i;
                Sentence s = null;
                int idx = 0;
                foreach (Char ch in i.contson)
                {
                    if (ch == '\r')
                        continue;
                    if (ch == '\n')
                        continue;
                    if (s == null)
                    {
                        s = new Sentence();
                        s.shi_id = i.id;
                        s.idx = idx;
                        s.id = s.shi_id * 1000 + idx;
                        idx++;
                        _sentence_dict[s.id]=s;
                    }

                    if ((ch == Char_comma) || (ch == Char_period) || (ch == Char_period_1) || (ch == Char_period_2) || (ch == Char_period_3) || (ch == Char_period_4)||(ch==Char_period_5) || (ch == Char_period_6) || (ch == Char_period_7))
                    {
                        s.chr_end = ch;
                        foreach (Char ch_s in s.chrlist)
                        {
                            Dictionary<int, Sentence> ls = null;
                            if (!_sentence_index.TryGetValue(ch_s,out ls))
                            {
                                ls = new Dictionary<int, Sentence>();
                                _sentence_index[ch_s] = ls;
                            }
                            if (! ls.ContainsKey(s.id))
                                ls[s.id] =s;
                        }
                        {
                            Dictionary<int, Sentence> ls = null;
                            if (!_sentence_index_len.TryGetValue(s.chrlist.Count,out ls))
                            {
                                ls = new Dictionary<int, Sentence>();
                                _sentence_index_len[s.chrlist.Count] = ls;                               
                            }
                            if (!ls.ContainsKey(s.id))
                            {
                                ls[s.id] = s;
                            }
                        }
                        s = null;
                    }
                    else
                    {
                        s.chrlist.Add(ch);
                        s.txt = s.txt + ch;
                    }
                }
            }

            foreach(KeyValuePair<int, Dictionary<int, Sentence>> kv in _sentence_index_len)
            {
                List<Sentence> ls = new List<Sentence>();
                _sentence_index_len_list[kv.Key] = ls;
                foreach (KeyValuePair<int, Sentence> kv2 in kv.Value)
                {
                    ls.Add(kv2.Value);
                }
            }
            foreach (KeyValuePair<Char, Dictionary<int, Sentence>> kv in _sentence_index)
            {
                List<Sentence> ls = new List<Sentence>();
                _sentence_index_list[kv.Key] = ls;
                foreach (KeyValuePair<int, Sentence> kv2 in kv.Value)
                {
                    ls.Add(kv2.Value);
                }
            }
        }
        public void init_data(SHIData data)
        {

            _data = data;
            do_init();
        }
        public void load()
        {

        }
        public Sentence get_sentence_rand_by_len(int len)
        {
            List<Sentence> ls = new List<Sentence>();
            if (_sentence_index_len_list.TryGetValue(len, out ls))
            {
                int i = rd.Next(ls.Count);
                return ls[i];
            }
            else
            {
                return null;
            }
        }
        private int fill_map_with_hole_list(SHIMap sm,List<MapHole> hole_list ,int step)
        {
            int c = 0;
            foreach (MapHole hole in hole_list )
            {
                Char ch = hole.chr;
                List<Sentence> ls = null;
               
                if ( _sentence_index_list.TryGetValue(ch,out ls))
                {
                    int idx_0 = rd.Next(ls.Count);
                    for (int i=0;i<ls.Count-1;i++)
                    {
                        int idx = (i + idx_0) % (ls.Count);
                        Sentence s = ls[idx]; 
                        if (s.chrlist.Count < _data.min_s_chr_cnt)
                            continue;
                        if (sm.sentence_list.ContainsKey(s.txt))
                            continue;
                        int pos = s.chrlist.IndexOf(ch);
                        if (pos>=0)
                        {
                            if ((i % 2) == 0)
                            {
                                int x1 = hole.x - pos;
                                int y1 = hole.y;
                                if (sm.can_fill_horizontal(s, x1, y1))
                                {
                                    sm.fill_horizontal(s, x1, y1, step);
                                    c++;
                                }
                            } else
                            {
                                int x1 = hole.x ;
                                int y1 = hole.y - pos;
                                if (sm.can_fill_vertical(s, x1, y1))
                                {
                                    sm.fill_vertical(s, x1, y1, step);
                                    c++;
                                }
                            }
                        }

                    }
                }
            }
            return c;

        }
        private void fill_map(SHIMap sm)
        {            
            Sentence s0 = get_sentence_rand_by_len(7);
            if (s0==null)
                s0 = get_sentence_rand_by_len(5);
            if (s0 == null)
                s0 = get_sentence_rand_by_len(4);
            int x0 = (sm.width - s0.chrlist.Count) / 2;
             int y0 = (sm.height - 2) / 2;
           //   int x0 = 0;
           //  int y0 = 0;

            if (!sm.can_fill_horizontal(s0, x0, y0))
                return;
            sm.fill_horizontal(s0, x0, y0, 1);
            for (int step=2; step < 1000; step++)
            {
                int c = 0;
                for (int i = sm.step_list.Count-1;i>=0;i--)
                {
                    if (i <= sm.step_list[i].step - 2)
                        break;
                    c = c + fill_map_with_hole_list(sm, sm.step_list[i].hole_list, step);
                }
               if (c<=0)
                {
                    break;
                }
            }

        }
        
        public SHIMap make_map(int width, int height)
        {
            SHIMap sm = new SHIMap();
            sm.init_map(width, height);
            fill_map(sm);         
            return sm;
        }
    }
}

例图

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1804643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS+JS 密码灯登录表单

效果演示 实现了一个登录页面,包括一个标题、两个输入框(用户名和密码)、一个登录按钮和一个眼睛图标。点击眼睛图标可以显示或隐藏密码。页面背景有两个圆形的半透明元素,整个页面使用了flex布局,并且在水平和垂直方向上都居中对齐。登录框使用了阴影效果和圆角边框,并且…

Django 表里做删除

先看效果图 点击 删除 按钮之后&#xff0c;就可以下面的效果 操作步骤&#xff1a; 1. 在 urls.py 文件里&#xff0c;添加路劲&#xff1a; urlpatterns [path(asset/<int:aid>/delete/, am_views.asset_delete),]2. 在 views.py 文件里&#xff0c;实现一个新的函…

【CS.AL】八大排序算法 —— 快速排序全揭秘:从基础到优化

文章目录 1. 快速排序简介1.1 定义1.2 时间复杂度1.3 相关资源 2. 最优的Partition算法 &#x1f525;2.1 Introsort简介2.2 过程示例 3. 非递归快速排序3.1 实现 4. 递归快速排序4.1 实现 5. 有问题的Partition5.1 实现 6. 三中位数主元选择6.1 实现 7. 总结 1. 快速排序简介 …

微信小程序基础工作模板

1.轮播图 点击跳转官方文档 简单例子 <!-- 顶部轮播图 --> <swiper indicator-dots"true" class"banner" autoplay"true" interval"2000"><swiper-item><image src"../../images/轮播图1.jpg" >…

Chrome跳转新的标签页自动打开控制台设置方法

Chrome跳转新的标签页自动打开控制台设置方法 文章目录 Chrome跳转新的标签页自动打开控制台设置方法1. 首先打开控制台2. 点击设置3. 选择Preferences -> Global -> 选中 Auto-open DevTools for popups4. 回到控制台勾选 preserve log保留日志![请添加图片描述](https:…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于状态分解的综合能源系统完全分布式调度算法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Flask 学习笔记 总结

python基础 服务端开发编程 第一个是赋值运算&#xff0c;第二是乘法&#xff0c;最后是一个是幂&#xff08;即a2&#xff09; a 2 a * 2 a ** 2 Python支持多重赋值&#xff1a; a, b, c 2, 3, 4 这句命令相当于&#xff1a; a 2 b 3 c 4 Python支持对字符串的灵活…

R语言数据探索和分析23-公共物品问卷分析

第一次实验使用最基本的公共物品游戏&#xff0c;不外加其他的treatment。班里的学生4人一组&#xff0c;一共44/411组。一共玩20个回合的公共物品游戏。每回合给15秒做决定的时间。第十回合后&#xff0c;给大家放一个几分钟的“爱心”视频&#xff08;链接如下&#xff09;&a…

Java 习题集

&#x1f496; 单选题 &#x1f496; 填空题 &#x1f496; 判断题 &#x1f496; 程序阅读题 1. 读代码写结果 class A {int m 5;void zengA(int x){m m x;}int jianA(int y){return m - y;} }class B extends A {int m 3;int jianA(int z){return super.jianA(z) m;} …

论文降痕指南:如何有效降低AIGC率

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

社区物资交易互助平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;公告信息管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xff0c;求助留言板&#xff0c;公…

每日两题6

文章目录 删除并获得点数粉刷房子 删除并获得点数 分析 class Solution { public:int deleteAndEarn(vector<int>& nums) {const int N 10001;// 预处理int arr[N] {0};for (int& e : nums)arr[e] e;// 在 arr 上进行 打家劫舍 问题vector<int> f(N),…

折腾日记:如何在Mac上连接Esp32

个人博客地址 最近购买了一块Esp32单片机&#xff0c;在Mac环境上进行开发&#xff0c;并且成功点亮LED灯和连上屏幕&#xff0c;为什么会上手选择Esp32开发板&#xff0c;主要考虑它自带Wi-Fi和蓝牙&#xff0c;单价也不高&#xff0c;就算后面不玩了&#xff0c;也能转成物联…

计算机网络复习题

期末题库复习1 一. 单选题&#xff08;共32题&#xff0c;100分&#xff09; 1. (单选题) 在脉冲起始时刻&#xff0c;有无跳变来表示“0”和“1”&#xff0c;且在脉冲中间时刻始终发生跳变的编码是&#xff08; &#xff09;。 A.非归零码 B.曼彻斯特编码 C.归零码 D.差…

html--酷炫背景引导主页

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>ZZVIPS酷炫背景引导主页</title><meta name"viewport" content"widthdevice-width,initial-scale1,maximum-scale1,user-scala…

Ubuntu硬盘分区、挂载、修改用户权限

使用命令查看硬盘情况 sudo fdisk -l 可以看到这里有个未分区的4T硬盘 如&#xff1a;sdb 这样的是硬盘 sdb1 sdb2 这样的是分区&#xff0c;现在还没分区 分区 sudo parted /dev/sdb (sdb 是要挂载的硬盘) 输入一下命令分区&#xff1a; mklabel gpt (创建分区表) mkpart p…

汇总 |国内外医疗器械网络安全法规与标准

国内外关于医疗器械网络安全的法规和标准日益完善&#xff0c;旨在确保医疗器械在全生命周期内的网络安全&#xff0c;保障患者信息的安全和隐私&#xff0c;以及医疗器械的正常运行。不同国家和地区的法规和标准各有侧重&#xff0c;但都强调了医疗器械制造商、开发者、经营者…

【Python】一文向您详细介绍 __str__ 的作用和用法

【Python】一文向您详细介绍 str 的作用和用法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&…

极域卸载不干净导致无法重新安装问题:独家解决方案

文章目录 一、问题二、解决1.网上常规方法2.本贴特殊之处 三、致谢 一、问题 极域卸载不干净&#xff0c;导致无法重新安装。 二、解决 1.网上常规方法 1.regedit命令注册表删除 topdomain、mythware、{5FB4EEDF-6A79-45C3-B049-EF327CA03FCD} 2.删除极域对应tmp文件 网上…

C语言如何判断⽂件的结束?

一、问题 在⽂件中查找匹配的信息时&#xff0c;需要遍历⽂件中的数据信息。在遍历的过程中&#xff0c;如何判断⽂件的指针已经到了⽂件的结尾呢&#xff1f; 二、解答 1. 问题解析 在对⽂件的操作函数中&#xff0c;除了存在读写⽂件的函数&#xff0c;还有⽤于测试⽂件流是…