哈士奇WWW
2019-08-30 10:27:30
按順時(shí)針順序排序點(diǎn)?給定一個(gè)x,y點(diǎn)數(shù)組,如何按順時(shí)針順序(圍繞它們的整體平均中心點(diǎn))對(duì)該數(shù)組的點(diǎn)進(jìn)行排序?我的目標(biāo)是將點(diǎn)傳遞給線創(chuàng)建函數(shù),以最終看起來相當(dāng)“堅(jiān)實(shí)”的東西,盡可能凸起,沒有相交的線。為了它的價(jià)值,我正在使用Lua,但任何偽代碼都會(huì)受到贊賞。非常感謝您的幫助!更新:作為參考,這是基于Ciamej優(yōu)秀答案的Lua代碼(忽略我的“app”前綴):function appSortPointsClockwise(points) local centerPoint = appGetCenterPointOfPoints(points) app.pointsCenterPoint = centerPoint table.sort(points, appGetIsLess) return pointsendfunction appGetIsLess(a, b) local center = app.pointsCenterPoint if a.x >= 0 and b.x < 0 then return true elseif a.x == 0 and b.x == 0 then return a.y > b.y end local det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y) if det < 0 then return true elseif det > 0 then return false end local d1 = (a.x - center.x) * (a.x - center.x) + (a.y - center.y) * (a.y - center.y) local d2 = (b.x - center.x) * (b.x - center.x) + (b.y - center.y) * (b.y - center.y) return d1 > d2endfunction appGetCenterPointOfPoints(points) local pointsSum = {x = 0, y = 0} for i = 1, #points do pointsSum.x = pointsSum.x + points[i].x; pointsSum.y = pointsSum.y + points[i].y end return {x = pointsSum.x / #points, y = pointsSum.y / #points}end
3 回答

鳳凰求蠱
TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
您要求的是一個(gè)稱為極坐標(biāo)的系統(tǒng)。從笛卡爾坐標(biāo)到極坐標(biāo)的轉(zhuǎn)換很容易用任何語(yǔ)言完成。公式可以在本節(jié)中找到。
我不認(rèn)識(shí)Lua,但此頁(yè)面似乎提供了此轉(zhuǎn)換的代碼段。
轉(zhuǎn)換為極坐標(biāo)后,只需按角度θ進(jìn)行排序。

慕的地8271018
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
解決問題的一個(gè)有趣的替代方法是找到旅行商問題(TSP)的近似最小值,即。連接所有積分的最短路線。如果你的點(diǎn)形成凸形,它應(yīng)該是正確的解決方案,否則,它應(yīng)該仍然看起來很好(“實(shí)心”形狀可以定義為具有低周長(zhǎng)/面積比的形狀,這是我們?cè)谶@里優(yōu)化的) 。
您可以為TSP使用優(yōu)化器的任何實(shí)現(xiàn),我非常確定您可以用您選擇的語(yǔ)言找到它。
添加回答
舉報(bào)
0/150
提交
取消