Diberikan array x, poin y, bagaimana cara saya mengurutkan poin array ini dalam urutan searah jarum jam (sekitar titik tengah rata-rata keseluruhan)? Tujuan saya adalah meneruskan poin ke fungsi pembuatan garis untuk menghasilkan sesuatu yang terlihat "solid", cembung mungkin tanpa garis yang berpotongan.
Untuk apa nilainya, saya menggunakan Lua, tetapi kodesemu apa pun akan dihargai.
Pembaruan: Untuk referensi, ini adalah kode Lua berdasarkan pada jawaban Ciamej yang sangat baik (abaikan awalan "aplikasi" saya):
function appSortPointsClockwise(points)
local centerPoint = appGetCenterPointOfPoints(points)
app.pointsCenterPoint = centerPoint
table.sort(points, appGetIsLess)
return points
end
function 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 > d2
end
function 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
ipairs(tbl)
bawaan yang mengulangi indeks dan nilai tbl dari 1 hingga #tbl. Jadi untuk perhitungan penjumlahan, Anda dapat melakukan ini, yang menurut kebanyakan orang terlihat lebih bersih:for _, p in ipairs(points) do pointsSum.x = pointsSum.x + p.x; pointsSum.y = pointsSum.y + p.y end
ipairs
secara signifikan lebih lambat daripada numerik untuk loop.