电脑
Mathematica
Locator[{x,y}]表示在点{x,y}处设置一个定位器。这里所谓的定位器,可以用鼠标拖动,就像是几何画板上面的自由点。例如,在原点设置定位器:Graphics[Locator[{0, 0}], PlotRange -> 2]
随着定位器的移动,其对应的坐标也发生变化,下面就把坐标的变化显示出来:DynamicModule[{p = {0, 0}}, {Graphics[Locator[Dynamic[p]], PlotRange -> 2], Dynamic[p]}]
在点(1,1)处放置定位器,且与原点连结线段,当拖动定位器的时候,线段也随时发生变化:Manipulate[ Graphics[Line[{{0, 0}, p}], PlotRange -> 2], {{p, {1, 1}}, Locator}]
把定位器设置成字母的模样:Show[Graphics[Locator[{0, 0}, Style['A', FontSize -> 20]], PlotRange -> 2], Graphics[Locator[{0, 1}, Style['B', FontSize -> 20]], PlotRange -> 2]] 图中的字母“A”和“B”就是定位器。
再用三个蓝色的同心圆作为定位器:l = Graphics[{Blue, Table[Circle[{0, 0}, i], {i, 3}]}, ImageSize -> 20];Graphics[Locator[{0, 0}, l], PlotRange -> 1]
把定位器局限在一个蓝色圆盘的边界上,用鼠标拖动定位器的时候,定位器只能在圆盘边界转动:Deploy[DynamicModule[{p = {1, 0}}, Graphics[{Lighter[Blue], Disk[], Locator[Dynamic[p, (p = Normalize[#]) &]]}, PlotRange -> 2.0]]]
指定定位器不同的型号,放在同一个列表里加以比较:Table[Graphics[ Locator[{0, 0}, Appearance -> p]], {p, {Tiny, Small, Medium, Large}}]
用AutoAction ,定位器会黏到鼠标上:DynamicModule[{p = {0.5, 0.5}}, {Graphics[ Locator[Dynamic[p], AutoAction -> True], PlotRange -> 2], Dynamic[p]}]
给定位器加上彩色背景,放在列表里加以比较:Table[Graphics[ Locator[{0, 0}, Background -> c]], {c, {Pink, Green, Gray, Yellow}}]
让定位器的背景颜色随着位置的改变而改变:DynamicModule[{pt = {0, 0}}, Framed@Graphics[ Locator[Dynamic[pt], Background -> Dynamic[Hue[Norm[pt]]]], PlotRange -> 1]]
用数字指定定位器的大小,放在列表里比较:Table[Graphics[ Locator[{0, 0}, ImageSize -> m]], {m, {10, 30, 50, 80}}]
两个定位器之间连线段,并实时显示线段的长度和斜率:DynamicModule[{p1 = {0, 0}, p2 = {1, 1}}, {Dynamic@ Graphics[{Arrow[{p1, p2}], Locator[Dynamic[p1]], Locator[Dynamic[p2]]}, PlotRange -> 2], Dynamic[Grid[{{'Length:', EuclideanDistance[p1, p2]}, {'Slope:', 1/Divide @@ (p2 - p1)}}]]}]
用定位器与原点的连线作为共轭直径来绘制椭圆:DynamicModule[{v1 = {2, 0}, v2 = {-1, 1}}, Dynamic@Graphics[{Circle[], Red, GeometricTransformation[Circle[], Transpose[{v1, v2}]], Green, Line[{{0, 0}, v1}], Line[{{0, 0}, v2}], Locator[Dynamic[v1]], Locator[Dynamic[v2]]}, PlotRange -> 3]]
让定位器参入曲线的插值拟合:DynamicModule[{pts = {{0, 0}, {1, 1}, {2, 0}, {3, 2}}}, LocatorPane[Dynamic[pts], Dynamic[Plot[InterpolatingPolynomial[pts, x], {x, 0, 3}, PlotRange -> 3]]]]
用定位器的坐标定义的Julia分形粗略图:DynamicModule[{pt = {0.25, 0.25}, julia}, julia[z_] := Abs@Table[ NestWhile[#^2 + z &, i + I j, Abs[#] < 4 &, 1, 20], {i, -1, 1, .05}, {j, -1, 1, .05}]; Framed@Dynamic@ Graphics[{Raster[ julia[Complex @@ pt], {pt - {.5, .5}, pt + {.5, .5}}], Locator[Dynamic[pt]]}, PlotRange -> 1]]
用定位器绘制多焦点曲线——把不同的焦点设为定位器,并且把定位器用不同的字母表示: 三焦点曲线——Manipulate[xy = {x, y}; Show[ContourPlot[ Norm[xy - a] + Norm[xy - b] + Norm[xy - c] == p, {x, -3, 3}, {y, -3, 3}], Graphics[Line[{a, b, c, a}], PlotRange -> 3]], {{a, {0, 0}}, Locator, Appearance -> 'A'}, {{b, {0, 1}}, Locator, Appearance -> 'B'}, {{c, {1, 1}}, Locator, Appearance -> 'C'}, Dynamic[a], Dynamic[b], Dynamic[c], {p, 2, 10}] 四焦点曲线——Manipulate[xy = {x, y}; Show[ContourPlot[ Norm[xy - a] + Norm[xy - b] + Norm[xy - c] + Norm[xy - d] == p, {x, -3, 3}, {y, -3, 3}], Graphics[Line[{a, b, c, d, a}], PlotRange -> 3]], {{a, {0, 0}}, Locator, Appearance -> 'A'}, {{b, {0, 1}}, Locator, Appearance -> 'B'}, {{c, {1, 1}}, Locator, Appearance -> 'C'}, {{d, {1, 0}}, Locator, Appearance -> 'D'}, {p, 2.85, 10}]
用Mathematica处理几何问题,不学定位器,就亏啦!
多焦点曲线的代码需要优化。明显卡顿,尤其是当焦点(定位器)多于5个的时候,Mathematica几乎gu yong不动了!