[問題] 判斷座標是否落於範圍內

看板C_Sharp作者 (自動茶)時間6年前 (2017/11/06 23:10), 6年前編輯推噓4(406)
留言10則, 6人參與, 6年前最新討論串1/2 (看更多)
  想請教各位前輩,小弟目前有一個問題: (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://www.ptt.cc/bbs/C_Sharp/M.1509981000.A.2F1.html

11/07 00:48, 6年前 , 1F
2萬的項目純判斷迴圈很快吧,應該不到1秒,你的程式碼方便
11/07 00:48, 1F

11/07 00:48, 6年前 , 2F
貼出來嗎?
11/07 00:48, 2F

11/07 01:04, 6年前 , 3F
改成C語言應該可以快一倍
11/07 01:04, 3F
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 <-判斷座標是否在該範圍內

11/07 09:36, 6年前 , 4F
如果這是迴圈內全部的程式碼的話if判斷應該可以移到迴圈外
11/07 09:36, 4F

11/07 14:38, 6年前 , 5F
用外積判斷就好了,給你關鍵字,射線法
11/07 14:38, 5F
感謝h大,後來google射線法後 確實以該法就解決了。

11/07 20:12, 6年前 , 6F
因為GraphicsPath.IsVisible比你想像中複雜,如果都是矩形
11/07 20:12, 6F

11/07 20:13, 6年前 , 7F
請用Rectangle.Contains
11/07 20:13, 7F

11/07 20:18, 6年前 , 8F
然後根本不需要掃整個矩形範圍檢查,只要跑四個迴圈設定
11/07 20:18, 8F

11/07 20:18, 6年前 , 9F
矩形範圍外的就好
11/07 20:18, 9F
回L大 很感謝您 其實原先就是3個(跟您4個是相同的意思)迴圈, 沒有全跑 不過也是很慢 您說的Rectangle.Contains 我會再找時間試看看,真的很感謝前輩^^ ※ 編輯: AutoTea (111.253.79.212), 11/07/2017 23:22:42

11/22 12:19, 6年前 , 10F
碰過這種類似問題,射線法解決+1
11/22 12:19, 10F
文章代碼(AID): #1Q07j8Bn (C_Sharp)
文章代碼(AID): #1Q07j8Bn (C_Sharp)