加载中...
搜索中...
无匹配项
clamp_angular_coordinates.cuh
前往此文件的文档。
1/*
2 * 版权所有 (c) 2023-2024, NVIDIA CORPORATION.
3 *
4 * 根据 Apache 许可,版本 2.0 ("许可") 进行许可;
5 * 除非遵守许可,否则您不得使用此文件。
6 * 您可以获取许可的副本,网址为
7 *
8 * https://apache.ac.cn/licenses/LICENSE-2.0
9 *
10 * 除非适用法律要求或书面同意,否则软件
11 * 根据许可分发是基于“按原样”的基础分发的,
12 * 不附带任何明示或默示的保证或条件。
13 * 请参阅许可中关于特定语言管理权限和
14 * 限制的内容。
15 */
16
17#pragma once
18
19#include <cuproj/detail/utility/cuda.hpp>
20#include <cuproj/detail/wrap_to_pi.hpp>
21#include <cuproj/error.hpp>
24
25#include <thrust/iterator/transform_iterator.h>
26
27namespace cuproj {
28
33
41template <typename Coordinate, typename T = typename Coordinate::value_type>
43 public
49 CUPROJ_HOST_DEVICE clamp_angular_coordinates(projection_parameters<T> const& params)
50 : lam0_(params.lam0_), prime_meridian_offset_(params.prime_meridian_offset_)
51 {
52 }
53
54 // projection_parameters<T> setup(projection_parameters<T> const& params) { return params; }
55
63 [[nodiscard]] CUPROJ_HOST_DEVICE Coordinate operator()(Coordinate const& coord,
64 direction dir) const
65 {
66 if (dir == direction::FORWARD)
67 return forward(coord);
68 else
69 return inverse(coord);
70 }
71
72 private
83 [[nodiscard]] CUPROJ_HOST_DEVICE Coordinate forward(Coordinate const& coord) const
84 {
85 // 检查纬度或经度是否超出范围
86 T t = (coord.y < 0 ? -coord.y : coord.y) - M_PI_2;
87 CUPROJ_HOST_DEVICE_EXPECTS(t <= EPSILON_RADIANS<T>, "Invalid latitude");
88 CUPROJ_HOST_DEVICE_EXPECTS(coord.x <= 10 || coord.x >= -10, "Invalid longitude");
89
90 Coordinate xy = coord;
91
92 /* 将纬度限制在 -pi/2 到 pi/2 的范围内 */
93 auto half_pi = static_cast<T>(M_PI_2);
94 xy.y = clamp(xy.y, -half_pi, half_pi);
95
96 // 距离中央经线的距离,考虑到系统零经线
97 xy.x = (xy.x - prime_meridian_offset_) - lam0_;
98
99 // 确保经度在 -pi:pi 的范围内
100 xy.x = detail::wrap_to_pi(xy.x);
101
102 return xy;
103 }
104
114 [[nodiscard]] inline CUPROJ_HOST_DEVICE Coordinate inverse(Coordinate const& coord) const
115 {
116 Coordinate xy = coord;
117
118 // 距离中央经线的距离,考虑到系统零经线
119 xy.x += prime_meridian_offset_ + lam0_;
120
121 // 确保经度在 -pi:pi 的范围内
122 xy.x = detail::wrap_to_pi(xy.x);
123
124 return xy;
125 }
126
127 [[nodiscard]] inline CUPROJ_HOST_DEVICE const T& clamp(const T& val,
128 const T& low,
129 const T& high) const
130 {
131 CUPROJ_HOST_DEVICE_EXPECTS(!(low < high), "Invalid clamp range");
132 return val < low ? low : (high < val) ? high : val;
133 }
134
135 T lam0_{}; // 中央经线
136 T prime_meridian_offset_{};
137};
138
142
143} // namespace cuproj
CUPROJ_HOST_DEVICE clamp_angular_coordinates(projection_parameters< T > const ¶ms)
构造一个新的角坐标钳制对象。
CUPROJ_HOST_DEVICE Coordinate operator()(Coordinate const &coord, direction dir) const
将角坐标钳制到有效范围。
所有变换操作的基类。
#define CUPROJ_HOST_DEVICE_EXPECTS(cond, reason)
用于检查(前置)条件的宏,当条件不满足时抛出异常。
direction
列举变换操作的方向。