1
头图

五点共圆

日常刷刷微信订阅号文章,刷到公众号“机器学习研究组”的这篇文章,《江泽民「数学往事」:这道五点共圆题,差点难倒丘成桐》,里面提到了一道几何证明题,饶有兴致,便凑趣用自己熟悉的JSXGraph来进行下计算机几何证明。

image.png

image.png

计算机几何证明思路:

基于JSXGraph引擎强大的几何证明推演能力,我的证明思路如下,

第一步,在画板上任意位置,声明五角星的五个顶点,A、B、C、D、E;

第二步,连接AD、AC、EB、EC、DB,得到五条直线;

第三步,分别命名五条直线间的交点为F、G、H、I、J;

第四步,基于点A、F、J作三角形AFJ,点J、E、I作三角形JEI,点I、D、H作三角形IDH,点H、C、G作三角形HCG,点G、B、F作三角形GBF;

第五步,分别作三角形AFJ的外接圆AFJ,三角形JEI的外接圆JEI,三角形IDH的外接圆IDH,三角形HCG的外接圆HCG,三角形GBF的外接圆GBF;

第六步,声明外接圆AFJ和外接圆JEI的非J交点为K,外接圆JEI和外接圆IDH的非I交点为O,外接圆IDH和外接圆HCG的非H交点为N,外接圆HCG和外接圆GBF的非G交点为M,外接圆GBF和外接圆AFJ的非F交点为L;

第七步,选择K、O、N、M、L中的任意三点作圆,若剩余两点也恰好位于所作圆的圆线上,则此五点共圆,得证。

JSXGraph代码求证演示:

最开始的话,得复制粘贴用下这个JSXGraph官方提供的模板HTML文件,如下,我们会在最下面的<script>标签内编写JSXGraph代码,进行计算机几何证明。

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSXGraph template</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<link href="https://cdn.jsdelivr.net/npm/jsxgraph@1.4.6/distrib/jsxgraph.css"
rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/jsxgraph@1.4.6/distrib/jsxgraphcore.
js" type="text/javascript" charset="UTF-8"></script>
<!-- The next line is optional: MathJax -->
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js" id="
MathJax-script" async></script>
</head>
<body>
<div id="jxgbox" class="jxgbox" style="width:500px; height:500px;"></div>
<script>
var board = JXG.JSXGraph.initBoard('jxgbox', {boundingbox: [-5, 5, 5, -5]});
</script>
</body>
</html>

渲染如下:
image.png

第一步,在画板上任意位置,声明五角星的五个顶点,A、B、C、D、E;

将上面的画布坐标系声明大一些,改为[-25, 25, 25, -25],中心为坐标原点。

var board = JXG.JSXGraph.initBoard('jxgbox', {boundingbox: [-25, 25, 25, -25]});

然后,声明五个顶点,取A(0, 19)、B(20,3)、C(14,-14)、D(-8,-20)、E(-20,6)。

var A = board.create('point', [0, 19]);
var B = board.create('point', [20, 3]);
var C = board.create('point', [14, -14]);
var D = board.create('point', [-8, -20]);
var E = board.create('point', [-20, 6]);

渲染如下:

image.png

第二步,连接AD、AC、EB、EC、DB,得到五条直线;

var AD = board.create('line', [A, D]);
var AC = board.create('line', [A, C]);
var EB = board.create('line', [E, B]);
var EC = board.create('line', [E, C]);
var DB = board.create('line', [D, B]);

渲染如下:

image.png

第三步,分别命名五条直线间的交点为F、G、H、I、J;

var F = board.create('intersection', [AC, EB]);
var G = board.create('intersection', [AC, DB]);
var H = board.create('intersection', [EC, DB]);
var I = board.create('intersection', [AD, EC]);
var J = board.create('intersection', [AD, EB]);

image.png

第四步,基于点A、F、J作三角形AFJ,点J、E、I作三角形JEI,点I、D、H作三角形IDH,点H、C、G作三角形HCG,点G、B、F作三角形GBF;

var AFJ = board.create('polygon', [A, F, J]);
var JEI = board.create('polygon', [J, E, I]);
var IDH = board.create('polygon', [I, D, H]);
var HCG = board.create('polygon', [H, C, G]);
var GBF = board.create('polygon', [G, B, F]);

渲染如下:

image.png

