에 도움을 내가 해결하기 위해 노력하고있어 문제는 다음입니다 필요 "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 일 때.
또한 오른쪽 및 아래쪽에만 적용됩니다. 왼쪽과 위는 내가 원하는대로 작동합니다. 예를 들어, 이 왼쪽 좌표가있는 사각형은 첫 번째가 아니라 "오른쪽의 두 번째 셀"에 표시되어야합니다.
나는 솔루션이 복잡하지 않다고 확신하지만, 잠시 동안 이것에 대해 생각 해왔다. 나는 그것을 찾지 못했다. 어떤 도움을 주시면 감사하겠습니다.
왜이 질문에 4 가지 언어 태그가 있습니까? –
@ NicolBolas - "모든 프로그래밍 언어로 솔루션을 수용 할 것입니다" – kikito
맞지요. 왜 그런 언어가 * 3 * 다른 언어로만 호출되었는지 설명하지 못합니다. 우리는 "모든 언어"문제에 대한 태그를 가지고 있습니다. 그것은 언어 불가지론 자라고 불립니다. –