为什么我的pnpoly的C++实现总是返回true
Why does my C++ implementation of pnpoly always return true?
我是一名初级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。例如,我测试了700001000点,它远远超出了感兴趣的区域。我对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
这个网站上的编辑器似乎不喜欢我的代码,所以完整的脚本(不仅仅是pnpoly部分)可以在http://pastebin.com/Nk6srJfp.
在代码中,if语句中有一个赋值:
if (c = 1) {bool inPoly = true;} else {bool inPoly = false;}
也许你是这个意思?
if (c == 1) { inPoly = true;} else { inPoly = false;}
编辑:也接受了弗朗索瓦·莫伊桑的评论。
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- MFC 的 OnInit() 函数中的返回 true 和返回 false 有什么区别
- 我正在尝试创建一个布尔函数,该函数计算字符并在字符为"()*-+"时返回 true
- 创建一个函数,如果元素在unordered_set中,则返回 true,如何处理模板
- QTimer isActive 返回 true,但 remainingTime 返回 -1
- 为什么在 IsValid(Object) 返回 true 后不能安全地使用 Object?
- 计算 <Classtype*> 向量中所有项的布尔值的最有效方法,如果全部为真则返回 true
- QDir mkpath 返回 true,但未创建目录
- std::is_array 当它应该返回 false 时返回 true
- 尝试创建一个评估字符的bool函数,如果字母数字为字母,则返回true
- 我想返回 True/False 关于值是否在一组值中
- 为什么我的布尔函数返回 true 会导致读取访问冲突?
- ifstream::is_open 返回 true,即使该位置不存在文件也是如此
- 为什么包含指针的条件总是返回 true?
- 对于 ((无符号整数)0-1)返回 true>0
- 为什么#ifndef __func__返回true
- 我的bool函数一直返回true,我不知道为什么
- 对表达式求值,直到表达式返回true
- 在{8,4,6,2}中搜索4时,std::binary_search是否有任何实现将返回true