Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Mathematica 5. ╨б╨░╨╝╨╛╤Г╤З╨╕╤В╨╡╨╗╤М

.pdf
Скачиваний:
1
Добавлен:
19.11.2023
Размер:
33.75 Mб
Скачать

i

Окружности, эллипсы, их дуги, диски и сектора

Окружность и ее дуга — примитив Circle

Дугу окружности создает графический примитив Circle [ {х, у}, г, {thl,th2}]. Здесь {х,у} — координаты центра окружности, г — радиус, {thl,th2} — граничные значения полярного угла. Чтобы нарисовать окружность, достаточно вызвать прими­ тив Circle[{х,у}, г]. Ниже представлено произведение искусства, состоящее ис­ ключительно из окружностей.

Rtheta [t_]= {Cos [t],Sin[t] }; Module [{n=8, m=40, r=10,1=3, k=l},

Module[{R=l*r}, Module[{Rl=(R+k*r)/2,rl=(R-k*r)/2},

Show[Graphics[

Circle[{0,0},R+r+r/5]], Table[Graphics[Circle[{0,0},R+r+i/20+r/10]], {±,1,10}], Table[Table[Graphics[

Circle[Rl*Rtheta[i*2*Pi/n]+rl*Rtheta[i*2*Pi/n+j/m*Pi],r]], {i,0,n-1}],{j,0,m-1}],AspectRatio->l,PlotRange->All]]]];

Мультимедиа: геометрия, графика, кино, звук

251

Чтобы было легче разобраться в этом шедевре, скажу, что он состоит из п = 8 се­ мейств малых окружностей, вокруг которых имеется два “обода”. Внешний (тонкий) обод — окружность. Внутренний (толстый) обод — семейство концентрических ок­ ружностей. Эти два обода как бы служат рамкой для шедевра. Сам шедевр состоит из л = 8 семейств маленьких окружностей, центры которых также лежат на окружности. Теперь, чтобы разобраться в шедевре, достаточно знать значения следующих величин, использованных при его построении:

/7 = 8 — количество семейств маленьких окружностей; /л = 40 — количество маленьких окружностей в каждом семействе;

г= 10 — радиус маленьких окружностей;

§= 1г— расстояние от начала координат до наиболее удаленного (от начала коор­

динат) конца проведенного через начало координат диаметра окружности, на кото­ рой расположены центры маленьких окружностей; в программе положено / = 3; / — номер семейства окружностей; отсчет номера начинается с 0;

J — номер маленькой окружности в семействе; отсчет номера начинается с 0; Rtheta[t] — вектор с координатами {Cos[t], Sin [t]};

i*2*Pi/n — угол между осью абсцисс и отрезком, соединяющим начало коорди­ нат с центром окружности, на которой расположены центры маленьких окружнос­ тей /-го семейства;

R*Rtheta[i*2*Pi/n] — координаты наиболее удаленного (от начала координат) конца проведенного через начало координат диаметра окружности, на которой расположены центры маленьких окружностей /-го семейства; кг — расстояние от начала координат до ближайшего (к началу координат) конца

проведенного через начало координат диаметра окружности, на которой располо­ жены центры маленьких окружностей; в программе положено к = 1; k*r*Rtheta[i*2*Pi/n] — координаты ближайшего (к началу координат) конца проведенного через начало координат диаметра окружности, на которой располо­ жены центры маленьких окружностей /-го семейства;

Rl = (R+k*r) /2 — радиус окружности, на которой находятся центры тех окруж-j

ностей, на которых расположены центры маленьких окружностей семейств;

!

Rl*Rtheta [i*2*Pi/n] = (R+k*r) *Rtheta [i*2*Pi/n] /2 — координаты

середи­

ны проведенного через начало координат диаметра окружности, на которой распо­ ложены центры маленьких окружностей /-го семейства; иными словами, это центр той окружности, на которой лежат центры окружностей /-го семейства;

г 1 = (R-k*r) /2 — радиус окружности, на которой расположены центры малень­ ких окружностей семейства;

Rl*Rtheta[i*2*Pi/n]+rl*Rtheta[i*2*Pi/n+j/m*Pi] — координаты центра у-й окружности /-го семейства.

Здесь умышленно сохранено большое количество параметров, так как это облегча­ ет подбор нужного рисунка. Ниже изменены только два параметра.

