作者AutoTea (自動茶)
看板C_Sharp
標題[問題] 判斷座標是否落於範圍內
時間Mon Nov 6 23:09:58 2017
想請教各位前輩,小弟目前有一個問題:
(x1,y1)┌────────────┐(x2,y2)
│ │
│ .←(x,y) │
│ │
(x3,y3)└────────────┘(x4,y4)
目前判斷(x,y)是否於上面四方型的方法是採用:GraphicsPath.IsVisible
x1 <-> x2 = width y1 <-> y2 =height
width, heihgt 的範圍太大了(20000以上),往往判斷一符圖下來要10分鐘以上
(跑width, heihgt loop),不知各位前輩有沒有什麼好方法,可以讓速度再快一點?
感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.253.83.48
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1509981000.A.2F1.html
1F:推 anumis: 2萬的項目純判斷迴圈很快吧,應該不到1秒,你的程式碼方便 11/07 00:48
2F:→ anumis: 貼出來嗎? 11/07 00:48
3F:→ stupid0319: 改成C語言應該可以快一倍 11/07 01:04
for (int iY = 0; iY < iHeight; ++iY)
{
for (int iW = 0; iW < iWidth; ++iW)
{
mouseLocation.X = (float)iNodataX;
if (!range.IsVisible(mouseLocation))
{
dataArray[temp1 + iY * iWidth + iW] = Convert.ToDouble(null);
dataArray[temp2 + iY * iWidth + iW] = Convert.ToDouble(null);
dataArray[temp3 + iY * iWidth + iW] = Convert.ToDouble(null);
}
}
}
概略是上面 有經過測試,當iHeight 跟iWidth愈大的時候會愈慢
主要是慢在 range.IsVisible <-判斷座標是否在該範圍內
4F:推 Laluth: 如果這是迴圈內全部的程式碼的話if判斷應該可以移到迴圈外 11/07 09:36
5F:→ hrih: 用外積判斷就好了,給你關鍵字,射線法 11/07 14:38
感謝h大,後來google射線法後 確實以該法就解決了。
6F:推 Litfal: 因為GraphicsPath.IsVisible比你想像中複雜,如果都是矩形 11/07 20:12
7F:→ Litfal: 請用Rectangle.Contains 11/07 20:13
8F:→ Litfal: 然後根本不需要掃整個矩形範圍檢查,只要跑四個迴圈設定 11/07 20:18
9F:→ Litfal: 矩形範圍外的就好 11/07 20:18
回L大 很感謝您 其實原先就是3個(跟您4個是相同的意思)迴圈,
沒有全跑 不過也是很慢
您說的Rectangle.Contains 我會再找時間試看看,真的很感謝前輩^^
※ 編輯: AutoTea (111.253.79.212), 11/07/2017 23:22:42
10F:推 bestman8556: 碰過這種類似問題,射線法解決+1 11/22 12:19