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,如需转载请自行联系原作者

相关文章
|
4月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
40 4
|
5月前
|
前端开发 JavaScript Java
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
315 0
|
2月前
|
JavaScript 前端开发 Oracle
|
2月前
|
JavaScript 前端开发 Java
Java和JavaScript区别与联系
【8月更文挑战第18天】
|
4月前
|
JavaScript 前端开发 Java
java 执行 javascript 代码
java 执行 javascript 代码
27 6
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js的基于java的教学辅助平台附带文章和源代码设计说明文档ppt
基于springboot+vue.js的基于java的教学辅助平台附带文章和源代码设计说明文档ppt
44 10
|
4月前
|
存储 算法 Java
【经典算法】LeetCode133克隆图(Java/C/Python3实现含注释说明,中等)
【经典算法】LeetCode133克隆图(Java/C/Python3实现含注释说明,中等)
24 2
|
4月前
|
算法 JavaScript 前端开发
【经典算法】LCR187:破冰游戏(约瑟夫问题,Java/C/Python3/JavaScript实现含注释说明,Easy)
【经典算法】LCR187:破冰游戏(约瑟夫问题,Java/C/Python3/JavaScript实现含注释说明,Easy)
53 1
|
4月前
|
存储 JavaScript 前端开发
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
26 1
|
4月前
|
Java
图深度优先、广度优先遍历(java)
图深度优先、广度优先遍历(java)