Rtheta[t_]={Cos[t],Sin[t]}; Module[{n=8,m=30,r=10,l=3,k=1.2},

Module[{R=l*r},

Module[{Rl=(R+k*r)/2, rl=(R-k*r)/2}, Show[Graphics[

* Circle[{0,0},R+r+r/5]],

Table[Graphics[Circle[{0,0},R+r+i/20+r/10]],{i,1,10}],

Table[Table[Graphics[ Circle[Rl*Rtheta[i*2*Pi/n]+rl*Rtheta[i*2*Pi/n+j/m*Pi],r]),

{i,0,n-l}],{j,0,m-l}],AspectRatio->l,PlotRange->All]]]];

252

Глава 9

На представленном ниже рисунке немного смещен центр окружностей семейства.

Rtheta [t_]= {Cos [t] ,Sin [t] };

Module [ {0=8,111=40, r = 1 0 ,1=3, k = l . 4}, Module[{R=l*r},

Module [{Rl=(R+k*r) /2, rl=(R-k*r) /2}, Show[Graphics[

Circle[{0,0},R+r+r/5]],

Table[Graphics[Circle[{0,0},R+r+i/20+r/10]],{i,l,10}],

Table[Table[Graphics[ Circle[Rl*Rtheta[i*2*Pi/n]+rl*(1+k*j/(m-

l))*Rtheta [i*2*Pi/n+j /m*Pi],r] ],

{i, 0, n-1}] ,{j,0,m-1}],AspectRatio->l,PlotRange->All]]]];

Мультимедиа: геометрия, графика, кино, звук

253

На представленной ниж е вариации на эту же тему радиус окружности семейства

переменны й.

Rtheta[t_]={Cos[t],Sin[t]};

Module[{n=8,m=40,r=10,1=3,k=l.4},

Module[{R=l*r},

Module [{Rl= (R+k*r) /2, rl= (R-k*r) /2},

Show[Graphics[

Circle[{0,0},R+r+r/5]],

Table[Graphics[Circle[{0,0},R+r+i/20+r/10]],{i,1,10}],

Table[Table[Graphics[

C i r c l e [Rl*Rtheta[i*2*Pi/n]+rl*Rtheta[i*2*Pi/n+j/m*Pi],

r * ( l + ( k - l ) * j / ( m - l ) ) ] ] ,

{i,0,n-1}],{j,0,m-1}],AspectRatio->l,PlotRange->All]]]];

Пример 9.1. Колесо со спицами. Примитивов C ir c le и L in e вполне достаточно для изобретения, простите, изображения колеса.

M o d u l e [ { r l = 5 , г 2 = 3 0 , п = 6 0 },

S h o w [ G r a p h i c s [ C i r c l e [ { 0 , 0 } , r l ] ] , G r a p h i c s [ C i r c l e [ { 0 , 0 } , r 2 ] ] ,

G r a p h i c s [ T a b l e [ L i n e [ { { r l * C o s [ 2 P i * i / n ] , r l * S i n [ 2 P i * i / n ] },

{r 2 * C o s [ 2 P i * i / n ] , r 2 * S i n [ 2 P i * i / n ] } } ] ,

{i , 0 , n } ] ] , A s p e c t R a t i o - > l , P l o t R a n g e - > A l l ] ];

254

Г пава 9

Но не перепутайте синус и косинус, а то получится колесо Эш ера.

Module [ { r l = 1 5 , г 2 = 3 0 , п - 1 8 0 },

S h o w [ G r a p h i c s [ C i r c l e t { 0 , 0 } , r l ] ] , G r a p h i c s [ C i r c l e [ {0 , 0 } , r2 ] ] ,

G r a p h i c s [ T a b l e [ L i n e [ { { r l * S i n [ 2 P i * i / n ] , r l * C o s [ 2 P i * i / n ] }, { r 2 * C o s [ 2 P i * i / n ] , r 2 * S i n [ 2 P i * i / n ] } } ] ,

{ i , 0 , n } ] ] , A s p e c t R a t i o - > l , P l o t R a n g e - > A l l ] ] ;

Эллипс и его дуга — примитив Circle

Дугу эллипса с полуосями гх и гу создает графический примитив Circle [{х, у ) ,

•и» гу)].

Здесь

{х,

у )

координаты

центра эллипса. Графический примитив

C ircled * ,

у ) ,

{гх,

г у ) ,

{ t h l , t h 2 ) )

рисует дугу эллипса, которая получается из

Мультимедиа: геометрия, графика, кино, звук

255

qs = Solve[

соответствующей дуги окружности. Центр эллипса находится в точке с координатами lx, у), гх и гу — полуоси, a {tltl, th2) — граничные значения полярного угла для дуги окружности. Чтобы нарисовать эллипс, достаточно вызвать примитив c ir c le [ {х,

У), (яс, /у)]-

Ниже

нарисован эллипс, окружность, диаметр которой совпадает с

меньшей осью эллипса, и дуга окружности.

