1、利用Asymptote讲解初中数学红色超越2015年11月7日1安装TEX LiveTEX Live是一个完整的TEX系统,它可以安装在本地磁盘上。主页:http:/tug.org/texlive/。具体的安装方法请参照各种教程,这里不做重复说明。2基本绘图说明首先针对常用的绘图方法进行说明,主要是一些代码示例,希望能够抛砖引玉。感兴趣的话可以进一步学习相关的官方文档或者教程。页面布局采用左边是最终绘制结果,右边是实现代码的方式,并且配有注释。具体的函数说明请参照官方文档。3构造平面直角坐标系因为图形的绘制不能脱离坐标系,所以在这里以构造平面直角坐标系作为起点,让我们熟悉一下Asymptote
2、。3.1基本构造yxO1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -1, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -1, 5, Arrow);11 /标记原点,位置西南12 label(“$O$“, origin, SW);13构造平面直角坐标系23.2复杂一点的构造4224y4 2 2 4xO1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm)
3、;7 /绘制横轴,刻度位于左侧,不标记08 /设定主、副刻度步长9 xaxis(Label(“$x$“, align = 2E), -5, 5,10 LeftTicks(modify = NoZero, Step = 2, step = 1),11 Arrow);12 /绘制纵轴,刻度位于右侧,不标记013 /设定主、副刻度步长14 yaxis(Label(“$y$“, align = 2N), -5, 5,15 RightTicks(modify = NoZero, Step = 2, step = 1),16 Arrow);17 /标记原点,位置西南18 label(“$O$“, orig
4、in, SW);3.3带有网格的平面直角坐标系55 y5 5xO1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /定义横轴的范围8 int minX = -5, maxX = 5;9 /定义纵轴的范围10 int minY = -5, maxY = 5;11 xaxis(Label(“$x$“, align = 2E), minX, maxX,12 Ticks(modify = NoZero, step = 1),13 Arrow);14 yaxis(Label(“$y$“, align = 2N)
5、, minY, maxY,15 Ticks(modify = NoZero, step = 1),16 Arrow);17 /定义画笔18 pen thinred = red + linewidth(0.5*linewidth();19 /绘制横轴的网格20 for(int i = minX; i = maxX; +i)21 xequals(i, minX, maxX, extend = true, p = thinred);22 23 /绘制纵轴的网格24 for(int i = minY; i = maxY; +i)25 yequals(i, minY, maxY, extend = tr
6、ue, p = thinred);26 27 /标记原点,位置西南28 label(“$O$“, origin, SW);4数轴的绘制34数轴的绘制大家可能有点儿奇怪,为什么数轴放在了平面直角坐标系的后面。因为我确实是先研究明白了平面直角坐标系的绘制,才开始研究数轴的绘制,也算是做个补充。4.1简单数轴的绘制10 5 0 5 101 /导入绘图模块2 import graph;3 /设置尺寸,纵向不保持比例4 size(5cm, 0);5 /绘制横轴,设定主、副刻度步长6 xaxis(-10, 10, LeftTicks(Step = 5, step = 1), Arrow);4.2数轴的高级
7、绘制10 5 0 5 101 /导入绘图模块2 import graph;3 /设置尺寸,纵向不保持比例4 size(5cm, 0);5 /绘制横轴6 /设定主、副刻度步长、尺寸,颜色以及标签字体7 xaxis(-10, 10,8 LeftTicks(Label(green + fontsize(5pt),9 Size = 2, size = 1, Step = 5, step = 1,10 pTick = red, ptick = blue),11 Arrow);5点的绘制45点的绘制5.1不同样式的点的绘制yxO(2,3) BCP4P3P2P1P01 /导入绘图模块2 import gra
8、ph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, NW);13 /定义数对14 pair A = (2, 3), B = (4, 2), C = (3, 0);15 /绘制点,默认显示坐标值16 dot(“, A);17 /绘制点,自定义标签18 dot(“$B$“, B, NE);19 /绘制点,空心点,红色20 dot(“$C$“, C
9、, NE, red, UnFill);21 /绘制一系列的点22 for(int i = -4; i = 0; +i)23 dot(Label(format(“$P_%d$“, abs(i), (i, i), SE,blue);24 6直线的绘制56直线的绘制6.1过已知两点做直线yxOAB1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12
10、label(“$O$“, origin, SW);13 /定义数对14 pair A = (2, 3), B = (4, 2);15 /绘制点16 dot(“$A$“, A, NE);17 dot(“$B$“, B, NE);18 /定义直线19 line AB = line(A, B);20 /绘制直线21 draw(AB, red);6.2绘制直线方程定义的直线以及求交点yxO12x y + 2 = 0y = 5x 4P1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“
11、$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /定义直线:一般式14 line line1 = line(1/2, -1, 2);15 /定义直线:斜截式16 line line2 = line(5, -4);17 /绘制直线18 draw(“$frac12x -y + 2 = 0$“,line1, red);19 draw(“$y = 5x - 4$“, line2, blue);20 /求交点21 pair P = intersectionpoi
12、nt(line1, line2);22 /绘制交点23 dot(“$P$“, P, SE);6直线的绘制66.3过一点做已知直线的平行线和垂线yxOABC lmm:B1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /定义三点并绘制14 pair A = (-3, -2), B = (
13、1, -1), C = (2, 2);15 dot(“$A$“, A, S);16 dot(“$B$“, B, S);17 dot(“$C$“, C, NE);18 /定义直线并绘制19 line AB = line(A, B);20 draw(AB);21 /过直线外一点做平行线22 line l = parallel(C, AB);23 draw(“$l$“, l, blue);24 /过一点做直线的垂线25 line m = perpendicular(A, AB);26 draw(“$m$“, m, red);27 /标记直角,28 dot(“$m.B$“, m.B, NE, brow
14、n);29 markrightangle(m.B, A, B);7线段的绘制77线段的绘制7.1基本线段的绘制及标记中点yxOABM1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, NW);13 /定义两点并绘制14 pair A = (-3, -3), B = (2, 2);15 dot(“$A$
15、“, A, S);16 dot(“$B$“, B, S);17 /绘制线段18 draw(A - B, blue);19 /求中点20 pair M = midpoint(A - B);21 dot(“$M$“, M, S, red);7线段的绘制87.2高级线段的绘制及定比分点yxOA BCD= 131 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标
16、记原点12 label(“$O$“, origin, SW);13 /定义点并绘制封闭图形14 pair A = (-3, -3), B = (3, -3), C = (3, 3), D = (-3, 3);15 draw(A - B - C - D - cycle);16 dot(“$A$“, A, SW);17 dot(“$B$“, B, SE);18 dot(“$C$“, C, NE);19 dot(“$D$“, D, NW);20 /求定比分点并绘制21 real t = 1/3;22 pair E = interp(A, B, t);23 pair F = interp(B, C,
17、t);24 pair G = interp(C, D, t);25 pair H = interp(D, A, t);26 draw(E - F - G - H - cycle, blue);27 arrow(“$lambda = frac13$“, E, SE, red);8角的绘制98角的绘制8.1基本角的绘制yxO 1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Ar
18、row);11 /标记原点12 label(“$O$“, origin, SW);13 /定义角的顶点以及两边上的点14 pair A = (3, 2), B = (-3, -1), C = (3, -1);15 /构造角的两边并绘制,注意射线的画法16 line BA = line(B, false, A);17 line BC = line(B, false, C);18 draw(BA, red); draw(BC, red);19 /标记角20 real markradius = 0.5 * markangleradius();21 markangle(“$alpha$“, C, B,
19、 A,22 radius = markradius, red);8角的绘制108.2绘制给定大小的角以及角平分线yxO1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /定义角的度数、顶点、以及水平边上的点14 real d = 55;15 pair B = (-3, -1), C =
20、 (3, -1);16 /算出另一边上的一点17 pair A = rotate(d, B) * C;18 /绘制角19 line BA = line(B, false, A);20 line BC = line(B, false, C);21 draw(BA, red); draw(BC, red);22 /绘制角平分线23 line bis = bisector(BA, BC);24 draw(bis, blue);25 /标记26 marker mark1=StickIntervalMarker(2, 2, blue);27 markangle(C, B, A, blue, mark1)
21、;9多边形的绘制119多边形的绘制9.1三角形的绘制9.1.1已知三边绘制三角形yxO1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /定义三角形三边长度14 real a = 5, b = 7, c = 6;15 /定义底边的一个顶点16 pair A = (-3, -2);17
22、/计算底边的另一个顶点18 pair B = A + c;19 /分别以底边的两个顶点为圆心,对应边长为半径做弧并求交点,20 path arcA = arc(A, b, 0, 90);21 path arcB = arc(B, a, 90, 180);22 pair C = intersectionpoint(arcA, arcB);23 draw(arcA, red + dashed);24 draw(arcB, red + dashed);25 /绘制三角形26 draw(A - B - C - cycle, blue);9多边形的绘制129.1.2已知两边和夹角绘制三角形yxO47 1
23、 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /定义三角形两边以及夹角14 real b = 7, c = 6, alpha = 47;15 /定义底边的一个顶点16 pair A = (-3, -2);17 /计算底边的另一个顶点18 pair B = A + c;19 /计算第三
24、个顶点;20 pair C = rotate(alpha, A) * (A + b);21 /绘制三角形22 draw(A - B - C - cycle, blue);23 /标记已知角24 real markradius = 0.5 * markangleradius();25 markangle(“$47circ$“, B, A, C,26 radius = markradius, red);9多边形的绘制139.1.3已知两角和所夹边绘制三角形yxO47 55 1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 siz
25、e(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /定义三角形两角以及夹边14 real alpha = 47, beta = 55, c = 6;15 /定义底边的一个顶点16 pair A = (-3, -2);17 /计算底边的另一个顶点18 pair B = A + c;19 /构造两底角的另一边20 line line_c = line(A, B);21 line line_b = rotate(a
26、lpha, A) * line_c;22 line line_a = rotate(-beta, B) * line_c;23 /求三角形第三个定点24 pair C = intersectionpoint(line_a, line_b);25 draw(A - B - C - cycle, blue);26 /标记已知角27 real markradius = 0.5 * markangleradius();28 markangle(“$47circ$“, B, A, C,29 radius = markradius, red);30 markangle(“$55circ$“, C, B,
27、A,31 radius = markradius, red);10有关圆的绘制1410有关圆的绘制10.1已知圆心和半径绘制圆yxO O11 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /定义圆心14 pair O1 = (1, -1);15 /定义半径16 real r = 2;1
28、7 /绘制圆18 draw(circle(O1, r), blue);19 /标记圆心20 dot(“$O_1$“, O1, blue);10有关圆的绘制1510.2过圆上一点做圆的切线yxO O1A l1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /绘制圆14 pair O1 =
29、 (2, -1);15 real r = 2;16 draw(circle(O1, r), blue);17 /标记圆心18 dot(“$O_1$“, O1, blue);19 /取圆上一点20 pair A = rotate(115, O1) * (O1 + r);21 dot(“$A$“, A, NW);22 /连接该点和圆心23 path AO1 = A - O1;24 draw(AO1, red + dashed);25 /过点做的垂线AAO126 line l = perpendicular(A, line(A, O1);27 draw(“$l$“, l, blue);28 /标记直
30、角29 markrightangle(O1, A, l.B, red + dashed);11结束语1610.3过圆外一点做圆的切线yxO O1A1 /导入绘图模块2 import graph;3 /导入几何模块4 import geometry;5 /设置尺寸6 size(5cm);7 /绘制横轴8 xaxis(“$x$“, -5, 5, Arrow);9 /绘制纵轴10 yaxis(“$y$“, -5, 5, Arrow);11 /标记原点12 label(“$O$“, origin, SW);13 /绘制圆14 pair O1 = (2, -1);15 real r = 2;16 pat
31、h C1 = circle(O1, r);17 draw(C1, blue);18 /标记圆心19 dot(“$O_1$“, O1, blue);20 /取圆外一点21 pair A = rotate(140, O1) * (O1 + r + 3);22 dot(“$A$“, A, NW);23 /连接外一点和圆心24 draw(A - O1, red + dashed);25 /以为直径做圆AO126 path C2 = circle(A + O1)/2, length(A - O1)/2);27 draw(C2, red + dashed);28 /求出两个切点29 pair P = intersectionpoints(C2, C1);30 /做出两条切线31 draw(line(A, P0), blue);32 draw(line(A, P1), blue);11结束语以上只是探索Asymptote在初中数学中应用的初步成果,希望能给大家带来一些启发。有机会的话,会继续添加更多的内容。