может ли mathematica построить планарную геометрию?

Я пытаюсь использовать компьютер, чтобы показать некоторые графики плоской геометрии. Я не знаю, какое программное обеспечение может это сделать, и может ли mathematica легко создавать такие графики.

Например, у меня есть следующий сюжет, чтобы показать. Для любого треугольника ABC пусть AD будет прямой, разделяющей угол BAC пополам и пересекающей BC в точке D. Пусть M будет серединой AD. Пусть окружность, диаметр которой равен АВ, пересекает СМ в точке F.

Как создать эти графики и показать соответствующую маркировку точек в mma? Легко ли это сделать? Может ли кто-нибудь привести пример или дать рекомендации относительно того, какое программное обеспечение лучше всего подходит для этих целей?

Большое спасибо.


person Qiang Li    schedule 22.02.2011    source источник
comment
Если вы хотите использовать для этого Mma (это нормально), вот несколько демонстраций для начала: TriangleCentroid, DistancesFromTheCentroid и многое другое на Треугольники   -  person Simon    schedule 23.02.2011
comment
@Simon: спасибо за подсказки.   -  person Qiang Li    schedule 23.02.2011
comment
Пакет PlaneGeometry входит в состав пакетов MathWorld. Это используется для создания всех геометрических фигур в MathWorld. Это, вероятно, может делать все, что вы хотите, но потребуется некоторое время, чтобы научиться.   -  person Simon    schedule 26.02.2011
comment
Вот хорошая новая демонстрация, показывающая некоторую геометрию в Mathematica. Четыре линии и четыре окружности.   -  person Simon    schedule 24.03.2011


Ответы (6)


Я подумал, что покажу, как можно подойти к этому в 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]

Вот снимок экрана.

введите здесь описание изображения

Даниэль Лихтблау Wolfram Research

person Daniel Lichtblau    schedule 24.02.2011
comment
@Daniel: это так мило. :) Большое спасибо. Почему круг на самом деле не круглый? Удаление AspectRatio -> 1 помогло. - person Qiang Li; 25.02.2011
comment
@Qiang Li Хороший вопрос об этой округлости или ее отсутствии. Есть способ решить эту проблему, но я забыл, что это такое. Точно так же можно внести некоторые улучшения, чтобы избежать дрожания при перемещении локаторов. Так что этот код можно было бы отшлифовать. - person Daniel Lichtblau; 25.02.2011
comment
@Daniel: пожалуйста, дайте мне знать, если вы найдете способ решить обе проблемы. Я жажду знать! Большое спасибо. - person Qiang Li; 25.02.2011
comment
@Qiang Li Я считаю, что настройка AspectRatio-›Full обеспечивает хорошее поведение. Это может быть все, что нужно. Код в ответе отредактирован, чтобы отразить это изменение. - person Daniel Lichtblau; 26.02.2011
comment
@Daniel: на самом деле AspectRatio -> Automatic - лучшее, что я когда-либо видел. - person Qiang Li; 26.02.2011
comment
@Daniel: Черт возьми! Я только что потратил полчаса, в основном повторяя это! - person Simon; 26.02.2011
comment
@ Саймон Так почему ты жалуешься? Это заняло у меня гораздо больше времени. (В основном моя графическая безграмотность, дополненная ошибками в решении из-за того, что я забываю думать о том, что я делаю.) - person Daniel Lichtblau; 26.02.2011

Вот ваш график с геометрическими выражениями готов за две минуты. Он имеет много приятных функций, в том числе расчеты элементарной геометрии и интерфейс для экспорта формул в Mathematica.

Формула на чертеже рассчитана программой.

введите описание изображения здесь

Бесплатное использование, 79–99 долларов США, чтобы иметь возможность сэкономить.

