>

그래서 나는지도를 그리는 동안 각 타일의 위치를 ​​계산하기 위해 첫 번째 부분 (알고리즘)을 작성했습니다 (아래 참조). 그러나 마우스 위치를 적절한 셀로 변환 할 수 있어야하며 마우스 위치에서 셀을 가져 오는 방법을 알 수 없기 때문에 머리카락을 거의 떼어 냈습니다. 저의 관심사는 매우 높은 수학이나 무언가 알아 채지 못하는 것입니다.
예를 들어 마우스 위치가112;35인 경우 셀이 해당 위치에서2;3이되도록하려면 어떻게 계산/변환해야합니까? 어쩌면 여기에 나를 도울 수있는 정말 좋은 수학 사고 프로그래머가 있거나 그것을하는 방법을 알고 있거나 정보를 줄 수있는 누군가가 있습니까?

var cord:Point = new Point();
cord.x = (x - 1) * 28 + (y - 1) * 28;
cord.y = (y - 1) * 14 + (x - 1) * (- 14);

지도에 대해 말하면, 각 셀 (투명 타일56x28픽셀)은 이전 셀의 중심 (또는 셀 1;1의 경우 0 위치)에 배치되며 위의 코드는 셀에서 위치로 변환하는 데 사용합니다. 셀당 위치에 대해 많은 것들과 계산을 시도했지만 각각 실패했습니다.

수정 : 많은 정보를 읽은 후에외형 색상 맵 (색상이 타일에 매핑되는 위치)을 사용하는 것이 가장 빠르고 효율적인 솔루션입니까?

  • 답변 # 1

    (1) x` = 28x -28 + 28y -28  = 28x + 28y -56
    (2) y` = -14x +14 +14y -14 = -14x + 14y
    
    

    변환 표 :

    [x] [28  28 -56 ] = [x`]
    [y] [-14 14  0  ]   [y`]
    [1] [0    0  1  ]   [1 ]
    [28  28 -56 ] ^ -1 
    [-14 14  0  ]
    [0    0  1  ]
    
    

    플로터로 계산 (wims)

    [1/56 -1/28  1 ]
    [1/56  1/28  1 ]
    [0      0    1 ]
    x = 1/56*x` - 1/28y` + 1
    y = 1/56*x` + 1/28y` + 1
    
    

  • 답변 # 2

    이 게시물은 오래된 게시물이라는 것을 알고 있지만 오늘 초와 같이 일부 사람들이이 문제에 대한 답변을 찾을 수 있으므로 업데이트하고 싶습니다. 그러나 나는 이것을 스스로 알아 냈습니다. 타일 ​​겹침 문제가 발생하지 않도록 렌더링하는 훨씬 더 좋은 방법도 있습니다.

    코드는 다음과 같이 간단합니다 :

    mouse_grid_x = floor((mouse_y / tile_height) + (mouse_x / tile_width));
    mouse_grid_y = floor((-mouse_x / tile_width) + (mouse_y / tile_height));
    
    

    mouse_x  그리고 mouse_y  마우스 화면 좌표입니다.

    tile_height  그리고 tile_width  이미지 자체가 아닌 실제 타일 크기입니다. 내 예제 사진에서 알 수 있듯이 타일 아래에 먼지를 추가했습니다. 렌더링하기 쉽고 실제 크기는 24 x 12입니다. 결과 그리드 x와 y를 반올림하기 위해 좌표도 "바닥"입니다.

    또한이 타일을 y = 0 및 x = tile_with/2 (빨간색 점)로 렌더링합니다. 이것은 내 0,0이 실제로 타일의 상단 모서리 (기울기)에서 시작하고 야외에서 나오지 않음을 의미합니다. 이 타일을 회전 정사각형으로보고 여전히 0,0 픽셀부터 시작하려고합니다.

    타일은지도 크기에 Y = 0 및 X = 0으로 시작하여 렌더링됩니다. 첫 번째 행이 렌더링 된 후 몇 픽셀 아래로 왼쪽으로 건너 뜁니다. 이렇게하면 다음 줄의 타일이 첫 번째 줄과 겹치게되므로 레이어가 겹치지 않게 유지할 수 있습니다. 다음 타일로 넘어 가기 전에 타일을 렌더링 한 다음 타일에있는 모든 것을 렌더링해야합니다.

    렌더링 예제도 추가하겠습니다 :

    for (yy = 0; yy < map_height; yy++)
    {
         for (xx = 0; xx < map_width; xx++)
         {
              draw tiles here with tile coordinates:
              tile_x = (xx * 12) - (yy * 12) - (tile_width / 2)
              tile_y = (yy * 6) + (xx * 6)
              also draw whatever is on this tile here before moving on
         }
    }
    
    

  • 답변 # 3

    위와 같이 타일을 렌더링했습니다.

    용액은 매우 간단합니다!

    먼저 :

    내 타일 너비와 높이는 둘 다 =32 이것은 아이소 메트릭 뷰에서 너비 = 32 및 높이 = 16! 이 경우 Mapheight는 5 (최대 Y 값)입니다

    y_mouse = MapHeight/tilewidth/2 및 x_mouse = 0 인 경우

    y_iso&x_iso == 0

    x_mouse + = 1 일 때 y_iso-= 1

    먼저"픽셀 당 변환"

    을 계산합니다.

    타일 Y = ((y_mouse * 2)-((MapHeight * tilewidth)/2) + x_mouse)/2;

    TileX = x_mouse-TileY;

    타일 좌표로 타일 좌표를 찾으려면

    타일 Y = TileY/32; TileX = TileX/32;

    완료! 전혀 문제가 없었습니다!

  • 답변 # 4

    이 사이트 http://www.tonypa.pri.ee/tbw/tut18.html에서 알고리즘을 찾았습니다. 제대로 작동하지는 못했지만 시행 착오를 통해이 양식으로 변경하여 지금 작동합니다.

    int x = mouse.x + offset.x - tile[0;0].x; //tile[0;0].x is the value of x form witch map was drawn
    int y = mouse.y + offset.y;
    double _x =((2 * y + x) / 2);
    double _y= ((2 * y - x) / 2);
    double tileX = Math.round(_x / (tile.height - 1)) - 1;
    double tileY = Math.round(_y / (tile.height - 1));
    
    

    이것은 내지도 생성입니다

    for(int x=0;x<max_X;x++)
    for(int y=0;y<max_Y;y++)
    map.drawImage(image, ((max_X - 1) * tile.width / 2) - ((tile.width - 1) / 2 * (y - x)), ((tile.height - 1) / 2) * (y + x));
    
    

  • 답변 # 5

    한 가지 방법은 다시 사각형 투영으로 회전시키는 것입니다 :

    먼저 치수가 원점을 기준으로 y를 번역합니다.

    x0 = x_mouse;
     y0 = y_mouse-14
    
    

    그런 다음 타일 크기를 기준으로 스케일 조정 :

    x1 = x/28;   //or maybe 56?
     y1 = y/28
    
    

    그러면 투사 각도로 회전합니다

    a = atan(2/1);   
     x_tile = x1 * cos(a) - y1 * sin(a);
     y_tile = y1 * cos(a) + x1 * sin(a);
    
    

    빼기 부호가 없을 수도 있지만, 이것이 일반적인 생각입니다.

  • 이전 distribution - Linux 전용 소프트웨어 패키징
  • 다음 zsh 프롬프트에서 지속적으로 업데이트되는 시계?