Classificar pontos no sentido horário?

Dada uma matriz de x, y pontos, como classifico os pontos dessa matriz na ordem dos ponteiros do relógio (em torno de seu ponto central médio geral)? Meu objetivo é passar os pontos para uma função de criação de linhas para terminar com algo parecendo "sólido", o mais convexo possível, sem linhas que se cruza

Pelo que vale a pena, estou usando Lua, mas qualquer pseudocódigo seria apreciado. Muito obrigado por qualquer ajuda

Atualizar Para referência, este é o código Lua baseado na excelente resposta de Ciamej (ignore meu prefixo "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

questionAnswers(5)

yourAnswerToTheQuestion