Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Базовые типы

Замещающие типы
Без указателей
Массивы
Структурное программи-
рование

Обработка исключений
Возбуждение исключений
Классы обработки исключений
Блок finally
Строки String
Класс Math
Класс Vector
Класс Stack
Словарь на базе Hashtable
Словарь на базе Properties
Цифровые часы
Собственный класс
Наследование классов

Интерфейсы

Назад Вперед

1.11. Использование класса Math

В примере демонстрируются основные приемы работы с объектами класса Math.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java)

Немного теории

Библиотека классов java.lang.Math содержит константы и методы, нужные для выполнения математических вычислений.

Ваша программа может использовать константы Math.E (число "е") Math.PI (число "пи"), вычислять с применением методов класса java.lang.Math различные тригонометрические функции, создавать генераторы случайных чисел, определять минимальное и максимальное значение, возводить числа в произвольно заданную степень, выполнять округление, определять абсолютное значение, извлекать квадратный корень и так далее.

Описание примера

Наш пример является аплетом . В нем демонстрируется использование методов класса Math, предназначенных для вычисления функции синуса и генерации случайных чисел. Кроме того, в вычислениях используется число "пи".

В окне аплета мы рисуем синусоиды случайной амплитуды и частоты, имеющие случайный фазовый сдвиг, а также случайные постоянные составляющие (рис. 1). При этом мы ограничиваем диапазоны изменения значений всех случайных величин для того чтобы синусоиды не были слишком громоздкими или наоборот, слишком мелкими.

pic01.gif (9043 bytes)

Рис. 1. Окно аплета Sinus.java

Рисование выполняется следующим образом.

Вначале мы подготавливаем массивы координат точек, составляющих синусоиду. Размер этих массивов равен ширине окна аплета, определяемой динамически при инициализации аплета. Затем ссылки на массивы передаются методу fillPolygon из класса Graphics, который рисует закрашенный многоугольник.

Для рисования синусоид мы создаем отдельный поток как объект класса DrawSinus, созданный на базе класса Thread. Ссылка на него сохраняется в поле m_DrawSinusThread:

DrawSinus m_DrawSinusThread = null;

Что же касается метода paint аплета, то он определяет размеры окна аплета, закрашивает его желтым цветом и рисует вокруг окна черную рамку:

public void paint(Graphics g)
{
  Dimension dimAppWndDimension = size();
    
  g.setColor(Color.yellow);
  g.fillRect(0, 0, 
    dimAppWndDimension.width  - 1, 
    dimAppWndDimension.height - 1);

  g.setColor(Color.black);
  g.drawRect(0, 0, 
    dimAppWndDimension.width  - 1, 
    dimAppWndDimension.height - 1);
}

Задача рисования синусоид запускается методом start, получающим управление при активизации аплета:

public void start()
{
  if (m_DrawSinusThread == null)
  {
    m_DrawSinusThread = 
       new DrawSinus(this);
    m_DrawSinusThread.start();
  }
}

Когда документ HTML, содержащий аплет, исчезает из окна браузера, метод stop останавливает задачу рисования:

public void stop()
{
  if (m_DrawSinusThread != null)
  {
    m_DrawSinusThread.stop();
    m_DrawSinusThread = null;
  }
}

В классе DrawSinus мы определили поле g класса Graphics и поле dimAppWndDimension класса Dimension. Первое из них предназначено для хранения контекста отображения, необходимого для рисования в окне аплета, а второе хранит размеры этого окна.

Перечисленные поля заполняются конструктором класса DrawSinus:

public DrawSinus(Applet Appl)
{
  g = Appl.getGraphics();
  dimAppWndDimension = Appl.size();
}

Основная работа по рисованию выполняется в цикле методом run.

В переменной nPoints хранится ширина окна:

int nPoints = dimAppWndDimension.width;

Массивы xPoints и yPoints хранят координаты точек, составляющих синусоиду:

int[] xPoints = new int[nPoints];
int[] yPoints = new int[nPoints];

Для хранения компонент цвета, которым рисуется синусоида, мы определили три переменные с именами rColor, gColor и bColor:

int rColor, gColor, bColor;

Каждый раз перед рисованием очередной синусоиды метод run вычисляет случайные значения для максимального угла maxAngle, амплитуды Amplitude, постоянной составляющей Offset и фазового сдвига deltaFi:

int maxAngle = (int)((30 * Math.PI) *
  Math.random());
      
int Amplitude = 
  (int)(dimAppWndDimension.height * 
   Math.random());
        
int Offset = 
  (int)(dimAppWndDimension.height * 
  Math.random());
        
double deltaFi = (Math.PI / 2) * 
   Math.random();

Метод random возвращает случайное значение в диапазоне от 0.0 до 1.0. Это значение мы умножаем на максимальное значение, которое не должно быть превышено в процессе генерации случайных чисел.

Что касается максимального угла разворота синусоиды, то мы ограничиваем его значение величиной 30*Math.PI.

Максимальная амплитуда синусоиды ограничивается значением высоты окна аплета dimAppWndDimension.height. Это же значение применяется нами и для ограничения максимального смещения синусоиды по вертикали.

Величина фазового сдвига ограничена значением Math.PI /2.

Заполнение массивов координат выполняется в цикле:

for(int i=0; i < nPoints; i++)
{
  xPoints[i] = i;
  yPoints[i] = Offset + (int)(Amplitude * 
    Math.sin(deltaFi + 
   (double)((maxAngle * i)) / nPoints)); 
}

Вычисление координаты по оси Y выполняется с применением метода Math.sin. Этому методу необходимо передавать значение угла, выраженного в радианах.

Случайные компоненты цвета для рисования синусоиды вычисляются следующим образом:

rColor = (int)(255 * Math.random());
gColor = (int)(255 * Math.random());
bColor = (int)(255 * Math.random());

Они могут находиться в диапазоне от 0 до 255.

Установка цвета в контекст отображения выполняется методом setColor, определенным в классе Graphics:

g.setColor(new Color(
  rColor, gColor, bColor));

После установки цвета метод run рисует изображение синусоиды с помощью метода fillPolygon:

g.fillPolygon(xPoints, yPoints, nPoints);

Перед началом рисования следующей синусоиды в методе run выполняется задержка на 0.3 секунды:

try
{
  Thread.sleep(300);
}
catch (InterruptedException e)
{
  stop();
}

Регулируя эту задержку, вы можете изменять скорость обновления окна аплета.

Назад Вперед

[Назад]