Данная итерационная процедура реализована в программе, представленной в листинге 9.

Листинг 9. Полет тела

class BodyFlight{

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

private final static double g=9.8;

// Коэффициент для силы сопротивления:

private final static double gamma=0.005;

// Количество итераций:

private final static int n=1000;

// Момент времени:

private double t;

// Тело:

private Body body;

// Расчет траектории тела:

private void calculate(){

// Координаты, скорость и приращения:

double x, y, dx, dy, Vx, Vy, dVx, dVy, dt;

// Индексная ·переменная:

int i;

// Сила:

Force F=new Fоrсе();

// Начальные координаты и скорость:

x=body. x;

y=body. y;

Vx=body. Vx;

Vy=body. Vy;

// Шаг дискретности по времени:

dt=t/n;

// Вычисление координат и скорости:

for(i=1;i<=n;i++){

dx=Vx*dt;

dy=Vy*dt;

dVx=F. x(body)*dt/body. m;

dVy=F. y(body)*dt/body. m;

x+=dx;

y+=dy;

Vx+=dVx;

Vy+=dVy;

body.set(х, у, Vx, Vy); }

}

// Конструктор класса:

BodyFlight(doublе[ ] раrams) {

// Масса (перевод из граммов в килограммы):

double m=params[0]/1000;

// Координаты:

doublе х=раrams[1];

double y=params[2];

// Угол к горизонту:

double alpha=Math. toRadians(params[4]);

// Компоненты скорости:

double Vх=раrаms[3]*Маth.соs(аlрhа);

double Vу=раrаms[3]*Маth. Sin(аlрhа);

// Объект для "тела":

body=new Body(m, x,y, Vx, Vy);

// Время:

this. t=params[5];

// Расчет положения тела в момент времени t:

calculate();

НЕ нашли? Не то? Что вы ищете?

// Отображение результата расчетов:

body. show();

}

//Внутренний класс для "тела":

classBody{

// Масса:

double m;

// Координаты:

double x;

double у;

// Компоненты скорости:

double Vx;

double Vy;

// Модуль скорости:

double V(){ .

return Math. sqrt(Vx*Vx+Vy*Vy); }

// Метод для вычисления угла к горизонту:

double phi(){

return Math. atan2(Vy, Vx);}

// Конструктор внутреннего класса:

Body(double m, double x, double y, double Vx, double Vy){

this. m=m; .

set(x, y, Vx, Vy);

}

// Метод для присваивания значений полям

// (координаты и компоненты скорости):

void set(double x, double y, double Vx, double Vy){

this. x=x;

this. y=y;.

this. Vx=Vx;

this.Vy=Vy; }

// Метод для отображения параметров объекта:

void show() {

double alpha=Math. round(Math. toDegrees(phi())*100)/100.0;

System.out.println("B момент времени t="+t+," секунд положение тела следующее.");

System.out.println("Bыcoтa: "+Math.round(y*100)/100.0+" метров над горизонтом.");

Sуstеmutrintln("Расстояние от точки броска: "+Math.round (x*100)/100.0+"метров.");

System.out.println("Cкopость: "+Math.round(V()*100)/100.0+" метров в секунду.");

Sуstеmutrintln("Угол к горизонту: "+alpha+" градусов.");}

}

// Внутренний класс для "силы":

class Force {

// Проекция на горизонтальную ось:

double x(Body obj) {

return - gаmmа*оbj. Vх;}

// Проекция на вертикальную ось:

double y(Body obj){

return - g*оbj. m-gаmmа*оbj. Vу;}

} }

class BodyFlightDemo{

public static void main(String[] args){

// Параметры (масса (в граммах), начальные координаты (в метрах),

// скорость (в м/с)), угол (в градусах) и время (в секундах)):

double[] params={100,0,0,150,30,5};

// Анонимный объект:

new BodyFlight(params);

}}

Для решения программными методами поставленной задачи создается класс BodyFlight, в котором объявляются еще два внутренних класса: класс Body для реализации объекта «тела» и класс Force для реализации объекта «силы». Внутренний класс Body имеет пять полей типа doublе: масса тела m, координаты х и у, а также проекции скорости на координатные оси Vx и Vy. Методом класса V() в качестве значения возвращается модуль скорости тела (определяется как ). Методом phi() возвращается угол к горизонту, под которым направлена траектория тела. Для вычисления результата предназначен встроенный метод atan2(), который возвращает угол (в радианах) точки, координаты которой заданы аргументами метода (первый аргумент - координата по вертикали, второй аргумент - координата по горизонтали). Метод set() предназначен для того, чтобы задавать значения координат и проекций скорости для тела (соответствующие значения указываются аргументами метода). Этот метод, кроме прочего, вызывается в конструкторе класса. У конструктора пять аргументов - при создании объекта для каждого из полей нужно указать значение.

Метод show() внутреннего класса Body предназначен для отображения таких параметров, как координаты тела, его скорость и направление. Выводимые значения имеют до двух цифр после запятой, для чего соответствующим образом округляются. Угол к тому же переводится в градусы.

Внутренний класс Force достаточно прост и содержит всего два метода х() и у() для вычисления проекций действующей на тело силы. Объект, описывающий это тело, передается аргументом методам.

Кроме внутренних классов, в классе BodyFlight описываются закрытые поля: поле g (ускорение свободного падения), поле gamma (коэффициент сопротивления), поле n (количество итераций) описаны как final (значение полей изменять нельзя) и static (статические). Закрытое поле t предназначено для записи момента времени, для которого вычисляется положение тела. Закрытое поле body - это объектная переменная класса Body. Переменная предназначена для записи в нее ссылки на объект, положение которого вычисляется в главном методе программы. Эта переменная используется в методе calculate() - закрытом методе, который вызывается в конструкторе класса BodyFlight и предназначен для непосредственного вычисления координат и компонентов скорости тела. В методе реализована описанная ранее схема вычислений. В нем, кроме прочего, создается объект внутреннего класса Force, который необходим для вычисления изменения скорости тела.

Конструктору класса BodyFlight в качестве аргумента передается массив из пяти элементов. Эти элементы последовательно определяют следующие параметры: масса тела (в граммах), координаты (в метрах), модуль скорости (в метрах в секунду), угол, под которым направлена скорость к горизонту (в градусах), момент времени (в секундах), для которого вычисляется положение тела. Отметим, что значение для массы из граммов должно быть переведено в килограммы, для чего делится на 1000. Градусы при расчетах переводятся в радианы с помощью функции Math. toRadians(), а для обратного преобразования (радиан в градусы) служит функция Math. toDegrees(). Компоненты скорости тела по модулю скорости V и углу (к горизонту) а определяются соответственно как Vx = V cos(a) и Vy = Vsin(a).

В результате выполнения программы получаем:

В момент времени t=5.0 секунд положение тела следующее.

Высота: 219.03 метра над горизонтом.

Расстояние от точки броска: 574.76 метра.

Скорость: 102.28 метра в секунду.

Угол к горизонту: 8.46 градусов.

Обращаем внимание, что в главном методе программы, кроме массива params с исходными расчетными значениями, создается анонимный объект класса BodyFlight. При этом все необходимые вычисления, включая вывод результатов на экран, выполняются автоматически при вызове конструктора.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8