C++ 计算投影到地球上的圆上的点
我和奥斯盖斯一起工作,我试图画出从一个点到一个圆的直线。 首先,我尝试执行以下操作(其中m_x_start_lon和m_y_start_lat是一些任意的起点):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轴转
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计算的半径是一致的。
为了解决这个问题,我取而代之的是以米为单位的从起点到终点的距离,并以此作为半径来找到正确的纬度和经度点我没有时间写一个有用的答案,但是你必须考虑到一个半径超过几公里的圆圈,在热带以外的任何一点上,它会被歪斜,因为纵线在两极相交。在计算圆之前,你需要将圆投影到一个球体上,或者将坐标系从使用的大地水准面投影回三维空间,如果你想避免挤压的话。哦,我知道挤压的问题。它咬了我好几次。然而,我不认为这是一个问题。我应该把距离加在我原来的帖子上,但是水平方向的半径是190米,垂直方向的半径是340米(当两者应该相同的时候)。我不认为挤压会如此极端
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)
}