person Dr. belisarius    schedule 22.02.2011
comment
@belisarius: выглядит очень красиво. :) - person Qiang Li; 23.02.2011
comment
Вроде неплохая программа - жаль, что нет линуксовой версии. - person Simon; 23.02.2011
comment
@Simon Это хорошо, но можно делать только 2D-геометрию. Я часто им пользуюсь, так как лень обычно запрещает мне заниматься тригонометрическими вычислениями. Экспорт Mma и MathML — большой плюс. - person Dr. belisarius; 23.02.2011
comment
@belisarius: Кажется, он отлично работает под wine. Но я думаю, что предпочитаю Geogebra. - person Simon; 23.02.2011
comment
@Simon Самая приятная особенность G Exp - это возможность выполнять символьные вычисления (как сегмент CM на рисунке). Делает ли это Geogebra? - person Dr. belisarius; 23.02.2011
comment
@belisarius: я не уверен (я впервые с этим играю). Последняя версия имеет встроенный CAS и может взаимодействовать с Maxima. Но я не вижу, как выполнить расчет, который вы хотите... - person Simon; 26.02.2011

Вот очень быстрое решение описанной вами проблемы с использованием GeoGebra.

Это первый раз, когда я использовал GeoGebra, и это заняло у меня около 20 минут, так что программа довольно хорошо сделана и интуитивно понятна. Более того, он может экспортировать в динамические веб-страницы на основе Java. Вот вариант для указанной вами проблемы: TriangleCircle.

Редактировать

Для демонстрации Mathematica есть много хороших примеров в Plane Geometry. На этой странице я нашел другое программное обеспечение, такое как Cabri Geometry и Блокнот геометра.

person Simon    schedule 23.02.2011
comment
Хорошие ссылки. Но я не согласен с интуитивностью этих программ ... Я нахожу Mma гораздо более интуитивно понятным :). Хотя WISIWIG иногда приветствуется! - person Dr. belisarius; 25.02.2011
comment
@Велисарий; Может быть, вы правы — я провел более 20 минут, играя с Manipulate, пытаясь получить то же самое, но геометрические функции не являются частью Mathematica. Однако вам следует проверить пакет PlaneGeometry, который является частью пакетов MathWorld. - person Simon; 26.02.2011

Mathematica — не лучшая программа для этого, хотя и она сработает.

На http://demonstrations.wolfram.com/DrawingATriangle/ есть исходный код действительно красивого треугольника, и следуя этому примеру, вы можете добавить в код линию, разделяющую пополам.

person Laxsnor    schedule 22.02.2011

Как уже было сказано, Mathematica не лучший софт для этого. Есть несколько лучших вариантов, которые вы можете использовать, в зависимости от вашей конкретной цели. Для программной генерации таких фигур существует несколько специально приспособленных для таких задач языков. Я бы рекомендовал попробовать eukleides или GCLC. Если у вас есть опыт работы с TeX/LaTeX, вы можете просмотреть metapost или asymptote или даже пакет LaTeX, такой как tkz-euklide.

С другой стороны, если вы предпочитаете создавать свои рисунки интерактивным способом, существует ряд доступных программ. Поищите в Интернете «программное обеспечение для динамической геометрии», вы должны получить несколько совпадений. Из них я бы больше всего рекомендовал geogebra.

person Community    schedule 22.02.2011

Я подумал, что действительно должен попытаться решить эту задачу в Mathematica (только когда я закончил, я увидел решение Даниэля). Это заняло у меня около получаса, что больше, чем у моего решения GeoGebra, несмотря на то, что я никогда раньше не пользовался GeoGebra.

Код не так быстр, как мог бы быть. Это потому, что мне было лень писать правильный код для поиска пересечений линий и окружностей, поэтому я просто использовал более медленный, но более общий FindInstance.

Достаточно полный пакет плоской геометрии можно найти как часть пакетов MathWorld Эрика Вайнштейна. Он включает в себя весь код пересечения, деления пополам и т. д., который вы могли бы захотеть, но изучение всего этого заняло бы немного времени.

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

person Simon    schedule 26.02.2011