З огляду на масив x, y точок, як я сортую точки цього масиву за порядком годинникової стрілки (навколо їх загальної середньої центральної точки)? Моя мета - передати точки функції створення ліній, щоб в кінцевому підсумку виглядати досить «суцільно», як можна випукше, не перетинаючи лінії.
Для чого це варто, я використовую Lua, але будь-який псевдокоп буде вдячний.
Оновлення: Для довідки, це код Lua, заснований на чудовій відповіді Чіамея (ігноруйте мій префікс "app"):
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)
яка перетворює показники та значення tbl від 1 до #tbl. Тож для підрахунку суми ви можете це зробити, що більшість людей здається чистішим:for _, p in ipairs(points) do pointsSum.x = pointsSum.x + p.x; pointsSum.y = pointsSum.y + p.y end
ipairs
значно повільніше, ніж числовий для циклу.