Mathematica能够进行平面几何绘图吗?

4

我试图使用计算机来展示一些平面几何图形。我不知道有什么软件可以做到这一点,或者mathematica是否可以轻松地生成这样的图形。

例如,我有以下要展示的图形。 给定任何三角形ABC,让AD成为角BAC的平分线并相交于BC上的D。让M成为AD的中点。让直径为AB的圆在CM处相交于F。

如何在mma中生成这些图形并显示相关的点标签?这很容易吗?请问有人可以举个例子,或者推荐一些最适合此目的的软件吗?

非常感谢。


1
如果你想使用Mma来完成这个任务(这是可以的),这里有一些示例可以帮助你入门:TriangleCentroidDistancesFromTheCentroid,以及更多关于三角形的示例。 - Simon
MathWorld packages中有一个PlaneGeometry包。这个包用于生成MathWorld中的所有几何图形。它可能可以满足你的所有需求,但需要一些时间来学习。 - Simon
这里有一个漂亮的新演示,展示了Mathematica中的一些几何内容。四线和四个外接圆 - Simon
6个回答

5
在这里,你只需要两分钟就可以使用Geometry Expressions完成图表。该软件具有许多出色的功能,包括基本几何计算和导出公式到Mathematica的界面。
绘图中的公式是由程序计算得出的。 enter image description here 该软件免费使用,但需要花费79-99美元才能保存文件。

@belisarius:看起来非常不错。 :) - Qiang Li
看起来是个不错的程序 - 可惜没有 Linux 版本。 - Simon
@Simon 这很好,但只能做二维几何。我经常使用它,因为懒惰通常会阻止我进行三角计算。Mma和MathML导出是一个很大的优点。 - Dr. belisarius
@belisarius:在wine下似乎完美运行。但我认为我更喜欢Geogebra - Simon
@Simon G Exp最好的特点是能够进行符号计算(如图中的CM部分)。Geogebra能做到这一点吗? - Dr. belisarius
@belisarius: 我不确定(这是我第一次使用它)。最新版本确实内置了CAS并且可以与Maxima交互。但是我看不到如何进行你想要的计算... - Simon

5

这里有一个使用GeoGebra快速解决你描述的问题的解决方案。

这是我第一次使用GeoGebra,制作这个大约花了我20分钟时间 - 所以这个程序相当好用和直观。 而且,它可以导出到动态、基于Java的网页。这里是您指定问题的链接:TriangleCircle
编辑
对于Mathematica演示,有很多好的例子在Plane Geometry中。 从this页面,我发现其他软件,如Cabri GeometryThe Geometer's Sketchpad

不错的链接。但是我不同意这些程序的直观性......我发现 Mma 更直观:)。尽管 WISIWIG 有时是受欢迎的! - Dr. belisarius
@Belisarius; 也许你是对的 - 我花了超过20分钟玩弄Manipulate,试图得到同样的东西,但几何函数不是Mathematica的一部分。虽然,你应该查看PlaneGeometry包,它是MathWorld packages的一部分。 - Simon

4

我想展示一下如何在Mathematica中处理这个问题。虽然编码不是最简单的,但它具有灵活性。还要注意作者在制图方面相当无能,因此可能有更简单和/或更好的方法。

offset[pt_, center_, eps_] := center + (1 + eps)*(pt - center);

pointfunc[{pt_List, center_List, ptname_String}, siz_, 
   eps_] := {PointSize[siz], Point[pt], 
   Inset[ptname, offset[pt, center, eps]]};

