JavaScript与Java生成N*N阶方格图的四种方式

简介:
+关注继续查看

想要生成N*N7方格图在浏览器页面显示,解决策略是浏览器端之间生成和服务器端生成后返回到前端。

具体效果图如下图canvas:

190812703.png

  说明:格子图有红色格子和黑色格子组成,红色默认颜色,黑色是对要特殊显示个格子做出标记。


生成九宫格的图案,想了四种方式,JavaScript实现了三种,Java实现一种。

1.JavaScript生成Table的方式产生方格子。

 生成效果图table:

191749999.png

 源代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//表格生成
    function drawTable(edge, n) {
        var size = edge / n;
        var sb = new StringBuffer();
        sb.append("<table border='1' height='" + edge + "' width='" + edge + "' bgcolor='red'>");
        for (var i = 0; i < n; i++) {
            sb.append("<tr>");
            for (var j = 0; j < n; j++) {
                var p = i + '' + j;
                sb.append("<td width='" + size + "' height='" + size + "' ");
                if (point.contains(p)) {
                    sb.append(" bgcolor='#000000' >");
                else {
                    sb.append(" bgcolor='#FFFFFF' >");
                }
                sb.append("</td>");
            }
            sb.append("</tr>");
        }
        sb.append("</table>");
        document.getElementById("div").innerHTML = sb.toString();
    }

说明:参数edge:表示Table的width和height的像素,n表示正方形Table中一行的小格子数目。

2.JavaScript通过span标签组合和纯色图片生成方格。

 生成效果图span:

191715372.png

 源代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function drawImage(edge, n) {
        var size = edge / n;
        var flag = n >= 100 ? 100 : 100 > n >= 75 ? 75 : 75 > n >= 50 ? 50 : 25;
        var imgetrue = "cell/"+flag+"/1.png";
        var imgefalse = "cell/"+flag+"/0.png";
        var sb = new StringBuffer();
        for (var i = 0; i < n; i++) {
            sb.append("<span>");
            for (var j = 0; j < n; j++) {
                var p = i + '' + j;
                if (point.contains(p)) {
                    sb.append("<img src='"+imgetrue+"' ");
                else {
                    sb.append("<img src='"+imgefalse+"' ");
                }
                sb.append("width='" + size + "' height='" + size + "'/>");
            }
            sb.append("</span><br/>")
        }
        document.getElementById("div").innerHTML = sb.toString();
    }

说明:参数同上。

 使用两种纯色width==height的图片,并且有不同的像素,生成策略将根据一行的小格子数量来决定使用不同像素的图片。

3.使用HTML的Canvas功能绘制。

 效果图参见本文第一幅图canvas.

 源代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//HTML5Canvas绘制
    function drawCanvas(edge, n) {
        document.getElementById("div").innerHTML="";
        var size = edge / n;
        canvas=document.getElementById("canvas");
        canvas.setAttribute("height", edge);
        canvas.setAttribute("width", edge);
        cxt=canvas.getContext('2d');
        cxt.strokeStyle="rgb(255, 255, 255)";
        for(var i=0; i<n; i++){
            for(var j=0; j<n; j++){
                var p=i+""+j;
                if(point.contains(p)){
                    cxt.fillStyle="rgb(0, 0, 0)";
                }else{
                    cxt.fillStyle="rgb(255, 0, 0)";
                }
                cxt.fillRect(size*j,size*i,size,size);
                cxt.strokeRect(size*j,size*i,size,size);
            }
        }
    }

说明:参数同上。

 fillRect(x,y,w,h);绘制填充的矩形

 strokeRect(x,y,w,h);绘制线条的矩形

 上面两次反复绘制矩形,通过fillRect和strokeRect方法使的绘制的方格具有填充色和边框。

j_0001.gif使用HTML5的Canvas绘制则需要支持HTML5的浏览器支持。


4.使用Java的生成N*N阶的方格图片

 效果图:

194809524.png

 关键代码:


1
2
3
4
5
6
7
BufferedImage bimage = new BufferedImage(edgePixel * n, edgePixel * n,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = bimage.createGraphics();
        g2d.getDeviceConfiguration().createCompatibleImage(edgePixel * n, edgePixel * n,
                Transparency.TRANSLUCENT);
        g2d.dispose();
        g2d = bimage.createGraphics();

第一步:图片缓冲区对象创建,BufferedImage.

第二步:二维绘图画笔,获取Graphics接口的实现类Graphics2D对象

第三步:设置画笔的线条颜色,背景颜色等属性

第四步:绘制图形,API中提供的相应的绘制方法

第五步:将将图片缓存去中的内容通过图像文件输出流写入到文件。

如下代码所示:


1
2
FileImageOutputStream   fios = new FileImageOutputStream(new File(imageName));
ImageIO.write(bimage, IMAGE_TYPE.substring(1), fios);

说明:IMAGE_TYPE字符串表示的是输出图像的文件类型,如:png,jpeg,gif,bmp


   上述JavaScript和Canvas生成图形过程中使用了StringBuffer这个对象和Array对象的contains方法源代码参见附件:CellTable生成图像演示文件CellTable.html.txt使用时去掉后缀[.txt].


   说起生成N*N阶方格,并且突出显示其中指定的格子源于以前的两篇文章中提到的寻找图案单位问题。

   文章:拉登游戏开发--分布式计算服务机客户机程序设计

拉登游戏开发--在时间的积累中寻求美丽图案

   今天有点成果了,计算到了N=26。

   挑几张能看出图案的效果图:


200747788.png200747453.png200747801.png200747820.png200747300.png200748261.png200748562.png


   这个问题的提出者来自新浪博主大力水手。2013年8月19日特殊的日子,给自己放了个假,晚上没有加班,放松了一下,回到家一下子就睡的稀里糊涂。22点左右起来,看了会书,时间过的很快,一会就过了24点,于是就睡了下了,可是怎么也睡不着,这个问题突然就在我脑海里打转个不停,大脑一直就没有停歇下来,早上起来都被折腾的很累,于是今天就把这个问题给解决了,算是一个了结吧。

  j_0001.gif 难道真的就这么苦逼,程序员的生活啊!j_0071.gif




本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1279213,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 Java 索引
[正式学习java②]——数组的基本使用,java内存图与内存分配
[正式学习java②]——数组的基本使用,java内存图与内存分配
|
4月前
|
算法 Java
图【数据结构与算法java】
图【数据结构与算法java】
33 0
|
5月前
|
存储 消息中间件 缓存
史上最全最详细的Java架构师成长路径图,程序员必备
从新手码农到高级架构师,要经过几步?要多努力,才能成为为人倚重的技术专家?本文将为你带来一张程序员发展路径图,但你需要知道的是,天下没有普适的道理,具体问题还需具体分析,实践才能出真知。
149 0
|
5月前
|
Java
Java 集合框架图
Java 集合框架图
33 0
|
5月前
|
Java
Java数据结构54:图的深度优先遍历与广度优先遍历数据结构课程设计
给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。示例输入对应的图如下图所示:
28 0
|
5月前
|
Java 编译器
java一个对象内存图
java一个对象内存图
|
5月前
|
Java
java两个对象内存图
java两个对象内存图
|
6月前
|
算法 Java
数据结构(12)Dijkstra算法JAVA版:图的最短路径问题
12.1.概述 12.1.1.无权图的最短路径 无权图的最短路径,即最少步数,使用BFS+贪心算法来求解最短路径,比较好实现,此处不做展开讨论。
65 0
|
6月前
|
存储 算法 搜索推荐
【Java高阶数据结构】图补充-拓扑排序
Java高阶数据结构 & 图补充-拓扑排序 1. 什么是拓扑排序 讲得很好哦!
58 1
|
6月前
|
算法 Java
【Java高阶数据结构】图的最短路径问题
Java高阶数据结构 & 图的最短路径问题 图的基础知识博客:传送门 最短路径问题: 从在带权图的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径各边的权值总 和达到最小。 一共会讲解三种算法
94 1
相关产品
云迁移中心
推荐文章
更多