1. Полезные функции

 

Полезные функции

 

 

  • Синтез звуков — Audio
  • Синтез музыкальных звуков — Music
  • Функции времени и дат — Calendar
  • Географические и картографические данные — World Data
  • Физические константы и размерные величины — PhysicalConstants
  • Данные о химических элементах — ChemicalElements
  • Задание данных только вещественного типа — RealOnly
  • Работа с бинарными файлами — BinaryFiles
  • Запись графических объектов в файл формата DXF
  • Фильтрация опций — FiltersOptions
  • Уплотнение памяти — MemoryConserve
  • Работа с пакетами расширений — Package
  • Показ времени операций — ShowTime

Пакет расширения Miscellaneous

Слово Miscellaneous в переводе на русский язык означает «всякая всячина». Большинство функций этого пакета, на первый взгляд, не имеет прямого отношения к математическим расчетам. Однако как сказать! Этот пакет представляет систему Mathematica в особом свете — как систему, имеющую далеко не стандартные средства синтеза звука и графического представления информации самого общего вида. Физики, химики, географы и даже музыканты могут найти в этом пакете средства, полезные им при обработке на компьютере информации произвольного вида.

Синтез звуков — Audio

Подпакет Audio служит для генерации стандартных звуковых сигналов разной формы, частоты и длительности, модуляции сигналов по амплитуде и по частоте и считывания звуковых файлов с дисков. Для создания звуковых объектов служит функция Waveform:

  • Waveform [type, freq, dur] — создает звуковой сигнал формы type с частотой freq (в герцах) и длительностью dur (в секундах). Возможны следующие формы сигнала: Sinusoid — синусоидальный, Triangle — треугольный, Square — прямоугольный и Sawtooth — пилообразный;
  • Waveform [type, freq, dur, Overtones->n] — создает звуковой сигнал формы type с частотой freq (в герцах) и длительностью dur (в секундах), имеющий п гармоник.

Приведенный на рис. 13.1 пример дает генерацию прямоугольного сигнала частотой 1000 Гц и длительностью 0.5 с. Следует обратить внимание.на то, что созданный звуковой объект проигрывается и показывается после команды Show.

Звуковой объект, как отмечалось, ассоциируется с графическим объектом. К сожалению, явной связи между осциллограммой звукового сигнала и его графическим образом нет. Более того, вид графического объекта сильно зависит от компьютерной платформы, на которой установлена система Mathematica. Так что графический звуковой объект — это просто некий условный графический образ звукового сигнала.

Рисунок 13.2 показывает генерацию прямоугольного сигнала с двумя гармониками. Здесь используется опция Overtones->2. Ее нельзя применять к синусоидальному сигналу, поскольку он принципиально не имеет гармоник.


Рис. 13.1. Создание и просмотр звукового объекта — синусоидального сигнала

 


Рис. 13.2. Генерация прямоугольного сигнала с двумя гармониками

Когда указана опция Overtones, функция Waveform использует ряд Фурье для создания высших гармоник, обогащающих тембр звука. При этом возможно изменение числа гармоник. Возможно также создание сигнала с заданными номерами и амплитудами гармоник. Для этого служит функция ListWaveform:

  • ListWaveform[ { {nl, al}, {n2, a2 },...}, freq, dir] — создает звуковой объект с частотой основной гармоники f req и длительностью dir, содержащий дополнительные частоты с кратностями ni и амплитудами ai.

На рис. 13.3 представлен пример создания звукового объекта сложного типа, содержащего ряд частотных составляющих. Данные представлены списком partial-List. С помощью функции Table подготовлен объект, содержащий шесть звуковых подобъектов.


Рис. 13.3. Генерация многочастотного сигнала

