(radius)
| 1732 | }; |
| 1733 | |
| 1734 | function generateControlPoints(radius) { |
| 1735 | for (var f = start_flight_idx; f < end_flight_idx; ++f) { |
| 1736 | |
| 1737 | var start_lat = flights[f][0]; |
| 1738 | var start_lng = flights[f][1]; |
| 1739 | var end_lat = flights[f][2]; |
| 1740 | var end_lng = flights[f][3]; |
| 1741 | |
| 1742 | var max_height = Math.random() * 0.04; |
| 1743 | |
| 1744 | var points = []; |
| 1745 | var spline_control_points = 8; |
| 1746 | for (var i = 0; i < spline_control_points + 1; i++) { |
| 1747 | var arc_angle = i * 180.0 / spline_control_points; |
| 1748 | var arc_radius = radius + Math.sin(arc_angle * Math.PI / 180.0) * max_height; |
| 1749 | var latlng = latlngInterPoint(start_lat, start_lng, end_lat, end_lng, i / spline_control_points); |
| 1750 | |
| 1751 | var pos = xyzFromLatLng(latlng.lat, latlng.lng, arc_radius); |
| 1752 | |
| 1753 | points.push(new THREE.Vector3(pos.x, pos.y, pos.z)); |
| 1754 | } |
| 1755 | |
| 1756 | var spline = new THREE.SplineCurve3(points); |
| 1757 | |
| 1758 | flight_path_splines.push(spline); |
| 1759 | |
| 1760 | var arc_length = spline.getLength(); |
| 1761 | flight_distance.push(arc_length); |
| 1762 | |
| 1763 | setFlightTimes(f); |
| 1764 | } |
| 1765 | } |
| 1766 | |
| 1767 | function latlngInterPoint(lat1, lng1, lat2, lng2, offset) { |
| 1768 | lat1 = lat1 * Math.PI / 180.0; |
no test coverage detected