第五步,分别作三角形AFJ的外接圆AFJ,三角形JEI的外接圆JEI,三角形IDH的外接圆IDH,三角形HCG的外接圆HCG,三角形GBF的外接圆GBF;

var cirAFJ = board.create('circumcircle', [A, F, J]);
var cirJEI = board.create('circumcircle', [J, E, I]);
var cirIDH = board.create('circumcircle', [I, D, H]);
var cirHCG = board.create('circumcircle', [H, C, G]);
var cirGBF = board.create('circumcircle', [G, B, F]);

渲染如下:

image.png

第六步,声明外接圆AFJ和外接圆JEI的非J交点为K,外接圆JEI和外接圆IDH的非I交点为O,外接圆IDH和外接圆HCG的非H交点为N,外接圆HCG和外接圆GBF的非G交点为M,外接圆GBF和外接圆AFJ的非F交点为L;

var K = board.create('intersection',[cirAFJ,cirJEI,0], {name: 'K'});
var O = board.create('intersection',[cirJEI,cirIDH,0], {name: 'O'});
var N = board.create('intersection',[cirIDH,cirHCG,0], {name: 'N'});
var M = board.create('intersection',[cirHCG,cirGBF,0], {name: 'M'});
var L = board.create('intersection',[cirGBF,cirAFJ,0], {name: 'L'});

渲染如下:

image.png

第七步,选择K、O、N、M、L中的任意三点作圆,若剩余两点也恰好位于所作圆的圆线上,则此五点共圆,得证。

这里,选择点K、O、L。

var cirKOL = board.create('circumcircle', [K, O, L]);

对应渲染:

image.png

可以看到,剩余两点N、M确实是在KOL这个圆的圆线上,诚不我欺!

最终的完整代码

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSXGraph template</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<link href="https://cdn.jsdelivr.net/npm/jsxgraph@1.4.6/distrib/jsxgraph.css"
rel="stylesheet" type="text/css" />
<script src="https://cdn.jsdelivr.net/npm/jsxgraph@1.4.6/distrib/jsxgraphcore.
js" type="text/javascript" charset="UTF-8"></script>
<!-- The next line is optional: MathJax -->
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js" id="
MathJax-script" async></script>
</head>
<body>
<div id="jxgbox" class="jxgbox" style="width:500px; height:500px;"></div>
<script>
var board = JXG.JSXGraph.initBoard('jxgbox', {boundingbox: [-25, 25, 25, -25]});

var A = board.create('point', [0, 19]);
var B = board.create('point', [20, 3]);
var C = board.create('point', [14, -14]);
var D = board.create('point', [-8, -20]);
var E = board.create('point', [-20, 6]);

var AD = board.create('line', [A, D]);
var AC = board.create('line', [A, C]);
var EB = board.create('line', [E, B]);
var EC = board.create('line', [E, C]);
var DB = board.create('line', [D, B]);

var F = board.create('intersection', [AC, EB]);
var G = board.create('intersection', [AC, DB]);
var H = board.create('intersection', [EC, DB]);
var I = board.create('intersection', [AD, EC]);
var J = board.create('intersection', [AD, EB]);

var AFJ = board.create('polygon', [A, F, J]);
var JEI = board.create('polygon', [J, E, I]);
var IDH = board.create('polygon', [I, D, H]);
var HCG = board.create('polygon', [H, C, G]);
var GBF = board.create('polygon', [G, B, F]);

var cirAFJ = board.create('circumcircle', [A, F, J]);
var cirJEI = board.create('circumcircle', [J, E, I]);
var cirIDH = board.create('circumcircle', [I, D, H]);
var cirHCG = board.create('circumcircle', [H, C, G]);
var cirGBF = board.create('circumcircle', [G, B, F]);

var K = board.create('intersection',[cirAFJ,cirJEI,0], {name: 'K'});
var O = board.create('intersection',[cirJEI,cirIDH,0], {name: 'O'});
var N = board.create('intersection',[cirIDH,cirHCG,0], {name: 'N'});
var M = board.create('intersection',[cirHCG,cirGBF,0], {name: 'M'});
var L = board.create('intersection',[cirGBF,cirAFJ,0], {name: 'L'});

var cirKOL = board.create('circumcircle', [K, O, L]);
</script>
</body>
</html>

记事本复制粘贴保存为HTML文件即可运行查看效果,还可以拖拉拽~~


冒泡的马树
194 声望14 粉丝

曾痴迷于赛博朋克世界的代码玩家一枚,