我试图使用计算机来展示一些平面几何图形。我不知道有什么软件可以做到这一点,或者mathematica是否可以轻松地生成这样的图形。
例如,我有以下要展示的图形。 给定任何三角形ABC,让AD成为角BAC的平分线并相交于BC上的D。让M成为AD的中点。让直径为AB的圆在CM处相交于F。
如何在mma中生成这些图形并显示相关的点标签?这很容易吗?请问有人可以举个例子,或者推荐一些最适合此目的的软件吗?
非常感谢。
我试图使用计算机来展示一些平面几何图形。我不知道有什么软件可以做到这一点,或者mathematica是否可以轻松地生成这样的图形。
例如,我有以下要展示的图形。 给定任何三角形ABC,让AD成为角BAC的平分线并相交于BC上的D。让M成为AD的中点。让直径为AB的圆在CM处相交于F。
如何在mma中生成这些图形并显示相关的点标签?这很容易吗?请问有人可以举个例子,或者推荐一些最适合此目的的软件吗?
非常感谢。
这里有一个使用GeoGebra快速解决你描述的问题的解决方案。
这是我第一次使用GeoGebra,制作这个大约花了我20分钟时间 - 所以这个程序相当好用和直观。 而且,它可以导出到动态、基于Java的网页。这里是您指定问题的链接:TriangleCircle。Manipulate
,试图得到同样的东西,但几何函数不是Mathematica的一部分。虽然,你应该查看PlaneGeometry包,它是MathWorld packages的一部分。 - Simon我想展示一下如何在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]
这里有一张屏幕截图。
Daniel Lichtblau 沃尔夫勒姆研究公司
AspectRatio -> 1
确实有所帮助。 - Qiang LiAspectRatio -> Automatic
是我目前看到的最好的。 - Qiang LiMathematica不是最适合这个任务的软件,但它仍然可以胜任。
http://demonstrations.wolfram.com/DrawingATriangle/有一个非常好的三角形源代码示例,你可以参考该示例将一条角平分线添加到代码中。
我认为我应该尝试用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}]
PlaneGeometry
包。这个包用于生成MathWorld中的所有几何图形。它可能可以满足你的所有需求,但需要一些时间来学习。 - Simon