Данная итерационная процедура реализована в программе, представленной в листинге 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еm.оut.рrintln("Расстояние от точки броска: "+Math.round (x*100)/100.0+"метров.");
System.out.println("Cкopость: "+Math.round(V()*100)/100.0+" метров в секунду.");
Sуstеm.оut.рrintln("Угол к горизонту: "+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 |


