Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算投影到地球上的圆上的点_C++_Geometry_Geospatial_Geo - Fatal编程技术网

C++ 计算投影到地球上的圆上的点

C++ 计算投影到地球上的圆上的点,c++,geometry,geospatial,geo,C++,Geometry,Geospatial,Geo,我和奥斯盖斯一起工作,我试图画出从一个点到一个圆的直线。 首先,我尝试执行以下操作(其中m_x_start_lon和m_y_start_lat是一些任意的起点): double x_lon=0.0f; 双y_lat=0.0f; 如果(!GetPointFromScreen(args,x_lon,y_lat))返回true; m_stop_x_lon=x_lon; m_stop_y_lat=y_lat; 双x_距离=abs(m_停止x_长度-m_启动x_长度); 双y轴距离=abs(m轴停止y轴转

我和奥斯盖斯一起工作,我试图画出从一个点到一个圆的直线。 首先,我尝试执行以下操作(其中m_x_start_lon和m_y_start_lat是一些任意的起点):

double x_lon=0.0f;
双y_lat=0.0f;
如果(!GetPointFromScreen(args,x_lon,y_lat))返回true;
m_stop_x_lon=x_lon;
m_stop_y_lat=y_lat;
双x_距离=abs(m_停止x_长度-m_启动x_长度);
双y轴距离=abs(m轴停止y轴转动-m轴启动y轴转动);
m_半径=sqrtf(x_距离*x_距离+y_距离*y_距离);
std::向量x_点(m_切片);
std::向量y_点(m_切片);
//m_slices=30,表示圆的线数
对于(标准::尺寸i=0u;i
然而,这只是一种有效的方法。我能得出的唯一结论是,使用纬度和经度某种程度上会扭曲结果

半径水平方向约190米长,垂直方向约340米长。我知道当你离两极更远的时候会发生挤压,但我不认为它会如此极端,直到它超过至少几公里长。即使这样,水平和垂直方向的半径也应该匹配


那么,我必须怎么做才能得到圆边的正确lon,lat坐标呢

计算m_切片循环时,不是将角度切片为(2*PI/m_切片),而是计算从0到m_切片的i的sin()cos()

double dAngle = (2 * PI / m_slices); // in radian

for (std::size_t i = 0u; i < m_slices; ++i)
{
    double new_x = m_start_x_lon + m_radius * cos(i * dAngle);
    double new_y = m_start_y_lat + m_radius * sin(i * dAngle);

    x_points.at(i) = new_x;
    y_points.at(i) = new_y;
}
double-dAngle=(2*PI/m_切片);//弧度
对于(标准::尺寸i=0u;i
此javascript代码(抱歉,没有C++)选择一个随机方向,并在该方向上从给定起点以特定距离绘制一个点

function pointAtDistance(inputCoords, distance) {
    const result = {}
    const coords = toRadians(inputCoords)
    const sinLat =  Math.sin(coords.latitude)
    const cosLat =  Math.cos(coords.latitude)

    const bearing = Math.random() * TWO_PI
    const theta = distance/EARTH_RADIUS
    const sinBearing = Math.sin(bearing)
    const cosBearing =  Math.cos(bearing)
    const sinTheta = Math.sin(theta)
    const cosTheta =    Math.cos(theta)

    result.latitude = Math.asin(sinLat*cosTheta+cosLat*sinTheta*cosBearing);
    result.longitude = coords.longitude + 
    Math.atan2( sinBearing*sinTheta*cosLat, cosTheta-sinLat*Math.sin(result.latitude )
        );
    result.longitude = ((result.longitude+THREE_PI)%TWO_PI)-Math.PI

    return toDegrees(result)
}
inputCoords是一个具有{纬度:n,经度:m}的对象

在这里,您可以找到缺少的位,如常量值和实用函数

地球半径以米为单位,因此可以以米为单位指定距离

结果经度被钳制在-180->+180度的范围内

如果你想让点有规律地分布在圆的周围,就把随机的轴承部分撕下来,然后输入0到2μPI之间的数字

编辑:我应该提到,这段代码是基于的算法。好吧,我想出来了——我(愚蠢地)认为用lat,lon计算的半径是一致的。
为了解决这个问题,我取而代之的是以米为单位的从起点到终点的距离,并以此作为半径来找到正确的纬度和经度点function pointAtDistance(inputCoords, distance) { const result = {} const coords = toRadians(inputCoords) const sinLat = Math.sin(coords.latitude) const cosLat = Math.cos(coords.latitude) const bearing = Math.random() * TWO_PI const theta = distance/EARTH_RADIUS const sinBearing = Math.sin(bearing) const cosBearing = Math.cos(bearing) const sinTheta = Math.sin(theta) const cosTheta = Math.cos(theta) result.latitude = Math.asin(sinLat*cosTheta+cosLat*sinTheta*cosBearing); result.longitude = coords.longitude + Math.atan2( sinBearing*sinTheta*cosLat, cosTheta-sinLat*Math.sin(result.latitude ) ); result.longitude = ((result.longitude+THREE_PI)%TWO_PI)-Math.PI return toDegrees(result) }