我是一名刚开始使用C ++的程序员,并且一直在学习如何编写代码,这是我正在做的工作,以帮助为一组特定的仪器准备分析,以进行一组核化学/物理实验。编写此特定脚本是为了在ROOT(http://root.cern.ch)分析程序包中运行,该程序包使用C ++作为其脚本语言,这就是为什么它不具有main()函数且未定义名称空间的原因。可以对其稍作改动以将其编译为独立的可执行文件,但是我并没有感到烦恼,因为此脚本的目的是测试数据文件的解析(工作正常),然后检查用户提供的x,y坐标在多边形内部。多边形x,y坐标是由我编写的另一个ROOT脚本生成的,该脚本会在用户进行数据的2D表示并标记感兴趣的区域时保存一个包含顶点的文本文件。
我的问题在于pnpoly算法的实现。因为脚本中知道要获取哪个数据文件的部分已知可以正常工作,所以我暂时禁用了所有询问问题的代码,以缩小从哪个文件中提取并放入静态值的范围。由于脚本现在是正确的,因此它仅询问用户要测试的x,y坐标。
代码解析数据文件,计算有多少个顶点,并构建两个float数组,其中一个包含所有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部分)。
最佳答案
在您的代码中,if语句中有一个赋值:
if (c = 1) {bool inPoly = true;} else {bool inPoly = false;}
也许你是这个意思?
if (c == 1) { inPoly = true;} else { inPoly = false;}
编辑:也接受了弗朗索瓦·莫伊桑(FrançoisMoisan)的评论。