60 if (
Type ==
"WAYPOINT_HEADING") WaypointType = eHeading;
61 else if (
Type ==
"WAYPOINT_DISTANCE") WaypointType = eDistance;
63 target_latitude_unit = 1.0;
64 target_longitude_unit = 1.0;
65 source_latitude_unit = 1.0;
66 source_longitude_unit = 1.0;
67 source =
fcs->GetExec()->GetIC()->GetPosition();
70 target_latitude.reset(new FGPropertyValue(element->FindElementValue(
"target_latitude"),
72 if (element->FindElement(
"target_latitude")->HasAttribute(
"unit")) {
73 if (element->FindElement(
"target_latitude")->GetAttributeValue(
"unit") ==
"DEG") {
74 target_latitude_unit = 0.017453293;
78 cerr << element->ReadFrom() << endl
79 <<
"Target latitude is required for waypoint component: " << Name
81 throw(
"Malformed waypoint definition");
84 if (element->FindElement(
"target_longitude") ) {
85 target_longitude.reset(new FGPropertyValue(element->FindElementValue(
"target_longitude"),
87 if (element->FindElement(
"target_longitude")->HasAttribute(
"unit")) {
88 if (element->FindElement(
"target_longitude")->GetAttributeValue(
"unit") ==
"DEG") {
89 target_longitude_unit = 0.017453293;
93 cerr << element->ReadFrom() << endl
94 <<
"Target longitude is required for waypoint component: " << Name
96 throw(
"Malformed waypoint definition");
99 if (element->FindElement(
"source_latitude") ) {
100 source_latitude.reset(new FGPropertyValue(element->FindElementValue(
"source_latitude"),
102 if (element->FindElement(
"source_latitude")->HasAttribute(
"unit")) {
103 if (element->FindElement(
"source_latitude")->GetAttributeValue(
"unit") ==
"DEG") {
104 source_latitude_unit = 0.017453293;
108 cerr << element->ReadFrom() << endl
109 <<
"Source latitude is required for waypoint component: " << Name
111 throw(
"Malformed waypoint definition");
114 if (element->FindElement(
"source_longitude") ) {
115 source_longitude.reset(new FGPropertyValue(element->FindElementValue(
"source_longitude"),
117 if (element->FindElement(
"source_longitude")->HasAttribute(
"unit")) {
118 if (element->FindElement(
"source_longitude")->GetAttributeValue(
"unit") ==
"DEG") {
119 source_longitude_unit = 0.017453293;
123 cerr << element->ReadFrom() << endl
124 <<
"Source longitude is required for waypoint component: " << Name
126 throw(
"Malformed waypoint definition");
129 if (element->FindElement(
"radius"))
130 radius = element->FindElementValueAsNumberConvertTo(
"radius",
"FT");
132 radius = 20925646.32546;
135 unit = element->GetAttributeValue(
"unit");
136 if (WaypointType == eHeading) {
138 if (unit ==
"DEG") eUnit = eDeg;
139 else if (unit ==
"RAD") eUnit = eRad;
141 cerr << element->ReadFrom() << endl
142 <<
"Unknown unit " << unit <<
" in HEADING waypoint component, "
144 throw(
"Malformed waypoint definition");
151 if (unit ==
"FT") eUnit = eFeet;
152 else if (unit ==
"M") eUnit = eMeters;
154 cerr << element->ReadFrom() << endl
155 <<
"Unknown unit " << unit <<
" in DISTANCE waypoint component, "
157 throw(
"Malformed waypoint definition");
179 double source_latitude_rad = source_latitude->GetValue() * source_latitude_unit;
180 double source_longitude_rad = source_longitude->GetValue() * source_longitude_unit;
181 double target_latitude_rad = target_latitude->GetValue() * target_latitude_unit;
182 double target_longitude_rad = target_longitude->GetValue() * target_longitude_unit;
183 source.SetPosition(source_longitude_rad, source_latitude_rad, radius);
185 if (fabs(target_latitude_rad) >
M_PI/2.0) {
187 cerr <<
"Target latitude in waypoint \"" <<
Name <<
"\" must be less than or equal to 90 degrees." << endl;
188 cerr <<
"(is longitude being mistakenly supplied?)" << endl;
190 throw(
"Waypoint target latitude exceeded 90 degrees.");
193 if (fabs(source_latitude_rad) >
M_PI/2.0) {
195 cerr <<
"Source latitude in waypoint \"" <<
Name <<
"\" must be less than or equal to 90 degrees." << endl;
196 cerr <<
"(is longitude being mistakenly supplied?)" << endl;
198 throw(
"Source latitude exceeded 90 degrees.");
201 if (WaypointType == eHeading) {
203 double heading_to_waypoint_rad = source.GetHeadingTo(target_longitude_rad,
204 target_latitude_rad);
207 else Output = heading_to_waypoint_rad;
211 double wp_distance = source.GetDistanceTo(target_longitude_rad,
212 target_latitude_rad);
214 else Output = wp_distance;