包含24個正方形和24個等腰直角三角形的方形对称图案
圖案上下、左右對稱,并且旋转90度不变,整体包含在一個大正方形中。所用線段越少越好。对称探寻,老少皆宜;烧脑费眼,童叟无欺;数理推导,追本溯源;智能算法,所向披靡
自己构造了一個
<p><canvas id="grid" width="242" height="242"></canvas>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('grid');
if(!canvas.getContext) return;
var ctx = canvas.getContext("2d");
//绘制网格点阵
ctx.translate(121, 121) ; //
for (var x =-6; x <7; x++) {
for (var y =-6; y <7; y++) {
ctx.lineWidth = 0.5;
ctx.beginPath();
// 绘制水平线段
let t=20;
ctx.moveTo(3+x * t , y *t);
ctx.lineTo(x * t-3, y *t);
// 绘制垂直线段
ctx.moveTo(x * t, y * t +3);
ctx.lineTo(x * t, y *t -3);
ctx.strokeStyle = 'Black';
ctx.stroke();
}
}
//绘制网格
{
let s=5;
let t=20
let r=6*t
ctx.beginPath();
ctx.strokeStyle = 'Blue';
ctx.lineWidth = 2.5;
ctx.rect(-r, -r, 2*r, 2*r);
ctx.rect(t-r, t-r, 10*t, 10*t);
ctx.moveTo(-r, -2*t);
ctx.lineTo(r, -2*t);
ctx.lineTo(2*t, -r);
ctx.lineTo(2*t, r);
ctx.lineTo(r, 2*t);
ctx.lineTo(-r, 2*t);
ctx.lineTo(-2*t, r);
ctx.lineTo(-2*t, -r);
ctx.lineTo(-r, -2*t);
ctx.moveTo(-2*t, 0);
ctx.lineTo(0, -2*t);
ctx.lineTo(2*t,0);
ctx.lineTo(0, 2*t);
ctx.lineTo(-2*t, 0);
ctx.stroke();
}
}
draw();
</script>
</p>
線段20條,12x12网格(13x13点阵)。 <p>
<canvas id="grid1" width="122" height="122"></canvas>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('grid1');
if(!canvas.getContext) return;
var ctx = canvas.getContext("2d");
//绘制网格点阵
ctx.translate(61, 61);//移动原点
let t=20;//网格单元格大小
for (var x =-3; x <4; x++) {
for (var y =-3; y <4; y++) {
ctx.lineWidth = 0.5;
ctx.beginPath();
// 绘制水平线段
ctx.moveTo(3+x * t , y *t);
ctx.lineTo(-3+x * t, y *t);
// 绘制垂直线段
ctx.moveTo(x * t, y * t +3);
ctx.lineTo(x * t, y *t -3);
ctx.strokeStyle = 'Black';
ctx.stroke();
}
}
//绘制图案
{
let r=3*t;//网格右边界
ctx.beginPath();
ctx.strokeStyle = 'Blue';
ctx.lineWidth = 2.5;
ctx.rect(-r, -r, 2*r, 2*r); //外围正方形
ctx.rect(t-r, t-r, 4*t, 4*t); //二环
//大井字形
ctx.moveTo(-r, -t);
ctx.lineTo(r, -t);
ctx.moveTo(-r, t);
ctx.lineTo(r, t);
ctx.moveTo(-t, -r);
ctx.lineTo(-t, r);
ctx.moveTo(t, -r);
ctx.lineTo(t, r);
//中心斜方
ctx.moveTo(0, t-r);
ctx.lineTo(r-t, 0);
ctx.lineTo(0, r-t);
ctx.lineTo(t-r, 0);
ctx.lineTo(0, t-r);
//四条单独斜线
ctx.moveTo(t-r, -t);
ctx.lineTo(-t, t-r);
ctx.moveTo(t, t-r);
ctx.lineTo(r-t, -t)
ctx.moveTo(r-t, t);
ctx.lineTo(t, r-t);
ctx.moveTo(-t, r-t);
ctx.lineTo(t-r, t);
ctx.stroke();
}
}
draw();
</script>
</p>
線段20條,6X6网格(7x7点阵) <p>
<canvas id="L18H3+3" width="202" height="202"></canvas>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('L18H3+3');
if(!canvas.getContext) return;
var ctx = canvas.getContext("2d");
//绘制网格点阵
ctx.translate(101, 101) ;
for (var x =-5; x <6; x++) {
for (var y =-5; y <6; y++) {
ctx.lineWidth = 0.5;
ctx.beginPath();
// 绘制水平线段
let t=20;
ctx.moveTo(x * t-3, y *t);
ctx.lineTo(3+x * t, y *t);
// 绘制垂直线段
ctx.moveTo(x * t, y * t +3);
ctx.lineTo(x * t, y *t-3);
ctx.strokeStyle = 'Black';
ctx.stroke();
}
}
//绘制图案
{
let t=20;//网格单元格大小
let r=5*t;//网格右边界
let s=-r;//左边界
let d=2*t;//斜方半径
ctx.beginPath();
ctx.strokeStyle = 'Blue';
ctx.lineWidth = 2.5;
ctx.rect(-r, -r, 2*r, 2*r); //外围正方形
ctx.rect(-2*t, -2*t, 4*t, 4*t); //二环
//大井字形
ctx.moveTo(s, s+2*t);
ctx.lineTo(r, s+2*t);
ctx.moveTo(s, r-2*t);
ctx.lineTo(r, r-2*t);
ctx.moveTo(s+2*t, s);
ctx.lineTo(s+2*t, r);
ctx.moveTo(r-2*t, s);
ctx.lineTo(r-2*t, r);
//大十字
ctx.moveTo(s, 0);
ctx.lineTo(r, 0);
ctx.moveTo(0, s);
ctx.lineTo(0, r);
//中心斜方
ctx.moveTo(-d, 0);
ctx.lineTo(0, -d);
ctx.lineTo(d, 0);
ctx.lineTo(0, d);
ctx.lineTo(-d, 0);
//四条单独斜线
ctx.moveTo(s, -t);
ctx.lineTo(-t, s);
ctx.moveTo(t, s);
ctx.lineTo(r, -t)
ctx.moveTo(r, t);
ctx.lineTo(t, r);
ctx.moveTo(-t, r);
ctx.lineTo(s, t);
ctx.stroke();
}
}
draw();
</script>
</p>
由樓上高手啟發的。線段22條,网格10x10(点阵11x11)。 不知是否還有其它的圖形符合題目要求?
不知電腦是否能夠算出所有符合題意的圖形?
(聯想到凸五邊形,最終是用電腦證明的,只有十五種) <p>
<canvas id="ejsoon4" width="250" height="250"></canvas>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('ejsoon4');
if(!canvas.getContext) return;
var ctx = canvas.getContext("2d");
//绘制网格点阵
for (var x =0; x <13; x++) {
for (var y =0; y <13; y++) {
ctx.lineWidth = 0.5;
ctx.beginPath();
// 绘制水平线段
let t=20;
ctx.moveTo(3+x * t , 5+y *t);
ctx.lineTo(7+x * t, 5+y *t);
// 绘制垂直线段
ctx.moveTo(5+x * t, y * t +3);
ctx.lineTo(5+x * t, y *t + 7);
ctx.strokeStyle = 'Black';
ctx.stroke();
}
}
//绘制图案
{
let s=5;
let t=20;
let r=s+12*t;
ctx.beginPath();
ctx.strokeStyle = 'Blue';
ctx.lineWidth = 2.5;
ctx.rect(s, s, 12*t, 12*t);//外方
//大井字形
ctx.moveTo(s, s+4*t);
ctx.lineTo(r,s+4*t);
ctx.moveTo(s, s+8*t);
ctx.lineTo(r, s+8*t);
ctx.moveTo(s+4*t, s);
ctx.lineTo(s+4*t, r);
ctx.moveTo(s+8*t,s);
ctx.lineTo(s+8*t,r);
//大斜方
ctx.moveTo(s+2*t, s+6*t)
ctx.lineTo(s+6*t, s+2*t);
ctx.lineTo(s+10*t, s+6*t);
ctx.lineTo(s+6*t, s+10*t);
ctx.lineTo(s+2*t, s+6*t);
// 小斜方
ctx.moveTo(s+4*t, s+6*t)
ctx.lineTo(s+6*t, s+4*t);
ctx.lineTo(s+8*t, s+6*t);
ctx.lineTo(s+6*t,s+8*t);
ctx.lineTo(s+4*t,s+6*t);
//中心X
ctx.moveTo(s+4*t, s+4*t)
ctx.lineTo(s+8*t, s+8*t);
ctx.moveTo(s+4*t, s+8*t)
ctx.lineTo(s+8*t, s+4*t);
ctx.stroke();
}
}
draw();
</script>
</p>
線段18條,网格12x12(点阵13X13) <p>
<canvas id="ejsoon5" width="170" height="170"></canvas>
<script type="text/javascript">
function draw(){
var canvas = document.getElementById('ejsoon5');
if(!canvas.getContext) return;
var ctx = canvas.getContext("2d");
//绘制网格点阵
for (var x =0; x <17; x++) {
for (var y =0; y <17; y++) {
ctx.lineWidth = 0.5;
ctx.beginPath();
// 绘制水平线段
let t=20;
ctx.moveTo(3+x * t , 5+y *t);
ctx.lineTo(7+x * t, 5+y *t);
// 绘制垂直线段
ctx.moveTo(5+x * t, y * t +3);
ctx.lineTo(5+x * t, y *t + 7);
ctx.strokeStyle = 'Black';
ctx.stroke();
}
}
//绘制图案
{
let s=5;
let t=20;
let r=s+8*t;
ctx.beginPath();
ctx.strokeStyle = 'Blue';
ctx.lineWidth = 2.5;
ctx.rect(s, s, 8*t, 8*t);//外方
ctx.rect(s+3*t, s+3*t, 2*t, 2*t);//内方
//大井字形
ctx.moveTo(s, s+2*t);
ctx.lineTo(r,s+2*t);
ctx.moveTo(s, s+6*t);
ctx.lineTo(r, s+6*t);
ctx.moveTo(s+2*t, s);
ctx.lineTo(s+2*t, r);
ctx.moveTo(s+6*t,s);
ctx.lineTo(s+6*t,r);
//断十字线
ctx.moveTo(s, s+4*t);
ctx.lineTo(s+3*t, s+4*t);
ctx.moveTo(s+5*t, s+4*t);
ctx.lineTo(r, s+4*t);
ctx.moveTo(s+4*t, s);
ctx.lineTo(s+4*t, s+3*t);
ctx.moveTo(s+4*t,s+5*t);
ctx.lineTo(s+4*t,r);
//大斜方
ctx.moveTo(s+2*t, s+4*t)
ctx.lineTo(s+4*t, s+2*t);
ctx.lineTo(s+6*t, s+4*t);
ctx.lineTo(s+4*t, s+6*t);
ctx.lineTo(s+2*t, s+4*t);
//中心X
ctx.moveTo(s+3*t, s+3*t)
ctx.lineTo(s+5*t, s+5*t);
ctx.moveTo(s+3*t, s+5*t)
ctx.lineTo(s+5*t, s+3*t);
ctx.stroke();
}
}
draw();
</script>
</p>
線段22個条,8x8网格(9X9点阵) 新增要求:所有碎线段端点的坐标必须为整数,即均位于格点上。
并记格点间最小间距为单位长度 \(1\) 。
昨天周六,到中科大跟儿子汇合,小游合肥,
今早在宾馆构造出了一个新的,晚上在高铁 G3178 上又得到一个,
当时没带电脑,所以留待返家后再发帖。
可惜,“宾馆版”与楼主现在的3#的一致(以前怎么没注意到?);
所以,现仅发布“高铁版”,如下:
关于点:
上图最小可覆盖格点矩阵大小为 \(7\times7\),
关于线:
线段 \(24\) 条,含 \(5\) 种长度规格:\(1(*4), \sqrt2(*4), 2(*4), 2\sqrt2(*4), 6(*8)\);
其中,
斜整线段 \(8\) 条,仅 \(2\) 种长度规格:\(\sqrt2(*4),2\sqrt2(*4)\);
以上描述中,括号中的数字为前面数字对应的数目。
在引入“格点”要求后,就可以多维度量化一个结果的优劣,比如上面的:
[*]最小可覆盖格点矩阵:\(7\times7\)
[*]格点利用率:\(\dfrac{32}{7\times7} = 65.31\%\)
[*]端点重复利用率:\(\dfrac{4\times24 +3\times24}{32} =\dfrac{21}{4}=525\%\)
[*]长度重复利用率:\(\dfrac{\left(1\times8+\sqrt2\times1+2\times9+2\sqrt2\times1+4\times4+6\times1\right)\times4+\left(1\times2+\sqrt2\right)\times20+\left(\sqrt2\times2+2\right)\times4}{1\times24+\sqrt2\times12+2\times12}=\dfrac{60+10\sqrt2}{12+3\sqrt2} =456.47\%\)
[*]面积重复利用率:\(\dfrac{\left(1\times8+2\times1+4\times9+8\times1+16\times4+36\times1\right)+\left(0.5\times20+2\times4\right)}{6\times6} =\dfrac{50}{9}=555.56\%\)
显然,利用率越高越好。