正剧开始:
星历2016年01月20日 13:38:17, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起学习年月日和时间。
星历2016年01月20日 13:40:23, [工程师阿伟]说:在开始之前呢,由于你上一节没有完成
成好[人叫板老师]要求的填充颜色,所以我再给你一个机会,在这里再试一次。[机器小伟]
13:41:29, 小伟很高兴能有另一次的机会,这次,他终于尝试成功了!
阿伟随手画了一张测试图:
小伟给出了下面的解答结果:
虽然并不是十分完美,但小伟依然很开心。
<span style="font-size:18px;">/** * @usage 标记边界点,填充内部域 * @author mw * @date 2016年01月14日 星期四 14:57:23 * @param * @return * */ function signBoundPoint(gap1, gap2) { //图片 var image = new Image(); image.src = "./1.jpg"; //只处理这100*100个象素 var width = 600; var height = 400; var gap = gap1 ? gap1 : 30; var gap2 = gap2 ? gap2 : 10; //掩码矩阵 边界 var maskArray = new Array(); //掩码矩阵 内部 var maskArray2 = new Array(); var map = new Map(); var pos = 0; image.onload = function() { plot.drawImage(image); var imagedata = plot.getImageData(0, 0, width, height); //水平方向找差异 for (var row = 0; row < height; row++) { for (var col = 1; col < width; col++) { //pos最小为1 pos =row * width + col; if (maskArray[pos] == 1) continue; R0 = imagedata.data[4 * (pos-1)]; R1 = imagedata.data[4 * pos]; G0 = imagedata.data[4 * (pos-1)+1]; G1 = imagedata.data[4 * pos+1]; B0 = imagedata.data[4 * (pos-1)+2] B1 = imagedata.data[4 * pos + 2] //简单容差判断 if (Math.abs(R1-R0) > gap || Math.abs(G1-G0)>gap || Math.abs(B1-B0)>gap) { maskArray[pos] = 1; map.put(row, col); } else { maskArray[pos] = 0; } } } //垂直方向找差异 for (var col = 0; col < width; col++) { for (var row = 1; row < height; row++) { //pos最小为第二行 pos =row * width + col; if (maskArray[pos] == 1) continue; R0 = imagedata.data[4 * (pos-width)]; R1 = imagedata.data[4 * pos]; G0 = imagedata.data[4 * (pos-width)+1]; G1 = imagedata.data[4 * pos+1]; B0 = imagedata.data[4 * (pos-width)+2]; B1 = imagedata.data[4 * pos + 2]; //简单容差判断 if (Math.abs(R1-R0) > gap || Math.abs(G1-G0)>gap || Math.abs(B1-B0)>gap) { maskArray[pos] = 1; map.put(row, col); } else { maskArray[pos] = 0; } } } map.sort(); //document.body.appendChild(document.createTextNode(map.print())); var size = map.size(); var key = 0, value1 = value2 = 0; var valueArray = new Array(); for (var i = 0; i < size; i++) { key = map.keys[i]; valueArray = map.get(key); var len = valueArray.length; var index = 0; //预判有多少段需填充的线段 for (var j = 0; j < len; j++) { value1 = valueArray[j]; value2 = valueArray[j+1]; if (value2 - value1 > 5 ) { index++; } } //对于奇数段,一般是中间有间隔的空白段 if (index % 2 == 1) { index = 0; for (var j = 0; j < len; j++) { value1 = valueArray[j]; value2 = valueArray[j+1]; if (value2 - value1 > 5 ) { index++; if (index % 2 == 1) { for (var k = value1; k < value2; k++) { pos = key * width + k; if (maskArray[pos] != 1) { maskArray2[pos] = 1; } } } } } } //对于偶数段,应该全部填充 else { value1 = valueArray[0]; value2 = valueArray[len-1]; for (var k = value1; k < value2; k++) { pos = key * width + k; if (maskArray[pos] != 1) { maskArray2[pos] = 1; } } } } plot.translate(600, 0); for (var col = 0; col < width; col++) { for (var row = 0; row < height; row++) { pos = row * width + col; //颜值突变点,一般为边界 if (maskArray[pos] == 1) { imagedata.data[4 * pos] = 255; imagedata.data[4 * pos+1] = 0; imagedata.data[4 * pos+2] = 255; } else if (maskArray2[pos] == 1) { //颜值相近点,一般为内部 imagedata.data[4 * pos] = 0; imagedata.data[4 * pos+1] = 255; imagedata.data[4 * pos+2] = 0; } else { /* //作为背景处理 imagedata.data[4 * pos] = 255; imagedata.data[4 * pos+1] = 255; imagedata.data[4 * pos+2] = 255;*/ } } } plot.putImageData(imagedata, 0, 0); plot.drawImage(image); } }</span>
由于功法是[人叫板老师]前几年写的,所以日期和时间都已经过去好久了。
现在可是2016年了,所以小伟就去拿来了2016年的日历:
小伟是怎样拿到这份日历的呢?是这样的:
首先:
<span style="font-size:18px;">def tmp(): import calendar; year = 2016; for month in range(1, 13): print(calendar.monthcalendar(year, month)); return; [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31]] [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 0, 0, 0, 0, 0, 0]] [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 31, 0, 0, 0]] [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 0]] [[0, 0, 0, 0, 0, 0, 1], [2, 3, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22], [23, 24, 25, 26, 27, 28, 29], [30, 31, 0, 0, 0, 0, 0]] [[0, 0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 0, 0, 0]] [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31]] [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 30, 31, 0, 0, 0, 0]] [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25], [26, 27, 28, 29, 30, 0, 0]] [[0, 0, 0, 0, 0, 1, 2], [3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30], [31, 0, 0, 0, 0, 0, 0]] [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 0, 0, 0, 0]] [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25], [26, 27, 28, 29, 30, 31, 0]]</span>
<span style="font-size:18px;">/** * @usage 2016年日历 * @author mw * @date 2016年01月20日 星期三 13:59:32 * @param * @return * */ function myDraw() { var config = new PlotConfiguration(); config.init(); config.setPreference(); //config.setSector(1,1,1,1); //config.axis2D(0, 0, 180); var dayOfMonth = //1 [[[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31]], //2 [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 0, 0, 0, 0, 0, 0]], //3 [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 31, 0, 0, 0]], //4 [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 0]], //5 [[0, 0, 0, 0, 0, 0, 1], [2, 3, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22], [23, 24, 25, 26, 27, 28, 29], [30, 31, 0, 0, 0, 0, 0]], //6 [[0, 0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26], [27, 28, 29, 30, 0, 0, 0]], //7 [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31]], //8 [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 30, 31, 0, 0, 0, 0]], //9 [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25], [26, 27, 28, 29, 30, 0, 0]], //10 [[0, 0, 0, 0, 0, 1, 2], [3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30], [31, 0, 0, 0, 0, 0, 0]], //11 [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27], [28, 29, 30, 0, 0, 0, 0]], //12 [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25], [26, 27, 28, 29, 30, 31, 0]]]; var text = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']; var weeks = 0; var r = 25; var x0 = (600-20*r)/2, y0 = 20; for (var m = 10; m < 12; m++) { plot.save(); plot.setTextAlign('center'); plot.fillText('2016 年 '+(m+1).toFixed(0)+' 月', 300, y0, 200); y0 += r; weeks = dayOfMonth[m].length; for (var j = 0; j < 7; j++) { if (j < 5) { plot.setFillStyle('black'); } else { plot.setFillStyle('red'); } plot.fillText(text[j], x0 + j * 3 * r, y0, 100); } y0 +=0.5 * r; for (var i = 0; i < weeks; i++) { y0 += r; for (var j = 0; j < 7; j++) { if (dayOfMonth[m][i][j] != 0) { if (j < 5) { plot.setFillStyle('black'); } else { plot.setFillStyle('red'); } plot.fillText(dayOfMonth[m][i][j].toFixed(0), x0 + j * 3 * r, y0, 100); } } } plot.restore(); if (weeks > 5) { y0 += r; } else { y0 += 2 * r; } } }</span>
当然,也可以这样来做:
<span style="font-size:18px;"> c = calendar.TextCalendar(); >>> c.pryear(2016); 2016 January February March Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 6 4 5 6 7 8 9 10 8 9 10 11 12 13 14 7 8 9 10 11 12 13 11 12 13 14 15 16 17 15 16 17 18 19 20 21 14 15 16 17 18 19 20 18 19 20 21 22 23 24 22 23 24 25 26 27 28 21 22 23 24 25 26 27 25 26 27 28 29 30 31 29 28 29 30 31 April May June Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 30 31 July August September Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 1 2 3 4 5 6 7 1 2 3 4 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30 October November December Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 1 2 3 4 5 6 1 2 3 4 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 31 </span>
本节到此结束,欲知后事如何,请看下回分解。