Для создания звуковых объектов, порождающих звук с амплитудной и частотной модуляцией, служат следующие функции:

  • AmplitudeModulation [f c , f m ,m t ,dur] — создает амплитудно-модулирован-ный синусоидальный сигнал с несущей частотой f c , частотой модуляции f m , коэффициентом модуляции m. и длительностью dur. Опция RingModula-tion->True позволяет получить амплитудную модуляцию с подавленной несущей;
  • FrequencyModulation [f c , {{f m ,pd}, dur] — создает частотно-модулированный синусоидальный сигнал с несущей частотой f c , модулированный по частоте сигналом с частотой модуляции f m , с девиацией частоты pd (в герцах) и длительностью dur.

Рисунок 13.4 демонстрирует создание звукового объекта с амплитудной и частотной модуляцией. Обратите внимание на то, что объект показывается сразу, поскольку в состав его выражения включена команда //Show.

Для создания сложных сигналов с частотной модуляцией функция Frequency-Modulation используется в следующем виде:

  • FrequencyModulation [fc, {{f l,pdl}, (f2,pd2 },...}, dur] — создает частотно-модулированный синусоидальный сигнал длительностью dur с несущей частотой f с и каскадом частот модуляции fmi с девиациями pdi. Опция ModulationType->Parallel создает сигнал, независимо промодулированнып всеми указанными частотами, а опция ModulationType->Cascade включает режим, при котором перечисленные частоты последовательно модулируют друг друга.

Рисунок 13.5 показывает создание и воспроизведение композитного звуковок сигнала. Он представлен списком объектов {s 1, s 2, s 3}.

 


Рис. 13.4. Генерация звуковых объектов с амплитудной (сверху) и частотной (снизу) модуляцией

 


Рис. 13.5. Генерация композитного звукового сигнала

Для считывания звуковых файлов с магнитного диска служит функция Read-Soundfile:

  • ReadSoundf ile [ "soundfile" ] — опознает файлы разного формата и конвертирует их в список, содержащий целые числа в диапазоне от -32 768 до +32 767. Опция PrintHeader->True позволяет вывести отчет о звуковом файле. Поддерживаются следующие форматы звуковых файлов: NeXT/Sun, WAVE и AIFF.

Разумеется, считываемый звуковой файл должен быть расположён в текущей директории или его имя должно точно указывать местоположение файла. Файлы отображаются соответствующим графическим образом (как описывалось выше).

Синтез музыкальных звуков — Music

Подпакет Music как бы продолжает рассмотренный ранее подпакет поддержки звуковых возможностей системы Mathematica. Он задает функцию последовательного воспроизведения списка, содержащего отдельные звуки:

  • Scale [ilist, freq, dur] — генерирует звуковой объект, представленный данными списка ilist музыкальных интервалов, с частотой freq и длительностью dur.

Пример воспроизведения мажорной гаммы (поставляемая с системой мелодия JustMajor) представлен на рис. 13.6. Помимо фрагмента JustMajor имеется еще 11 фрагментов, которые поставляются с системой Mathematica (QuarterTone, Mean-Major, MeanMinor, SixthTone, JustMinor и т. д.). Все они могут воспроизводиться функцией Scale.

 


Рис. 13.6. Пример воспроизведения музыкального фрагмента

Кроме того, есть ряд функций преобразования:

  • HertzToCents [f list] — преобразует список частот (в герцах) в список музыкальных интервалов (в центах);
  • CentsToHertz [ilist] — преобразует список музыкальных интервалов (в центах) в список частот (в герцах), начиная с частоты 440 Гц;
  • CentsToHertz [ilist, f ] — преобразует список музыкальных интервалов (в центах) в список частот (в герцах), начиная с заданной частоты f.

Примеры преобразования даны ниже:


<<Miscellaneous`Music`

HertzToCents[{400, 450, 525}]

{203.91, 266.871}

alist = Tablet N[440 2^(i/12)], {i, 0, 12}]

{440,., 466.164, 493.883, 523.251, 554.365, 587.33, 622.254,

659.255, 698.456/739.989, 783.991, 830.609, 880.}

HertzToCents[alist]

{100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100.}

CentsToHertz[{0, 600}]

{440., 622.254}

 Описанные возможности синтеза музыки являются скорее данью моде на мультимедиа, чем нужными на практике. Так, время подготовки музыкального объекта довольно значительно (до десятка секунд на компьютере с процессором Pentium II 350). Так что они годятся только для создания простейших музыкальных звуков, которыми можно сопровождать некоторые учебные программы.

Функции времени и дат — Calendar

