2012-08-13 2 views
2

에 도움을 내가 해결하기 위해 노력하고있어 문제는 다음입니다 필요 "32x32 격자". 모든 그리드는 좌표 (0,0)의 원점을 중심으로 배치됩니다.사각형 나는 가장자리의 경우

사각형은 왼쪽, 위쪽, 너비 및 높이의 4 개의 부동 소수점으로 정의됩니다.

이 작업의 결과는 항상 사각형입니다. 왼쪽 위 셀 (즉, 0,0)의 좌표를 반환하고 retangle이 오른쪽과 아래쪽에있는 셀의 수를 따라야합니다 (셀의 경우 너비와 높이와 비슷하지만 비트 수는

입니다)

So 지금까지 대부분 작동하는 알고리즘을 작성할 수있었습니다. 첫 번째 작업은 격자에서 단일 점이있는 셀 좌표를 계산하는 것입니다. 의 왼쪽 상단과 하단의 권리 코너 그리드에 어디 그런 다음, 사각형 주어, 나는 계산 한 다음 간단한 뺄셈의 :

-- given a world coordinate, return the coordinates of the cell that would contain it 
local function _toGrid(wx, wy) 
    return math.floor(wx/__cellSize), math.floor(wy/__cellSize) 
end 

-- given a box in world coordinates, return a box in grid coordinates that contains it 
-- returns the x,y coordinates of the top-left cell, the number of cells to the right and the number of cells down. 
local function _toGridBox(l, t, w, h) 
    local gl,gt = _toGrid(l, t)  -- top left grid corner 
    local gr,gb = _toGrid(l+w, t+h) -- bottom-right grid corner 
    return gl, gt, gr-gl+1, gb-gt+1 -- return top,left,cells to the right, cells to bottom 
end 

주 :

  • 소스 코드 루아됩니다 그러나 나는 그들이 알 수있는 한 모든 프로그래밍 언어로 솔루션을 수용 할 것이다.
  • y 좌표가 증가 할 때 "내려갑니다"; 그것이 많은 스크린 시스템이 작동하는 방식입니다. 나는 이것이이 문제에 대해 중요하지 않다고 생각하지만 혼란스럽지는 않음).
  • 16 × 16 그리드

, width = 10, 20 = height, gr와 0,0 직사각형, 0과 1 gt 때문에 _toGrid 0,0,1,2 (1 행을 반환 할 것이다 두 개의 열, 0,0 셀에 있음).

사각형이 내부에서 한 셀의 아래쪽 또는 오른쪽을 "건 드리면"(교차하지 않음) 문제가 발생합니다. 이 경우 _toGrid은 내가 원하는 것보다 "하나 이상의 셀"을 반환합니다.

예를 들어 이전 직사각형을 왼쪽 6 픽셀 (10,0에 있음)로 이동하면 포함하는 격자의 왼쪽 경계선이 0에서 16까지 "터치"됩니다 gr은 1이되고 반환 된 데이터는 0,0,2,2가됩니다.

가능하면이 문제를 피하고 싶습니다. 16 "왼쪽에서"가는 직사각형, 나는 첫 번째 표 셀에 남아 싶습니다. 나는 그것이 16을 능가하는 즉시 "다음 셀을 점령하기"를 시작하길 원합니다 - 예를 들어 16.00000001 일 때.

또한 오른쪽 및 아래쪽에만 적용됩니다. 왼쪽과 위는 내가 원하는대로 작동합니다. 예를 들어, 이 왼쪽 좌표가있는 사각형은 첫 번째가 아니라 "오른쪽의 두 번째 셀"에 표시되어야합니다.

나는 솔루션이 복잡하지 않다고 확신하지만, 잠시 동안 이것에 대해 생각 해왔다. 나는 그것을 찾지 못했다. 어떤 도움을 주시면 감사하겠습니다.

+0

왜이 질문에 4 가지 언어 태그가 있습니까? –

+0

@ NicolBolas - "모든 프로그래밍 언어로 솔루션을 수용 할 것입니다" – kikito

+0

맞지요. 왜 그런 언어가 * 3 * 다른 언어로만 호출되었는지 설명하지 못합니다. 우리는 "모든 언어"문제에 대한 태그를 가지고 있습니다. 그것은 언어 불가지론 자라고 불립니다. –

답변

4

하단 및 우측면의 경우 floor 대신 ceil을 사용해야합니다.내가 어떤 루아를 모르는, 그래서 이것은 문법적으로 정확하지 않을 수 있습니다,하지만 당신은이 라인을 따라 뭔가 싶은 :

local function _toGridBox(l, t, w, h) 
    local gl = math.floor(l/_cellSize) 
    local gt = math.floor(t/_cellSize) 
    local gr = math.ceil((l+w)/_cellSize) 
    local gb = math.ceil((t+h)/_cellSize) 
    return gl, gt, gr-gl, gb-gt -- return top,left,cells to the right, cells to bottom 
end 

문제를 본질적 기능 _toGrid 때문에 목적에 맞지 않는 추상화이다 항상 floor을 사용합니다. 분명히, 당신은 그 추상화를 사용하는 것에 자신을 가둬 버렸습니다. 그로 인해 올바른 대답을 내놓기가 어려웠습니다.

+0

안녕하세요. 답변 해 주셔서 감사합니다. 네 말이 맞아, 나는 정신적으로 갇혀 있었다. 귀하의 솔루션을 시도해 보았습니다. (사소한 변경 사항이 있습니다. 귀하의 답변을 조금 편집해도 괜찮습니까?) 매우 잘 작동하는 것 같습니다. 오늘 저녁에 더 많은 테스트를하고, 더 이상 문제가 없다면 대답을 받아 들일 것입니다. – kikito

+0

@kikito 반대로 편집에 관한 문제는 없습니다. 다행히 도왔다! –

+0

내 메인 프로그램에서 시도해 보니 트릭을 수행하는 것으로 보입니다. 다시 한 번 감사드립니다! – kikito

관련 문제