为什么我的pnpoly的C ++实现总是返回true?

时间:2014-04-10 17:48:11

标签: c++

我是C ++程序员的开始,并且一直在学习如何编写代码作为我正在做的工作的一部分,以帮助准备一组核化学/物理实验的特定仪器的分析。编写此特定脚本是为了在ROOT(http://root.cern.ch)分析包中运行,该分析包使用C ++作为其脚本语言,这就是为什么它没有main()函数并且没有定义命名空间。它可能会被改变一点点编译成一个独立的可执行文件,但我没有打扰,因为这个脚本的目的是测试数据文件的解析(正常工作),然后检查用户提供的x,y坐标在多边形内。多边形x,y坐标由我写的不同ROOT脚本生成,当用户继续进行数据的2D表示并标记感兴趣的区域时,该脚本保存包含顶点的文本文件。

我的问题在于pnpoly算法的实现。因为知道要抓取哪个数据文件的脚本部分已知可行,所以我暂时禁用了所有提出问题的代码,以便缩小要从哪个文件中提取并放入静态值。由于脚本现在是,它只要求用户测试x,y坐标。

代码解析数据文件,计算有多少个顶点,并构建两个浮点数组,其中一个包含所有X坐标,另一个包含Y坐标;这就是我理解pnpoly工作的方式。因为ROOT不允许你在它的脚本中创建函数,所以我稍微修改了pnpoly代码并直接传递了我的顶点数和数组,以及一个不必要的(最终代码不包括它)布尔变量。

我的问题是到目前为止我测试的任何一点,pnpoly函数返回1 / true。例如,我测试了7000,1000点远远超出了感兴趣的区域。我对C ++的理解还不够先进,无法理解矢量算法是如何工作的,尽管我理解它的偶数/奇数边界交叉计数的逻辑,以确定该点是在多边形的内部还是外部。

为什么代码的pnpoly部分似乎没有正确检测用户定义的x,y坐标在哪里?

脚本的pnpoly部分:

bool inPoly;
int i, j, c = 0;
for (i = 0, j = vertices-1; i < vertices; j = i++) {
  if (((PointsY[i] > InputY) != (PointsY[j] > InputY)) && (InputX < (PointsX[j]-PointsX[i]) * (InputY-PointsY[i]) / (PointsY[j]-PointsY[i]) + PointsX[i]))
c = !c;
  if (c = 1) {bool inPoly = true;} else {bool inPoly = false;}
}
if (inPoly) {
  cout << "Test point " << InputX << "," << InputY << " is inside the peak." << endl;
} else {
  cout << "Uh oh. The test point " << InputX << "," << InputY << " is not inside the peak." << endl;
}

以下是此测试的示例数据点,它们存储在数组中:

Line 0: X: -1000.63 Y:  6754.28
Line 1: X:  4639.49 Y:  2639.52
Line 2: X:   5718.2 Y:  3107.11
Line 3: X:  6365.43 Y:  3890.31
Line 4: X:  6149.68 Y:     4580
Line 5: X:  5019.61 Y:  4205.93
Line 6: X:  4218.28 Y:  3527.93
Line 7: X: -1000.63 Y:  6754.28

此网站上的编辑器似乎不喜欢我的代码,因此可以在http://pastebin.com/Nk6srJfp看到完整的脚本(不仅仅是pnpoly部分)。

1 个答案:

答案 0 :(得分:4)

在您的代码中,您在if语句中有一个赋值:

if (c = 1) {bool inPoly = true;} else {bool inPoly = false;}

也许你是这个意思?

if (c == 1) { inPoly = true;} else { inPoly = false;}
编辑:弗朗索瓦·莫伊桑的评论也是如此。