Manipulate[Module[
  {plot1, plot2, plot3, siz = .02, ab = bb - aa, bc = cc - bb, 
   ac = cc - aa, cen = (aa + bb)/2., x, y, soln, dd, mm, ff, lens, 
   pts, eps = .15},
  plot1 = ListLinePlot[{aa, bb, cc, aa}];
  plot2 = Graphics[Circle[cen, Norm[ab]/2.]];
  soln = NSolve[{Norm[ac]*({x, y} - aa).ab - 
       Norm[ab]*({x, y} - aa).ac == 
      0, ({x, y} - cc).({-1, 1}*Reverse[bc]) == 0}, {x, y}];
  dd = {x, y} /. soln[[1]];
  mm = (dd + aa)/2;
  soln = NSolve[{({x, y} - cen).({x, y} - cen) - ab.ab/4 == 
      0, ({x, y} - cc).({-1, 1}*Reverse[mm - cc]) == 0}, {x, y}];
  ff = {x, y} /. soln;
  lens = Map[Norm[# - cc] &, ff];
  ff = If[OrderedQ[lens], ff[[1]], ff[[2]]];
  pts = {{aa, cen, "A"}, {bb, cen, "B"}, {cc, cen, "C"}, {dd, cen, 
     "D"}, {ff, cen, "F"}, {mm, cen, "M"}, {cen, ff, "O"}};
  pts = Map[pointfunc[#, siz, eps] &, pts];
  plot3 = Graphics[Join[pts, {Line[{aa, dd}], Line[{cc, mm}]}]];
  Show[plot1, plot2, plot3, PlotRange -> {{-.2, 1.1}, {-.2, 1.2}}, 
   AspectRatio -> Full, Axes -> False]],
 {{aa, {0, 0}}, {0, 0}, {1, 1}, Locator},
 {{bb, {.8, .7}}, {0, 0}, {1, 1}, Locator},
 {{cc, {.1, 1}}, {0, 0}, {1, 1}, Locator}, 
 TrackedSymbols :> None]

这里有一张屏幕截图。

enter image description here

Daniel Lichtblau 沃尔夫勒姆研究公司


@Daniel:这太好了。:) 非常感谢。为什么圆形不是真正的圆形?删除 AspectRatio -> 1 确实有所帮助。 - Qiang Li
@Qiang Li 关于圆滑度或缺乏圆滑度的问题,这是一个很好的问题。有一些方法可以解决这个问题,但我忘记了具体是什么。同样,可以进行一些改进,以避免在移动定位器时出现“跳跃”。因此,这段代码可以进行优化。 - Daniel Lichtblau
@Qiang Li 我发现将AspectRatio->Full设置为好的行为。这可能就是所需要的。回答中的代码已经被编辑以反映这一变化。 - Daniel Lichtblau
1
@Daniel:实际上,AspectRatio -> Automatic 是我目前看到的最好的。 - Qiang Li
@Simon,那你为什么在抱怨呢?我花的时间比你长得多。(主要是因为我的图形素养不足,再加上由于忘记思考而导致解决方案出现错误。) - Daniel Lichtblau
显示剩余2条评论

2

2
正如已经提到的,Mathematica 不是最适合这个任务的软件。根据您的确切目的,有几个更好的选择可供使用。要编写此类图形程序,有几种专门适用于此类任务的语言。我建议尝试 eukleidesGCLC。如果您有 TeX/LaTeX 的任何经验,可以尝试 metapostasymptote,或者甚至是一个 LaTeX 包,例如tkz-euklide
另一方面,如果您喜欢以交互方式创建图纸,则有许多程序可供选择。在网上搜索“动态几何软件”,您应该会得到一些结果。其中我最推荐 geogebra

1

我认为我应该尝试用Mathematica解决这个问题(直到我完成后才看到Daniel的解决方案)。花费了我大约半个小时,比使用GeoGebra解决方案要长,尽管我以前从未使用过GeoGebra。

代码并不是尽可能快速的。这是因为我懒得编写查找线和圆的交点的正确代码,所以我只使用了更慢但更通用的FindInstance

可以在Eric Weinstein的 MathWorld packages中找到相当全面的平面几何包。它包括所有交点、平分线等代码,但需要一点时间学习它们。

angleBisector[A_,{B_,C_}]:=Module[{ba=Norm[B-A],ca=Norm[C-A],m},
  m=A+((B-A)/ba+(C-A)/ca)]

intersect[Line[{A_,B_}],Line[{C_,D_}]]:=Module[{s,t},
  A + s(B-A)/.First@FindInstance[A + s(B-A) == C + t(D-C), {s,t}]]
intersect[Line[{A_,B_}],Circle[p0:{x0_,y0_},r_]]:=Module[{s,x,y},
  A + s(B-A)/.FindInstance[A + s(B-A) == {x,y} 
  && Norm[p0-{x,y}] == r, {s,x,y}, Reals, 2]]

Manipulate[Module[{OO,circ,tri,angB,int,mid,FF},
  OO=(AA+BB)/2;
  circ=Circle[OO,Norm[AA-BB]/2];
  tri=Line[{AA,BB,CC,AA}];
  angB=angleBisector[AA,{BB,CC}];
  int=intersect[Line[{BB,CC}],Line[{AA,angB}]];
  mid=(AA+int)/2;
  FF=intersect[Line[{CC,mid}],Circle[OO,Norm[AA-BB]/2]];
  Graphics[{PointSize[Large],Point[{OO,int,mid}],Point[FF],tri,circ,
    Line[{AA,AA+3(angB-AA)}],Line[{CC,CC+3(mid-CC)}],
    Text["A",AA,{2,-2}],Text["B",BB,{-2,-2}],Text["C",CC,{2,2}],
    Text["O",OO,{0,-2}],Text["D",int,{-2,-1}],Text["M",mid,{-2,-1}]},
    PlotRange->{{-2,2},{-2,2}}]],
  {{AA,{-1,1}},Locator},
  {{BB,{1,1}},Locator},
  {{CC,{0,-1}},Locator}]

TriangleCircle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接