水倒入圆柱:体积—高度关系的建模与变化
几何画板及绘图内容加载中,请稍等……
本范例通过“向圆柱内注水”的可视化过程,展示圆柱内水的体积与水面高度之间的对应关系,并观察量随时间(或注入过程参数)的变化。核心数学概念包括:圆柱几何的体积与高度比例关系、把参数变化映射到几何量(h 与 vol)的函数/导数分析,以及用于描述极值或变化趋势的数值计算思想。作图在 GeoGebra 中综合使用了多种几何对象与度量:用 Derivative 表示导数刻画变化率(与注入速度相关的瞬时变化);用 Max 结合相关量(如最大高度/半径尺度)用于趋势与极值判断;几何骨架由 Circle、Line、Intersect、Segment、Ellipse、Polygon、Arc、Rotate 等建立圆柱横截面及几何辅助结构;用 OrthogonalLine、Angle、Distance 实现角度与长度等度量;再通过 Sequence 生成随参数变化的数值序列,并用 IntegralBetween 表示在区间上的累积量(对应从“注入开始到当前”的体积/高度累计效应);同时使用 Vector、Text 对关键量与方向进行标注说明。该内容适合中学高阶拓展到本科微积分/建模入门阶段,用于课堂演示、建模训练与可视化理解体积-高度关系。
GeoGebra 命令及参数
Derivative(w) → rMax(r, 0, tmax) → maxrptCircle(pcenter, 5) → pcircleLine(pcenter, (x(pcenter) + 1, y(pcenter))) → phlineIntersect(pcircle, phline, 2) → phlineptRotate(phlinept, pth, pcenter) → phlinept2Line(pcenter, phlinept2) → phline3Intersect(pcircle, phline3, 1) → ppt1OrthogonalLine(ppt1, phline3) → phline4Point(phline4) → ptippt1Circle(pcenter, ptipcircleradius) → ptipcircleSegment(pcenter, ptippt1) → ptiplineIntersect(ptipcircle, ptipline) → ptippt,Distance(ptippt, pcenter) → ptipradiusAngle(phlinept, pcenter, phlinept2) → pouranglePoint({cradius, 0}) → cpt1Point({(-cradius), 0}) → cpt2Point({(-cradius), cheight}) → cpt3Segment(cpt2, cpt3) → cleftsegPoint({0, wheight}) → wheightptPoint({cradius, wheight}) → wheightpt1Point({(-cradius), wheight}) → wheightpt2Point({0, cheight - cscalemin}) → cptellipsemidtopEllipse((x(cpt) - 0.02, cheight), (x(cpt3) + 0.02, cheight), cptellipsemidtop) → cellipsetopSegment(cpt1, cpt) → crightsegPoint({0, wheight - (cscalemax - (wheight / cheight * cscalerange))}) → wptellipsemidEllipse((x(wheightpt1) - 0.02, wheight), (x(wheightpt2) + 0.02, wheight), wptellipsemid) → wellipsetopPoint({0, (-cscalemax)}) → cptellipsemidbottomEllipse((x(cpt1) - 0.02, 0), (x(cpt2) + 0.02, 0), cptellipsemidbottom) → cellipsebottomPolygon(wheightpt1, cpt1, cpt2, wheightpt2) → cwater, wheightpt1_1, cpt1_1, cpt2_1, wheightpt2_1Arc(cellipsebottom, cpt2, cpt1) → warcbottomArc(wellipsetop, wheightpt1, wheightpt2) → warctopPoint({((sscale * rscale) * r(t)), wheight}) → spt1Point({(((-sscale) * rscale) * r(t)), wheight}) → spt2Circle(pcenter, ptipradius - (((spscale * rscale) * ptipradius) * r(t))) → scircleIntersect(scircle, ptipline) → spt3,Polygon(ptippt, spt3, spt1, spt2) → swater, ptippt_1, spt3_1, spt1_1, spt2_1Point({0, wheight - (0.2 * (cscalemax - (wheight / cheight * cscalerange)))}) → sellipseptEllipse(spt1, spt2, sellipsept) → sellipseArc(sellipse, spt2, spt1) → sarcArc(sellipse, spt2, spt1) → ssplashArc(cellipsetop, cpt3, cpt) → cellipsetoparcSequence(hstart + (k * dh), k, 0, n) → wheightsSequence(Point[{0, Element[wheights, k] - (cscalemax - (Element[wheights, k] / cheight * cscalerange))}], k, 2, n + 1) → wellipsemidptsSequence(Ellipse[((-cradius) + 0.02, Element[wheights, k]), (cradius - 0.02, Element[wheights, k]), Element[wellipsemidpts, k - 1]], k, 2, n + 1) → wellipsesArc(cellipsebottom, cpt2, cpt1) → carcbottomSequence(Arc[Element[wellipses, k], ((-cradius), Element[wheights, k + 1]), (cradius, Element[wheights, k + 1])], k, 1, n) → warcfrontSequence(Arc[Element[wellipses, k], (cradius, Element[wheights, k + 1]), ((-cradius), Element[wheights, k + 1])], k, 1, n) → warcbackIntegralBetween(whitetopline, efuntop, (-cradius), cradius) → whitetopIntegralBetween(efunbottom, whitebottomline, (-cradius), cradius) → whitebottomPoint({0, hstart - (cscalemax - (hstart / cheight * cscalerange))}) → wptstartellipsemidEllipse(((-cradius) + 0.02, hstart), (cradius - 0.02, hstart), wptstartellipsemid) → wstartellipseArc(wstartellipse, ((-cradius) + 0.02, hstart), (cradius - 0.02, hstart)) → wstartfrontellipseArc(wstartellipse, (cradius - 0.02, hstart), ((-cradius) + 0.02, hstart)) → wstartbackellipseSequence(Segment[((-cradius) - 0.36, Element[wheights, k]), ((-cradius) - 0.08, Element[wheights, k])], k, 1, n + 1) → hlinesSequence(Vector[((-cradius) - 0.22, Element[wheights, k]), ((-cradius) - 0.22, Element[wheights, k + 1])], k, 1, n) → wvecsVector(((-cradius) - 0.22, (n * dh) + hstart), ((-cradius) - 0.22, wheight)) → wlastvecSegment(((-cradius) - 0.08, 0), ((-cradius) - 0.36, 0)) → wstartlineSegment(((-cradius) - 0.36, wheight), ((-cradius) - 0.08, wheight)) → hendlinePolygon(((-2 * cradius), ((j + 1) * dh) + hstart + 0.008), ((-2 * cradius), 10), ((-cradius) + 0.006, 10), ((-cradius) + 0.006, ((j + 1) * dh) + hstart + 0.008)) → cwhitetoprec, wr3, wr4, wr5, wr6Polygon(((-2 * cradius), (j * dh) + hstart - 0.008), ((-2 * cradius), -10), ((-cradius) + 0.006, -10), ((-cradius) + 0.006, (j * dh) + hstart - 0.008)) → cwhitebottomrec, f, g, h, iPolygon(((2 * cradius), (j * dh) + hstart - 0.008), ((2 * cradius), -10), (cradius - 0.006, -10), (cradius - 0.006, (j * dh) + hstart - 0.008)) → cwhitebottomrecright, wr11, wr12, wr1, wr2Polygon(((2 * cradius), ((j + 1) * dh) + hstart + 0.008), ((2 * cradius), 10), (cradius - 0.006, 10), (cradius - 0.006, ((j + 1) * dh) + hstart + 0.008)) → cwhiteroprecright, k, l, q, cVector(((-cradius) - 0.22, 0), ((-cradius) - 0.22, hstart)) → wstartvecVector(((-cradius) - 0.22, hstart), ((-cradius) - 0.22, wheight)) → wvecSegment(((-cradius) - 0.08, hstart), ((-cradius) - 0.36, hstart)) → hstartlinePolygon((qxloc + ((p * dh) * j) - qos, -10), (qxloc - 2, -10), (qxloc - 2, 10), (qxloc + hstart + (j * dh) - qos, 10), (qxloc + hstart + (j * dh) - qos, qhloc - 0.16), (qxloc + ((p * dh) * j) - qos, qvloc + 0.16)) → qwhitebefore, d, e, f_1, g_1, h_1, i_1Polygon((qxloc + ((p * dh) * (j + 1)) + qos, -10), ((-2 * cradius), -10), ((-2 * cradius), 10), (qxloc + hstart + ((j + 1) * dh) + qos, 10), (qxloc + hstart + ((j + 1) * dh) + qos, qhloc - 0.16), (qxloc + ((p * dh) * (j + 1)) + qos, qvloc + 0.16)) → qwhiteafter, s, j_1, k_1, l_1, m_1, n_1Sequence(Point[{-0.18, y(Element[wellipsemidpts, k]) + (y(Element[wellipsemidpts, k + 1]) - y(Element[wellipsemidpts, k])) / 2 + 0.12}], k, 1, n) → cdvlabelptsSequence(Text["\Delta v", Element[cdvlabelpts, k], true, true], k, 1, n) → cdvlabelsPoint({-0.18, y(wptstartellipsemid) + (y(Element[wellipsemidpts, 1]) - y(wptstartellipsemid)) / 2 + 0.12}) → cdvlabelstartptPoint({-0.18, y(Element[wellipsemidpts, n]) + (y(wptellipsemid) - y(Element[wellipsemidpts, n])) / 2 + 0.12}) → cdvlabelendptText("\Delta v", cdvlabelstartpt, true, true) → cdvlabelstartText("\Delta v", cdvlabelendpt, true, true) → cdvlabelendSequence(Point[{(-cradius) - 0.7, Element[wheights, k] + dh / 2 + 0.12}], k, 1, n) → cdhlabelptsSequence(Text["\Delta h", Element[cdhlabelpts, k], true, true], k, 1, n) → cdhlabelsPoint({(-cradius) - 0.7, Element[wheights, n + 1] + (wheight - Element[wheights, n + 1]) / 2 + 0.12}) → cdhlabelendptText("\Delta h", cdhlabelendpt, true, true) → cdhlabelendSequence(Point[{qxloc + Element[wheights, k] + (1 / 2 * dh) - 0.12, qhloc + 0.34}], k, 1, n) → qdhlabelptsPoint({qxloc + Element[wheights, n + 1] + (wheight - Element[wheights, n + 1]) / 2 - 0.12, qhloc + 0.34}) → qdhlabelendptSequence(Text["\Delta h", Element[qdhlabelpts, k], true, true], k, 1, n) → qdhlabelsText("\Delta h", qdhlabelendpt, true, true) → qdhlabelendSequence(Point[{qxloc + ((p * dh) * (k - 1 / 2)) - 0.135, qvloc - 0.16}], k, 1, n) → qdvlabelptsPoint({qxloc + ((p * dh) * n) + (vol - ((p * dh) * n)) / 2 - 0.135, qvloc - 0.16}) → qdvlabelendptText("\Delta v", qdvlabelendpt, true, true) → qdvlabelendSequence(Text["\Delta v", Element[qdvlabelpts, k], true, true], k, 1, n) → qdvlabelsPoint({-0.26, hstart + (wheight - hstart) / 2 + 0.07}) → cvlabelptText("\Delta v", cvlabelpt, true, true) → cvlabelPoint({(-cradius) - 0.85, hstart + (wheight - hstart) / 2 + 0.2}) → chlabelptText("\Delta h", chlabelpt, true, true) → chlabelPoint({qxloc + vol / 2 - 0.18, qvloc - 0.14}) → qvlabelptText("\Delta v", qvlabelpt, true, true) → qvlabelPoint({qxloc + hstart + (wheight - hstart) / 2 - 0.17, qhloc + 0.38}) → qhlabelptText("\Delta h", qhlabelpt, true, true) → qhlabelSegment((qxloc + vol, qvloc + 0.16), (qxloc + vol, qvloc - 0.16)) → qvendlineVector((qxloc, qvloc), (qxloc + vol, qvloc)) → qvvecSegment((qxloc, qvloc + 0.16), (qxloc, qvloc - 0.16)) → qvstartlineSegment((qxloc + wheight, qhloc - 0.16), (qxloc + wheight, qhloc + 0.16)) → qhendlineVector((qxloc + hstart, qhloc), (qxloc + wheight, qhloc)) → qhvecSegment((qxloc + hstart, qhloc - 0.16), (qxloc + hstart, qhloc + 0.16)) → qhstartlineSegment((qxloc, qhloc - 0.16), (qxloc, qhloc + 0.16)) → qwstartlineSegment((qxloc + vol, qvloc + 0.16), (qxloc + wheight, qhloc - 0.16)) → quplinelastSegment((qxloc, qvloc + 0.16), (qxloc + hstart, qhloc - 0.16)) → quplinefirstSegment((qxloc + hstart + vol, qhloc + 0.16), (qxloc + hstart + vol, qhloc - 0.16)) → qonhendlineSequence(Segment[(qxloc + hstart + (k * vol), qhloc + 0.16), (qxloc + hstart + (k * vol), qhloc - 0.16)], k, 0, m) → qonhlinesSegment((qxloc + vol, qvloc + 0.16), (qxloc + hstart + vol, qhloc - 0.16)) → qonhenduplineSequence(Segment[(qxloc + Element[wheights, k], qhloc - 0.16), (qxloc + Element[wheights, k], qhloc + 0.16)], k, 1, n + 1) → qhlinesSequence(Vector[(qxloc + ((p * dh) * k), qvloc), (qxloc + ((p * dh) * (k + 1)), qvloc)], k, 0, n - 1) → qvvecsVector((qxloc + ((p * dh) * n), qvloc), (qxloc + vol, qvloc)) → qvlastvecSequence(Segment[(qxloc + ((p * dh) * k), qvloc + 0.16), (qxloc + ((p * dh) * k), qvloc - 0.16)], k, 0, n) → qvlinesSequence(Segment[(qxloc + ((p * dh) * k), qvloc + 0.16), (qxloc + Element[wheights, k + 1], qhloc - 0.16)], k, 0, n) → quplinesVector((qxloc + vol, qvloc), (qxloc + vol, qvloc + wheight - hstart)) → quphvecSequence(Point[{qxloc + ((p * dh) * k), qvloc + dh}], k, 1, n) → qupvecptsSequence(Point[{qxloc + Element[wheights, k], qhloc}], k, 2, n + 1) → qhvecendptsSequence(Point[{x(Element[qhvecendpts, k]) + (rot * (x(Element[qupvecpts, k]) - x(Element[qhvecendpts, k]))), y(Element[qhvecendpts, k]) + (rot * (y(Element[qupvecpts, k]) - y(Element[qhvecendpts, k])))}], k, 1, n) → qhvecptsSequence(Vector[((dh * cos(π + rota)) + x(Element[qhvecpts, k]), (dh * sin(π + rota)) + y(Element[qhvecpts, k])), Element[qhvecpts, k]], k, 1, n) → qhrotvecsPoint({qxloc + wheight, qhloc}) → qhlastptPoint({qxloc + vol, qvloc + wheight - (n * dh) - hstart}) → quplastptPoint({x(qhlastpt) + (rot * (x(quplastpt) - x(qhlastpt))), y(qhlastpt) + (rot * (y(quplastpt) - y(qhlastpt)))}) → qhlastvecptVector(((qhlastveclength * cos(π + rota)) + x(qhlastvecpt), (qhlastveclength * sin(π + rota)) + y(qhlastvecpt)), qhlastvecpt) → qhlastrotvecVector((((dh + hstart) * cos(π + rota)) + qxloc + hstart + dh - (rot * (hstart + dh)), ((dh + hstart) * sin(π + rota)) + qhloc - (rot * (qhloc - (qvloc + dh)))), ((dh * cos(π + rota)) + qxloc + hstart + dh - (rot * (hstart + dh)), (dh * sin(π + rota)) + qhloc - (rot * (qhloc - (qvloc + dh))))) → qhstartvec
AI 绘图提示语参考
绘制一个圆柱倒水的动态几何剖面:先画圆柱侧视的圆(圆心在水平中心线上,半径为常量),再取经过圆心的切/水平参考线,并用旋转得到一组相关直线交点作为入水方向。以该方向与圆的交点构造圆弧表示液面上边界,并在圆柱内部用多段折线/多边形表示水体。给出竖直的高度位置点,沿高度生成一列由椭圆构成的“液面截面”带;每个高度截面用上下两条椭圆弧与底部圆弧拼成顶部波形。最后加入从高度位置到圆周的连段与测量量的可视化标注弧线,体现水高随体积变化的几何建模过程。
以上提示语为根据原始绘图命令整理而来,仅供参考。