【发布时间】:2020-03-12 11:00:02
【问题描述】:
我有一段无法理解的代码。
给出一些上下文:我有一条线(由它的角度系数m 定义),我搜索一组线段以找到相交的线段。一个段和一个段向量定义为:
typedef std::pair<Eigen::Vector2d, Eigen::Vector2d> Vector2dPair;
typedef std::vector<Vector2dPair> Vector2dPairVector;
提到的代码是(提供一个最小的工作示例):
#include <iostream>
#include <Eigen/Dense>
typedef std::vector<Eigen::Vector2d> Vector2dVector;
typedef std::pair<Eigen::Vector2d, Eigen::Vector2d> Vector2dPair;
typedef std::vector<Vector2dPair> Vector2dPairVector;
int main()
{
Vector2dPair segment;
segment.first = Eigen::Vector2d(2, -2);
segment.second = Eigen::Vector2d(2, 2);
Vector2dPairVector segments;
segments.push_back(segment);
double angle_min = 0;
double angle_max = M_PI_4;
double angle_increment = M_PI / 16.0;
double range_min = 0.0;
double range_max = 10.0;
Vector2dVector points;
double field_of_view = angle_max - angle_min;
int num_ranges = static_cast<int>(std::nearbyint(std::abs(field_of_view) / angle_increment));
std::cerr << "fov: " << field_of_view << std::endl;
std::cerr << "num ranges: " << num_ranges << std::endl;
points.resize(num_ranges);
for (int i = 0; i < num_ranges; ++i)
{
const double angle = angle_min + i * angle_increment;
std::cerr << "angle: " << angle << std::endl;
const double m = std::tan(angle);
Eigen::Vector2d point = Eigen::Vector2d::Zero();
bool found = false;
for (const auto& segment : segments)
{
// compute segment coefficients (a*x + b*y = c)
double a = segment.second.y() - segment.first.y();
double b = segment.first.x() - segment.second.x();
double c = a * segment.first.x() + b * segment.first.y();
// build A matrix and w vector to setup linear system of equation
Eigen::Matrix2d A;
A << -m, 1, a, b;
Eigen::Vector2d w;
w << 0, c;
// solve linear system to find point of intersection
Eigen::Vector2d p = A.colPivHouseholderQr().solve(w);
// check that the point lies inside the segment
double x_min = std::min(segment.first.x(), segment.second.x());
double x_max = std::max(segment.first.x(), segment.second.x());
double y_min = std::min(segment.first.y(), segment.second.y());
double y_max = std::max(segment.first.y(), segment.second.y());
// point is outside the segment
if (p.x() < x_min || p.x() > x_max || p.y() < y_min || p.y() > y_max)
{
std::cerr << "p: " << p.transpose() << std::endl;
std::cerr << "min: " << x_min << ", " << y_min << std::endl;
std::cerr << "max: " << x_max << ", " << y_max << std::endl;
std::cerr << (p.x() < x_min ? "true" : "false") << std::endl;
std::cerr << (p.x() > x_max ? "true" : "false") << std::endl;
std::cerr << (p.y() < y_min ? "true" : "false") << std::endl;
std::cerr << (p.y() > y_max ? "true" : "false") << std::endl;
continue;
}
std::cerr << "found" << std::endl;
found = true;
point = p;
break;
}
if (!found)
{
throw std::runtime_error("wtf!!");
}
std::cerr << std::endl;
}
return 0;
}
奇怪的是,在某些时候,最终检查的行为与预期不符。特别是,我得到:
p: 2 0.828427
min: 2, -2
max: 2, 2
true
false
false
false
当p.x() = 2 和x_min = 2 时,检查p.x() < x_min 是true。
谁能告诉我是什么问题?
谢谢。
【问题讨论】:
-
问题是这个问题中显示的代码无法满足stackoverflow.com 对minimal reproducible example 的要求,因此stackoverflow.com 上的任何人都不太可能确定问题所在。这个问题必须是edited 以显示一个最小示例,不超过一两页代码(“最小”部分),任何人都可以剪切/粘贴、编译、运行和重现所描述的问题(“可重现”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。
标签: c++ double eigen inequality