এক্স, ওয়াই পয়েন্টের একটি অ্যারে দেওয়া, আমি কীভাবে এই অ্যারের বিন্দুগুলি ঘড়ির কাঁটার ক্রম (তাদের সামগ্রিক গড় কেন্দ্রের পয়েন্টের চারপাশে) বাছাই করব? আমার লক্ষ্যটি পয়েন্টগুলি একটি লাইন-ক্রিয়া ফাংশনটিতে পৌঁছানোর পরিবর্তে "দৃ "়" দেখায়, কোনও লাইনকে ছেদ না করে যতটা সম্ভব উত্তল হিসাবে দেখা উচিত with
এটির মূল্যের জন্য, আমি লুয়া ব্যবহার করছি তবে যে কোনও সিডোকোড প্রশংসা করবে।
আপডেট: রেফারেন্সের জন্য, এটি কিউমজের দুর্দান্ত উত্তরের ভিত্তিতে লুয়া কোড (আমার "অ্যাপ" উপসর্গটিকে উপেক্ষা করুন):
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)
যে সূচকের উপর iterates এবং মান 1 থেকে tbl এর #tbl করতে। সুতরাং সমষ্টি গণনার জন্য, আপনি এটি করতে পারেন, যা বেশিরভাগ লোককে আরও পরিষ্কার দেখায়:for _, p in ipairs(points) do pointsSum.x = pointsSum.x + p.x; pointsSum.y = pointsSum.y + p.y end
ipairs
লুপের জন্য সংখ্যাগুলির তুলনায় উল্লেখযোগ্যভাবে ধীর।