Show[Graphics[

 

 

 

{Circlet{0, 0), 1],

 

 

Circle [{О, 0}, {2, 1>],

 

. . 3

1 ,

V I

,1

, , ,

Circle [{—

,

, {-, 2}]},

AspectRatio -> Automatic,

Axes -> Automatic] ];

Пример 9.2. Окружность, вписанная в треугольник. Давайте напишем функцию] in s c r ib e d C i r c le , которая по заданному своими вершинами треугольнику вписывает

в него окружность.

Предварительно нам понадобится функция, назовем ее

I n s c r ib e d C ir c le D a t a ,

которая вычисляет радиус и координаты центра окружности,

вписанной в треугольник.

 

 

* nscribedCircleData [рА :

_}, рВ : {_,

,

PC: (_* _)1 -

 

 

 

Module [{АВ, ВС, АС, a, b, с, s, рР, pQ,

 

АР, BQ, р, q, ps, qs, pqs, incenter,

 

inradius} , AB = pB - рА; BC = pC - pB;

 

AC = pC - рА; a = л/всТвС ; b = V AC .A C ;

 

c * VAB.AB; AP = pB + pBC - pA;

 

BQ = pA + q AC - pB;

AP.AC

 

 

AP.AB

 

 

ps = Solve [ c

b

. p]l£i, i]];

 

BQ.BC

BQ.(-AB)

 

» q ] t [ i , i ] ] ; pP = pB + p B C / . p s ; pQ = pA + qAC /. qs;

pqs =

Solve [pA + p (pP - pA) ==pB + q (pQ-рВ) , {P.

256

Г пава 9

in c e n t e r

= pA + p (pP - pA)

/ . p q s ;

1

 

 

e = — (a + b + c ) ;

 

2

 

 

in r a d iu s

/ ( s - a ) ( e - b ) ( e - c )

= -------------------------------------

;

{ in c e n t e r , in r a d iu s } ]

Теперь можем написать функцию, отображающую стороны треугольника и впи­ санную в него окружность.

In sc r ib e d C ir c le [рА: {_,_}, рВ: {_,_}, рС: {_,_}] := Show[Graphics[{Line[{рА,рВ,рС,pA}], Circle[Sequence@@InscribedCircleData[рА,рВ,рС]]}], AspectRatio->Automatic,PlotRange->All,Frame->True]

(Здесь Sequence превращает

Sequence@@InscribedCircleData [pA,pB,pC] в

Sequence [pA, pB, pC].)

 

Теперь можем приступить к рисованию.

In sc r ib e d C ir c le [ { 1 .8 , 6 . 8 } ,

{ 3 . 1 , 1 . 1 } , { 6 . 4 , 2 . 4 } ] ;

Диски (закрашенные эллипсы, окружности и их сектора) — примитив Disk

Закрашенный диск получается с помощью примитива Disk, параметры которого в точности совпадают с параметрами примитива Circle. В частности, закрашенный

круг получается с помощью примитива Disk [ {х, у ) ,

г].

Текст

 

С помощью графического примитива Text [ехрг,

, у}] задается текст.

| Мультимедиа: геометрия, графика, кино, звук

257

Здесь expr — любое выражение, причем центр печатной формы вычисленного его значения помещается в точку с координатами {х , у }. Предположим, мы нарисовали график параболы у = (2 + х)Л2 на отрезке [-3,-1] и обозначили через р графиче­ ский объект р = P lo t [(2+х) Л2, {х, -3, -1} ]. Тогда полученный нами рисунок мож­ но снабдить поясняющим текстом.

p = P lo t [ ( 2 + х ) Л2 , { х , - 3 , - 1 } ] ;

Show [р , G r a p h ic s [ {T ext ["Graph o f у = "E xpand[(2 + х )A2 ] , { - 2 , 0 . 9 } ] } ] ] ;

В графическом примитиве T e x t можно задать еще один параметр — смещение offset. T e x t [expr, coords, offset). Этот параметр определяет смещение текста. По умолчанию он равен {0, 0}, а это означает, что центр текста должен находиться в точке с коор­ динатами coords.При установке {-1, 0} левый край текста начинается в точке с ко­ ординатами coords; {1, 0} — правый край текста находится в точке с координатами coords; (0, -1} — текст центрируется выше точки с координатами coords\ {0, 1} - текст центрируется ниже точки с координатами coords.

Вот пример использования смещения offset

S h o w [G r a p h ic s[{

Text["Left",{-1,0}, {-1,0}],

Text["Right",{1,0},{1,0}],

Text["Above",{0,1}, {0,-1}],

Text["Below",{0,-1},{0,1)],

{ P o i n t S i z e [ .075],R G B C olor[1,0,0],P o i n t [{0,0}]}}, P lo t R a n g e - > A ll] ];