В пакете расширений Miscellaneous есть ряд подпакетов, содержащих функции времени и даты. Так, в подпакете Calendar сосредоточены вычисления, относящиеся к календарным датам:

  • DayOfWeek [ {year, month, day} ] — вычисляет день недели по заданным году, месяцу и числу;
  • DaysBetween[{yearl,monthl,dayl},{year2, month2, day2} — вычисляет число суток между двумя датами:
  • DaysPlus [ {year, month, day}, n] — дает дату и-го дня после заданной даты.

Во всех этих функциях возможна опция Calendar->cal. Имеется также функция смены календаря:

  • CalendarChange [ {year, month, day}, call, cal2] — преобразует заданную дату из одного календаря в другой.

Примеры вычислений с датами:


<<Miscellaneous` Calendar`

DayOfWeek{[1988, 6, 23}]

DaysBetween[{1900, 1, 1}, {1901, 1,1}]

365

DaysPlus[{1900, 1, 1}, 366]

{1901, 1, 2}

DaysBetween[{1900, 1, 1},{1901, 1, 1},Calendar -> Julian]

366

Calendar-Change[{1992, 2, 29}, Gregorian, Julian]

{1992, 2, 16}

CalendarChange[{1992, 2, 29}, Gregorian, Islamic]

{1412, 8, 25}

CalendarChange[{1,1,1}, Islamic, Julian]

{622, 7, 16}

 

Города и расстояния — CityData и Geodesy  

В подпакете CityData можно найти функции, позволяющие найти координаты большинства крупных городов мира: CityData [city, datatype], CityData [city] иCityData[datatype]. Например:


<<Miscellaneous`CityData`

CityData["Montreal",

CityPosition]

{{45, 30}, {-73, -36}}

CityData["Washington"]

{{CityPosition, {{38, 53, 42}, {-77, -2, -12}}}}

 Координаты (широта и долгота) выдаются в формате {градусы, минуты} или {градусы, минуты, секунды}.

В этом же подпакете есть функции для вычисления расстояний между городами:

  • CityDistance [ "cityl", "pity"] — возвращает расстояние между двумя указанными городами;
  • CityDistance["cityl","city",CityDistanceMethod->Method] — возвращает расстояние между двумя указанными городами со спецификацией метода вычислений (по умолчанию используется функция SphericalDistance из подпакета Geodesy).

Пример вычисления расстояния между городами дан ниже:


CityDistance["Washington", "Montreal"]//N

786.915

Базу данных можно расширять, добавляя в нее информацию о новых городах:

CityPosition[{"Champaign", "USA", "IL"}] = {{40, 7, 5},

{-88, -14, -48}};

 Убедимся, что информация действительно добавлена:

CityData["Champaign", CityPosition]

{{40, 7, 5}, {-88, -14, -48}}

 Для добавления новых полей в базу данных можно использовать функцию AppendTc (см. урок 9). Например, добавим поле для хранения информации о населении:

AppendTo[$CityFields, CityPopulation]

 Теперь введем в базу данных информацию о населении Вашингтона:

CityPopulation[{"Washington", "USA", "DC"}] = 638000;

Проверим результат, запросив всю имеющуюся в базе информацию об этом городе:


CityData["Washington"]

{{CityPosition, {{38, 53, 42}, {-77, -2, -12}}},

{CityPopulation, 638000}}

 Как видите, результат теперь включает новую информационную категорию —

CityPopulation. 

В подпакете Geodesy есть функции, вычисляющие расстояние между двумя точками с учетом выпуклости Земли:

  • SphericalDistance [posl,pos2] — вычисляет расстояние между двумя точками в предположении, что Земля — идеальный шар (сфера);
  • SpheroidalDistance [posl,pos2] — вычисляет расстояние между двумя точками в предположении, что Земля — приплюснутый шар (сфероид).

Примеры вычислений по этим функциям представлены ниже:


SphericalDistance[{0, 0}, {45,-45}] //N

6671.7

SpheroidalDistance[{0, 0}, {45, 45}] //N

6662.47 % - %%

-9.23014

 

Географические и картографические данные — WortdData, WorldNames и WorldPlot

В пакете Miscellaneous имеется база данных по странам мира. Доступ к ней открывает подпакет WorldData. Для этого имеется функция WorldData [ "Страна" ], возвращающая список координат конечных отрезков прямых, которые задают контурный график — карту заданной страны. Например, данные по Азербайджану можно получить следующим образом:


<<Miscellaneous` WorldData`

WorldData["Azerbaijan"]

{{{2378, 2689}, {2374, 2770}, {2344, 2806}, {2330, 2770}, {2378, 2689}}, {{2361, 2849}, {2419, 2781}, {2472, 2701}, {2445, 2823}, {2509, 2778}, {2473, 2871}, {2510, 2915}, {2414, 3024}, {2307, 2933}, {2376, 2888}, {2361, 2849}}}

 Попробуйте сами найти данные по России (Russia) — мы их не приводим ввиду громоздкости списка, что вполне естественно, поскольку Россия — крупнейшая страна мира и имеет самую длинную границу (контурную линию) с многочисленными изломами.

В подпакете WorldNames имеется список стран, систематизированный по континентам: Africa, Asia, Europa, MiddleEa.st, NorthAmerica, Oceania, South-America и World (весь мир). Например, так можно узнать, какие страны расположены в Океании:


<<Miscellaneous`WorldNames`

Oceania // InputForm

{"Indonesia", "Papua New Guinea", "Fiji", "Australia", "New Zealand")

Наиболее эффектными являются возможности подпакета WorldPlot, функции которого позволяют строить карты любой страны или всего мира:

  • WorldPlot [countrylist] — построение карты страны по списку ее данных;
  • WorldPlot [countrylist, RandomColors] — построение карты страны по списку ее данных с раскраской случайными цветами;
  • WorldPlot [countrylist, RandomGrays] — построение карты страны по списку ее данных с раскраской случайными оттенками серого цвета;
  • WorldPlot [ {countrylist, colorfunc} ] — построение карты страны по списку ее данных с раскраской по функции colorfunc;
  • WorldPlot [ {countrylist, colorlist) ] — построение карты страны по списку ее данных с раскраской по списку colorlist.

На рис. 13.7 показано построение контурной карты России (верхний рисунок) и цветной карты мира. Раскраска достигается применением директивы RandomColors.


Рис. 13.7. Контурная карта России и цветная карта мира

Следующий рисунок (рис. 13.8) показывает возможность композиционного изображения картографических изображений. На нем построена карта Америки и особо выделены (более темным цветом) территории Канады и Мексики. Здесь для цветовых выделений использована директива GrayLevel, позволяющая задавать степень густоты серого цвета.


Рис. 13.8. Карта Америки с выделенными Канадой и Мексикой

Карты могут строиться в различных проекциях: Albers, Equirectangular, LambertAzimuthal, LambertCylindrical, Mercator, Mollweide, Orthographic и Sinusoidal. Для этого используется опция WorldProjection-> Имя_проекции.

На рис. 13.9 представлена цветная карта всего мира, построенная в синусоидальной проекции. Такая проекция удобна для общего обозрения всей поверхности земного шара при взгляде с экватора (сравните рис. 13.9 с рис. 13.7).


Рис. 13.9. Вид на земной шар при синусоидальной проекции

Выбор вида проекции способен преобразовать вид изображения. Для иллюстрации этого на рис. 13.10 представлена карта мира в иной проекции — азимутальной проекции Ламберта (LambertAzimuthal). В таком виде получается прекрасный вид на Землю со стороны Северного полюса.


Рис. 13.10. Вид но земной шор со стороны Северного полюса при азимутальной проекции Ламберта

Еще один пример (с цилиндрической проекцией Ламберта) представлен на рис. 13.11. Здесь показана карта Африки. Цилиндрическая проекция в некоторых случаях позволяет визуально уменьшить геометрические искажения границ, обусловленные сферической поверхностью Земли. Обратите также внимание на технику окраски самого континента, фона и рамки.


Рис. 13.11. Контурная карта Африки в цилиндрической проекции

В подпакет World Plot включены функции преобразования углов:

  • ToMinutes [deg] — преобразует градусы в минуты;
  • ToMinutes [ {deg,min} ] — преобразует градусы и минуты в минуты с долями;
  • ToMinutes [ {deg,min, sec} ] — преобразует градусы, минуты и секунды в минуты с долями.

Примеры преобразований представлены ниже:


 ToMinutes [1]

60

ToMinutes [{1,20}]

80

ToMinutes [{1,20,10}]

481/6

N[%]

80.1667

 

Физические константы и размерные величины — PhysicalConstants

В подпакете PhysicalConstants определено несколько десятков наиболее употребительных физических констант. Они представлены как размерные величины, то есть помимо своего численного значения имеют единицы измерения. Физические константы вводятся своими полными символьными именами, например, как показано в следующей таблице.


Ввод и вывод

 Комментарий

 <<Miscellaneous " PhysicalConstants " SpeedOfLight

299792458 Meter/Second

Загрузка подпакета Скорость света

 Second SpeedOfLight AgeOfUniverse    1. 40902 xl0 26 Meter

 Выражение с константами
 ElectronMass

9 . 10939 x 10- 31 Kilogram

 Масса электрона

 AccelerationDueToGravity 9. 80665 Meter/Second 2

 Ускорение свободного падения

Полные списки физических констант приведены в справочной базе данных по подпакету PhysicalConstants.

Для выполнения физических, химических и иных расчетов в Mathematica предусмотрена возможность работы с размерными переменными. Для этого база данных системы содержит символьные имена практически для всех единиц измерения (времени, массы, расстояния, температуры и т. д.). Данные о них можно найти в справочной базе данных подпакета Units. Там же имеются функции для перевода единиц измерении из одной системы размерных единиц в другую.

Начнем с функции Convert [old, newunits], которая осуществляет преобразование одних единиц в другие. Например:


<<Miscellaneous`Units`

Convert[12 Meter/Second, Mile/Hour]

26. 8432 Mile / Hour

Convert[3 Kilo Meter / Hour, Inch / Minute]

1968. 5 Inch / Minute

 Для преобразования температуры служит функция ConvertTemperature [temp, oldutits, newunits], производящая преобразование температуры из одних единиц в другие. Возможные единицы измерения температуры следующие: Celsius (шкала Цельсия), Centigrade (то же самое), Fahrenheit (шкала Фаренгейта), Kelvin (шкала Кельвина) и Rankine (шкала Ренкина).

Пример преобразования температуры:


ConvertTemperature[20, Fahrenheit, Centigrade]

-6.66667

Наконец, имеются три широкопрофильные функции преобразования в различные системы единиц:

  • SI [ехрr] — преобразует ехрг в Международную систему единиц SI;
  • MKS [ехрr] — преобразует ехрг в систему единиц МКС (метр/килограмм секунда);
  • CGS [ехрr] — преобразует ехрг в систему единиц СГС (сантиметр/грамм секунда).

Пример преобразования дан ниже:


 SI[3 Atmosphere]

303975. Pascal

?Pascal

Pascal is the derived SI unit of pressure.

 Помимо возможности задания физических констант в пакете расширения Miscellaneous системы Mathematica 4 имеются три дополнительных подпакета: Standard-Atmosphere (данные об атмосфере), ResonanceAbsorptionLines (построение резонансных линий поглощения) и BlackBodyRadiation (излучение абсолютно черного тела).

Ввиду узкой направленности входящих в них функций эти подпакеты подробно не описываются. С ними несложно познакомиться по справочной базе данных системы Mathematica 4 (раздел Add-ons).

Данные о химических элементах — ChemicalElements

В подпакете ChemicalElements имеется ряд функций, позволяющих выявить свойства химических элементов. Начнем с функции без параметров Elements, выводящей список всех химических элементов (он полезен для знакомства с англоязычными наименованиями элементов):


<<Miscellaneous` ChemicalElements`

Elements

{Hydrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium, Magnesium, Aluminium, Silicon, Phosphorus, Sulfur, Chlorine, Argon, Potassium, Calcium, Scandium, Titanium, Vanadium, Chromium, Manganese, Iron, Cobalt, Nickel, Copper, Zinc, Gallium, Germanium, Arsenic, Selenium, Bromine, Krypton, Rubidium, Strontium, Yttrium, Zirconium, Niobium, Molybdenum', Technetium, Ruthenium, Rhodium, Palladium, Silver, Cadmium, Indium, Tin, Antimony, Tellurium, Iodine, Xenon, Caesium, Barium, Lanthanum, Cerium, Praseodymium, Neodymium, Promethium, Samarium, Europium, Gadolinium, Terbium, Dysprosium, Holmium, Erbium, Thulium, Ytterbium, Lutetium, Hafnium, Tantalum, Tungsten, Rhenium, Osmium, Iridium, Platinum, Gold, Mercury, Thallium, Lead, Bismuth, Polonium, Astatine, Radon, Francium, Radium, Actinium, Thorium, Protactinium, Uranium, Neptunium, Plutonium, Americium, Curium, Berkelium, Californium, Einsteinium, Fermium, Mendelevium, Nobelium, Lawrencium, Rutherfofdium, Dubnium, Seaborgium, Bohrium, Hassium, Meitnerium, Ununnilium, Unununium, Ununbium}

Для выявления свойств элементов служат следующие функции:

  • Abbreviation [element] — возвращает стандартную аббревиатуру элемента;
  • AtomicNumber [element] — возвращает атомный номер элемента;
  •  AtomicWeight [element] — возвращает атомный вес элемента;
  • Stablelsotopes [element] — возвращает список стабильных изотопов элемента.

<<Miscellaneous`ChemicalElements`

Abbreviation[Wolfram]

W

AtomicNumber[Wolfram]

74

AtomicWeight[Wolfram]

183.85

Stablelsotopes[Wolfram]

{180, 182, 183, 184, 186}

Off[AtomicWeight::unstable]

 Рисунок 13.12 графически показывает отношение атомного веса к атомному номеру для разных элементов.


Рис. 13.12. График отношения атомного веса к атомному номеру химических элементов

Полезны также функции, возвращающие значения величин, определяющих физические свойства элементов:

  • MeltingPoint [element] — температура в точке плавления (здесь и далее в Кельвинах);
  • BoilingPoint [element] — температура в точке кипения;
  • HeatOf Fusion [element] — теплота плавления (килоджоуль/моль);
  • HeatOfVaporization [element] — теплота парообразования (килоджоуль/моль):
  • Density [element] — плотность в килограммах на кубический метр (при 298 К);
  •  TermalConductivity [element] — теплопроводность элемента;
  • ElectronConf iguration [element] — конфигурация электронов в виде списка;
  • ElectronConf igurationFormat [element] — конфигурация электронов Б стандартной форме записи.

Используемая в размерных значениях этих функций величина «моль» является мерой количества вещества, численно равной 6.0221367х10 23 молекул вещества. Определим свойства элемента — вольфрама (чувствуете намек на фамилию создателя системы Mathematica?):


MeltingPoint[Wolfram]

3680. Kelvin

BoilingPoint[Wolfram]

5930.Kelvin

HeatOfFusion[Wolfram]

35.2 Joule Kilo/Mole

HeatOfVaporization[Wolfram]

824.2 Joule Kilo / Mole

Density[Wolfram]

19300. Kilogram / Meter3

ThermalConductivity[Wolfram]

174. Watt /Kelvin Meter

ElectronConfiguration[Wolfram]

{{2}, {2, 6}, {2, 6, 10}, {2, 6, 10, 14}, {2, 6, 4}, {2}}

ElectronConfigurationFormat[Wolfram]

1s2 2s22p6 3s23p63d10 4s24p64d104f14 5s25p65d4 6s2

 Вольфрам — один из самых тугоплавких элементов в природе. Недаром из него делают нити для ламп накаливания.

Задание данных только вещественного типа — RealOnly

В ряде случаев (как при вычислениях, так и при построении графиков) Mathematica сообщает о наличии у функций особых значений. Это хорошо иллюстрирует рис. 13.13, на котором предпринята попытка построения графика, казалось бы, простой функции х^ (1/3). Нетрудно заметить, что график в отрицательной области значений х не построен и перед построением неполного графика выдан целый букет предупреждающих сообщений.

Причина этой частичной неудачи в том, что в некоторых точках данная функция дает комплексные значения. Например:


(-8.0) ^ (1/3)

1. + 1.732051

 Подпакет ReaLOnly не вводит никаких новых функций. Он просто превращает данные последующих вычислений в чисто вещественные. Так что после его загрузки построение графика указанной функции проходит без каких-либо проблем (рис. 13.14).

 


Рис. 13.13. Попытка построения графика функции х^(1/3)

 


Рис. 13.14. Построение графика функции х^(1/3) после загрузки подпа.кета RealOnly

Разумеется, подобное свойство нужно далеко не всегда и при неумелом его применении способно привести к ошибочным результатам. Тем не менее, есть случаи (см. приведенный пример), когда оно полезно.

 

gl13-1.jpg

Изображение: 

gl13-10.jpg

Изображение: 

gl13-11.jpg

Изображение: 

gl13-12.jpg

Изображение: 

gl13-13.jpg

Изображение: 

gl13-14.jpg

Изображение: 

gl13-2.jpg

Изображение: 

gl13-3.jpg

Изображение: 

gl13-4.jpg

Изображение: 

gl13-5.jpg

Изображение: 

gl13-6.jpg

Изображение: 

gl13-7.jpg

Изображение: 

gl13-8.jpg

Изображение: 

gl13-9.jpg

Изображение: