gpt4 book ai didi

algorithm - 3D 视线算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:35 24 4
gpt4 key购买 nike

我目前正在实现一种视线算法,它会告诉我沿着一条线可以看到和不能看到的点。所以,如果我站在一些丘陵地带的顶部,我可以知道我能看到哪里,不能看到哪里。

从 A 点到 B 点生成的线包括一些在 A 和 B 之间均匀分布的点。从 A 开始,我看到 A 和 B 之间的仰角是多少。我注意到我的 alphaAngle.

接下来,对于 A 和 B 之间的每个点,我得到 A 和该点之间的仰角。如果那个点是到目前为止的最高仰角(不包括 alphaAngle),那么我就这样标记它。否则,它的仰角较低,因此我应该看不到它,并将该点标记为具有 hasLOS = false

以下是我使用的一些对象定义:

struct TerrainProfilPnt
{
double m_x_lon; //lon
double m_y_lat; //lat
double m_z_elev; //elev
bool m_hasLOS; //Does this point have line of sight from another point?
};

class TerrainProfilePartitioner; // Holds a collection of points that make up the line

这是我写出的算法,但它没有返回正确的结果。要么它在不应该的时候声称它有 LOS(比如从一座山后面走到另一座山的另一边,我不应该看到它)。或者它声称我看不到终点(山顶到山下的山谷)。因此,我怀疑我寻找视线的实现方式不正确,或者我在代码中实现方式有误。

using Point = TerrainProfilePnt;

auto pointsInLine = terrainProfilePartitioner->GetPoints();
auto& pointsVec = pointsInLine->GetVector();
std::vector<Point> terrainProfileVec;
terrainProfileVec.reserve(pointsVec.size());

double start_xlon = 0.0f;
double start_ylat = 0.0f;
double start_zelev = 0.0f;

double end_xlon = 0.0f;
double end_ylat = 0.0f;
double end_zelev = 0.0f;

//The angle between the starting point and the ending point
double initialElevAngle = 0.0f;


//Assemble the first and last points
start_xlon = pointsVec.front().x();
start_ylat = pointsVec.front().y();
GetPointElevation(start_xlon, start_ylat, start_zelev);
end_xlon = pointsVec.back().x();
end_ylat = pointsVec.back().y();
GetPointElevation(end_xlon, end_ylat, end_zelev);

//Calculate the angle between the beginning and ending points
initialElevAngle = atan2(start_zelev, end_zelev) * 180 / M_PI;

Point initialPoint;
initialPoint.m_x_lon = start_xlon;
initialPoint.m_y_lat = start_ylat;
initialPoint.m_z_elev = start_zelev;
initialPoint.m_hasLOS = true;

//pointsVec.push_back(initialPoint);
terrainProfileVec.push_back(initialPoint);

double oldAngle = 0.0f;;
bool hasOldAngle = false;
for (std::size_t i = 1; i < pointsVec.size(); ++i)
{
Point p;
p.m_x_lon = pointsVec.at(i).x();
p.m_y_lat = pointsVec.at(i).y();
GetPointElevation(p.m_x_lon, p.m_y_lat, p.m_z_elev);

double newAngle = atan2(start_zelev, p.m_z_elev) * 180 / M_PI;
if (!hasOldAngle)
{
hasOldAngle = true;
oldAngle = newAngle;
p.m_hasLOS = true;
}
else
{
if (newAngle < oldAngle)
{
p.m_hasLOS = false;
}
else
{
oldAngle = newAngle;
p.m_hasLOS = true;
}
}

}

auto terrainPrfileSeq = new Common::ObjectRandomAccessSequence<TerrainProfilePnt>(terrainProfileVec);

return terrainPrfile

最佳答案

atan2(start_zelev, p.m_z_elev) 没有意义。你需要

    atan2(distance, p.m_z_elev - start_zelev);

其中 distancepinitialPoint 之间的水平距离。

关于algorithm - 3D 视线算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39864876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com