Above

I

L e ft

R ig h t

Below

258

Гпава 9

Наконец, параметр dir позволяет указать

направление чтения текста: Text [ехрг,

coords,

offset, dir] . Если dir =

{1,0}, то текст располагается как обычно, т.е. гори­

зонтально. Если

dir — {0,1},

то текст размещается вертикально и читается снизу

вверх. Если dir =

{0,-1}, то текст располагается вертикально и читается сверху вниз.

Если

А г= { -1 ,0 } , то текст

располагается

горизонтально, но перевернутым, т.е.

“вверх ногами”.

Кроме того, добавить текст или другие графические примитивы в рисунки, соз­ данные встроенными графическими функциями, можно с помощью опций Prolog и Epilog. По умолчанию они равны пустому списку {}. Однако в любой из этих спи­ сков можно добавить любые подходящие случаю примитивы. Разница между рассмат­ риваемыми опциями состоит в том, что примитивы опции Prolog рисуются до ос­ новного рисунка, а примитивы опции Epilog — после.

В приведенном ниже примере до рисования графика функции рисуется окружность.

P lo t [S ig n [х]

* Exp [ 1 / (1 + х ’2) ] ,

{х , - 2 , 2 } ,

A s p e c t R a t io -►A u to m a tic ,

P r o lo g -►C i r c l e [ { 0 , 1} , 1] ] ;

Ниже приведен пример использования опции P r o lo g

вместе с вызовом в графиче­

ском примитиве T e x t функции F ontForm , аргументами

которой являются строка с

текстом, название и размер шрифта для текста. На рисунке нарисовано два графика — график функции Эйри (решение дифференциального уравнения /-д гу = 0) и ее про­

изводной.

Plot [ { A ir y A iP r im e [ х ] , A ir y A i[ x ] } , {х , - 5 , 5 } ,

Prolog -> {Text[FontForm[" A ir y A iP r im e " ,

{" T im es" , 1 4 } ] , { 1 . 4 , - 0 . 3 } ] ,

Мультимедиа: геометрия, графика, кино, звук

259

Text[FontForm[" Airy Ai",{"Eurostyle",14}], {1,0.4}]}, PlotLabel ->FontForm["flBa графика", {"Courier", 14}], PlotStyle -> {{Dashing[{0.02}]},{GrayLevel[0.1]}}];

Д в а г р а ф и к а

Вычерчивание графиков

Для вычерчивания графиков функций одной переменной имеется несколько функций. Самой важной из них является, пожалуй, Plot.

Функция Plot

Эта функция уже неоднократно встречалась нам ранее. Количество ее опций про­ сто поражает.

O p tio n s [ P lo t ]

{AspectRatio

G o ld e n R a tio

, Axes ->Automatic ,

A x esL a b e l

-» N o n e,

A x e sO r ig in -> A u to m a tic ,

 

A x e s S t y le

 

A u to m a tic ,

B ackgroun d

-> A u to m a tic

,

C o lo rO u tp u t

-» A u to m a tic ,

C om p iled

-» T r u e ,

 

D e fa u ltC o lo r -» A u to m a tic

,

 

 

 

 

D e fa u ltF o n t

$ D e fa u ltF o n t

,

 

 

 

D is p la y F u n c tio n

$ D is p la y F u n c tio n

,

 

E p ilo g -> { } , Form atT ype

 

$ Forma tT yp e ,

 

Frame -» F a l s e , F ram eL abel -» N o n e,

 

 

F r a m e S ty le

-» A u to m a tic

,

 

 

 

 

 

F ram eT ick s

-» A u to m a tic

,

G r id L in e s

-» N o n e,

 

Im a g e S iz e

-> A u to m a tic ,

MaxBend -> 1 0 . ,

 

P lo t D i v is io n -> 30. , P lo tL a b e l

N o n e,

 

P lo t P o in t s

-» 2 5 ,

P lo tR a n g e

-» A u to m a tic ,

 

P lo tR e g io n

A u to m a tic

,

P lo t S t y le

-» A u to m a tic

,

P r o lo g

{ } , R o ta te L a b e l -> T r u e ,

 

 

T e x t S t y le

 

$ T e x t S t y le

,

T ic k s

-» A u to m a tic }

 

Эта функция позволяет чертить сразу несколько графиков функций. Чтобы начер­ тить сразу несколько графиков функций, в качестве первого аргумента функции Plot задается список функций. Для того чтобы различить графики, обычно используется

260

Гпава 9