x, y 점의 배열이 주어지면이 배열의 점을 시계 방향으로 (전체 평균 중심점 주위) 어떻게 정렬합니까? 저의 목표는 점을 선 작성 함수에 전달하여 선이 교차하지 않고 가능한 한 볼록한 모양으로 "단단한"것으로 보이게하는 것입니다.
가치가있는 것은 Lua를 사용하고 있지만 의사 코드는 높이 평가할 것입니다.
업데이트 : 참고로 Ciamej의 탁월한 답변을 기반으로 한 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)
의 인덱스 와 값 을 1에서 #tbl까지 반복 하는 내장 함수 가 있습니다. 그래서 합계 계산을 위해, 당신은 이것을 할 수 있습니다. 대부분의 사람들은 더 깨끗해 보입니다 :for _, p in ipairs(points) do pointsSum.x = pointsSum.x + p.x; pointsSum.y = pointsSum.y + p.y end
ipairs
는 숫자 for 루프보다 상당히 느립니다.