簡體   English   中英

為什么我的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坐標。

代碼解析數據文件,計算有多少個頂點,並構建兩個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)的評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM