X, y बिंदुओं की एक सरणी को देखते हुए, मैं इस सरणी के बिंदुओं को दक्षिणावर्त क्रम में (उनके समग्र औसत केंद्र बिंदु के आसपास) कैसे क्रमबद्ध करूं? मेरा लक्ष्य कुछ "अंत" को देखने के लिए एक लाइन-निर्माण फ़ंक्शन के बिंदुओं को पास करना है, जैसा कि संभव है कि कोई रेखाओं को जोड़ने के साथ उत्तल न हो।
इसके लायक क्या है, मैं लूआ का उपयोग कर रहा हूं, लेकिन किसी भी छद्मकोड की सराहना की जाएगी।
अद्यतन: संदर्भ के लिए, यह सिआमज के उत्कृष्ट उत्तर (मेरे "ऐप" उपसर्ग को अनदेखा) पर आधारित Lua कोड है:
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)
जो 1 से #tbl तक के टीबी के सूचकांक और मूल्यों पर निर्भर करता है। तो राशि गणना के लिए, आप ऐसा कर सकते हैं, जो ज्यादातर लोगों को साफ दिखता है:for _, p in ipairs(points) do pointsSum.x = pointsSum.x + p.x; pointsSum.y = pointsSum.y + p.y end
ipairs
लूप के लिए संख्यात्मक की तुलना में काफी धीमी है।