Типы данных
Сконструировать тип данных TSpaceSystem, пригодный для хранения в программе данных о спутниковой системе с произвольным количеством спутников. Данные об отдельном спутнике отнести к типу TOrbit.
Сконструировать тип данных TERSat, который помимо данных, включенных в TOrbit, содержал бы дополнительное поле View вещественного типа - размер поля зрения аппаратуры дистанционного зондирования Земли (ДЗЗ).
Сконструировать тип данных TERSSystem, пригодный для хранения в программе данных о спутниковой системе с произвольным количеством спутников. Данные об отдельном спутнике отнести к типу TERSSat.
Функция SunPos
Написать код функции
Function SunPos(ATime: TDateTime): T3DVector
которая возвращает единичный вектор направления из центра Земли на Солнце в АГЭСК в момент времени, заданный параметром ATime. Расчетные формулы компонент вектора
где ,
- число суток между датой ATime и датой, соответствующей 21 марта года даты ATime;
e – угол наклона плоскости экватора Земли к эклиптике (см. модуль MyInstr).
Для работы с датами используйте функции модуля SysUtils Delph:
i
function EncodeDate(Year, Month, Day: word): TDateTime – возвращает дату в форме TDateTime, по параметрам Year (год) Month (месяц), Day (день);
Unit DateUtils,
function YearOf(ATime: TDateTime): word – возвращает год даты ATime;
function DaysBetween(const ANow, AThen): integer – возвращает число суток, прошедших между датами ANow и AThen.
Функция SatInSun
Написать код функции
Function SatInSun(const ASat: TOrbit): Boolean
которая возвращает true если спутник, положение которого задано структурой ASat, освещен Солнцем или false - в противном случае.
Алгоритм
вычислить угол ,
если g£p/2, либо то вернуть true, иначе вернуть false.
где R – вектор положения спутника в АГЭСК;
|
es – единичный вектор направления на Солнце в АГЭСК
– средний радиус Земли. – норма вектора,
– скалярное произведение векторов.
Функция Link
Написать код функции
function Link(const ASat1, ASat2: TOrbit): Boolean,
которая возвращает true если спутники ASat1 и ASat2 в прямой видимости друг друга.
Алгоритм:
1. Вычислить , где
Х1 и Х2 – векторы положения спутников в АГЭСК,
<X1,X2> – скалярное произведение векторов,
RE – средний радиус Земли,
r1, r2 – модули векторов Х1 и Х2 соответственно.
2. Вернуть true если C<0 или false в противном случае.
Функция CanLink
Написать код функции
function CanLink(const ASpaceSys: TSpaceSystem; n, m: integer):Boolean;
которая вернет true если спутники системы ASpaceSys с номерами n и m находятся в прямой видимости друг друга или false в случае когда либо n=m, либо условие видимости не выполняется.
Для проверки условия видимости двух произвольных КА используйте функцию function Link(const ASat1, ASat2: TOrbit): Boolean. (3)
Функция RadioSector
Написать код функции
function RadioSector(const ASat: TOrbit; AElev: real):real,
которая возвращает угловой размер зоны радиовидимости спутника, положение которого задано в структуре ASat, с учетом минимального угла места, заданного параметром AElev.
Расчетная формула , где d – минимальный угол места, h – высота орбиты спутника, RE – средний радиус Земли.
Функция SatTrack
Написать код функции
function SatTrack(const ASat:TOrbit): TLonLat, которая возвращает долготу и широту точки трассы спутника, параметры движения которого содержатся в структуре ASat. Тип данных TLonLat, объявлен так
type TLonLat = record Longitude, Latitude: real end; где Longitude – долгота, Latitude – широта.
Расчетные формулы:
широта:
|
долгота ,
где t – время, отсчитываемое от 0 часов даты расчета,
– долгота пересечения экватора,
– угловая скорость вращения Земли,
– наклонение плоскости орбиты КА к плоскости экватора Земли
u – аргумент широты КА.
Долгота пересечения экватора определяется по формуле
где
– среднее звездное время на 0 часов даты расчета,
W – долгота восходящего узла орбиты.
Для вычисления звездного времени используйте функцию SiderealTime0 из модуля MyInstr
Функция LinkCount
Написать код функции
function LinkCount(const ASpaceSys: TSpaceSystem; n: integer):integer;
которая вернет количество спутников системы ASpaceSys, находящихся в прямой видимости со спутником номер которого в системе равен n.
Для проверки условия видимости двух произвольных КА используйте функцию function Link(const ASat1, ASat2: TOrbit): Boolean. (3)
Функция ViewSector
Написать код функции
function ViewSector(const ASat: TERSat): real,
которая возвращает угловой размер зоны обслуживания аппаратуры спутника с учетом углового размера поля зрения аппаратуры. Все исходные данные содержатся в структуре ASat.
Расчетная формула ,
где g – угловой радиус поля зрения аппаратуры,
H – высота орбиты спутника в точке расчета:
RE – средний радиус Земли.
Функция Swath
Написать код функции Swath(const ASat: TERSat): real, которая возвращает ширину b полосы обзора аппаратуры спутника ДЗЗ.
Расчетная формула ,
где Re – средний радиус Земли;
h – высота КА над Землей;
g– размер поля зрения аппаратуры КА.
Функция IsVisible
Пользователь ГЛОНАСС, находится в точке P с координатами (X,Y,Z) в ГСК. Его приемник «видит» навигационный спутник, параметры движения которого заданы в структуре типа TOrbit, если выполняется условие , где , S – вектор положения спутника в ГСК, RE – средний радиус Земли.
|
Написать код функции function IsVisible(const ASat:TOrbit; const AUser:TGeo): Boolean; которая возвращает true если пользователь AUser «видит» спутник ASat.
Функция SeeCount
Сконструировать тип данных, например, TSpaceSystem, пригодный для хранения в программе данных о спутниковой системе с произвольным количеством спутников. Данные об отдельном спутнике отнести к типу TOrbit. Написать код функции
function SeeCount(const ASatSys: TSpaceSystem; cost AUser: TGeo):integer;
которая возвращает число спутников системы ASatSys видимых из точки, в которой находится AUser.
Функция Mult3DMatr
Написать код функции function Mult3Dmatr(const A, B: T3DMatrix): T3DMatrix, которая возвращает матрицу С произведения А на В, т.е С=А·В, или .
Алгоритм:
Функция Rotation3D
Допустим, что в модуле инструментария имеется функция function Mult3Dmatr(const A, B: T3DMatrix): T3DMatrix, которая возвращает матрицу произведения А на В (см. 12)
Написать код функции function Rotation3D(APx, APy, APz: T3DMartix): T3DMatrix, которая возвращает произведение трех матриц APx, APy и APz.
RotateX, RotateY, RotateZ
Написать коды трех функций, каждая из которых возвращает матрицу поворота прямоугольной системы координат относительно одной из осей опорной системы координат на произвольный угол Angle:
function RotateX(Angle: real): T3DMatrix; - относительно оси X
function RotateY(Angle: real): T3DMatrix; - относительно оси Y
function RotateZ(Angle: real): T3DMatrix; - относительно оси Z
Расчетные формулы.
Матрица поворота на угол α вокруг оси X: ;
Матрица поворота на угол α вокруг осиY: ;
Матрица поворота на угол α вокруг оси Z: .
Функция Rotate
Допустим, что в модуле MyInstr объявлена функция function Rotation3D(APx, APy, APz: T3DMartix): T3DMatrix, которая возвращает произведение трех матриц APx, APy и APz,(13) а также функции вычисления матриц поворота относительно осей X,Y,Z.(14)
Написать код функции
function Rotate(Roll, Yaw, Pitch: real): T3DMatrix, которая вернет матрицу поворота системы координат на углы, заданные параметрами Roll – поворот вокруг оси Х; Yaw – поворот вокруг оси Y; Pitch – поворот вокруг оси Z.
Функция DistBetween
Написать код функции function DistBetween(ASat1, ASat2: TOrbit): real; которая возвращает расстояние в АГЭСК между двумя объектами (спутниками), параметры движения которых заданы в структурах ASat1 и ASat2. Искомая дистанция есть модуль разности векторов , где R1-вектор положения первого спутника в АГЭСК, R2 –вектор положения второго спутника в АГЭСК.
Функция MinDist
Написать код функции function MinDist(const ASys: TSpaceSystem; ASat: TOrbit): real, которая вернет минимальное из расстояний от спутника ASat до всех спутников системы ASys.
Функция Elevation
Написать код функции function Elevation(const AOrbit:TOrbit; const APost:TGeo):real, которая возвращает угол места спутника, относительно пункта наблюдения TPost, положение которого в ГСК заданы в структуре TPost. Параметры движения спутника заданы в структуре TOrbit.
Искомый угол вычисляют по формуле где , где S-вектор положения спутника в ГСК, P – вектор положения пункта в ГСК, RE – средний радиус Земли.
Функция Azimuth
Написать код функции function Azimuth(const AOrbit:TOrbit; const APost:TGeo):real, которая возвращает азимут места спутника, параметры движения которого заданы в структуре TOrbit, относительно пункта наблюдения TPost, положение которого в ГСК задано в структуре TPost.
Алгоритм:
Вычислить угол
Вычислить , где λ–долгота спутника, λP - долгота пункта P.
Вычислить где ϕ–широта спутника, ϕP - широта пункта P.
Вычислить азимут (результат)
Функция AngleAB
Написать код функции function AngleAB(const A, B: T3DVector):real, возвращающей модуль угла между векторами А и В по формуле
угол между векторами .
Функция VectProd
Написать код функции, возвращающей векторное произведение векторов А и В: function VectProd(const A, B: T3DVector): T3DVector.
- векторное произведение
Функция TrueAngle
Написать функцию, которая возвращает угол между векторами А и В с учетом знака поворота вектора В относительно вектора А.
Алгоритм:
1) Вычислить векторное произведение С=А×В.
2) Вычислить модуль угла между векторами А и В
3) Вычислить искомый результат α = ϕ·sign(CZ)
Список функций
SunPos(ATime: TDateTime): T3DVector | Единичный вектор направления на Солнце | ||
SatInSun(const ASat: TOrbit): Boolean | Освещенность КА Солнцем | ||
Link(const ASat1, ASat2: TOrbit): Boolean, | Условие прямой видимости двух КА | ||
CanLink(const ASpaceSys: TSpaceSystem; n, m: integer):Boolean; | Условие видимости КА спутниковой системы | ||
RadioSector(const ASat: TOrbit; AElev: real):real, | Угловой размер зоны радиовидимости | ||
SatTrack(const ASat:TOrbit): TLonLat | Долгота и широта точки трассы | ||
LinkCount(const ASpaceSys: TSpaceSystem; n: integer):integer; | Количество спутников системы, которые видит спутник с номером n | ||
ViewSector(const ASat: TERSat): real | Угловой размер зоны обслуживания | ||
Swath(const ASat: TERSat): real, | Ширина полосы обзора | ||
IsVisible(const ASat:TOrbit; const AUser:TGeo): Boolean; | Возвращает true если спутник видим из пункта AUser | ||
SeeCount(const ASatSys: TSpaceSystem; cost AUser: TGeo):integer; | Количество спутников видимых из пункта AUser | ||
Mult3Dmatr(const A, B: T3DMatrix): T3DMatrix, | Произведение двух квадратных матриц размером 3х3 | ||
Rotation3D(APx, APy, APz: T3DMartix): T3DMatrix, | Произведение трех матриц поворота вокруг осей прямоугольной СК | ||
RotateX(Angle: real): T3DMatrix; - относительно оси X RotateY(Angle: real): T3DMatrix; - относительно оси Y RotateZ(Angle: real): T3DMatrix; - относительно оси Z | Матрицы поворота относительно одной из осей опорной системы координат | ||
Rotate(Roll, Yaw, Pitch: real): T3DMatrix | Матрица поворота системы координат на углы, заданные параметрами Roll – поворот вокруг оси Х; Yaw – поворот вокруг оси Y; Pitch – поворот вокруг оси Z. | ||
DistBetween(ASat1, ASat2: TOrbit): real | расстояние в АГЭСК между двумя объектами (спутниками) | ||
MinDist(const ASys: TSpaceSystem; ASat: TOrbit): real | минимальное из расстояний от спутника ASat до всех спутников системы ASys. | ||
Elevation(const AOrbit:TOrbit; const APost:TGeo):real | угол места спутника относительно пункта наблюдения TPost, | ||
Azimuth(const AOrbit:TOrbit; const APost:TGeo):real, | азимут места спутника, относительно пункта наблюдения TPost | ||
AngleAB(const A, B: T3DVector):real, | модуль угла между векторами А и В | ||
VectProd(const A, B: T3DVector): T3DVector. | Векторное произведение векторов | ||
TrueAngleAB(const A, B: T3DVector):real, | Угол между векторами А и В |