• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[Misc] Tile length, its coordinates and center

Wrda

Spell Reviewer
Level 25
Joined
Nov 18, 2012
Messages
1,870
Why is this relevant?
One day I figured I needed a way to know the center of a tile, given an axis coordinate. Such thing isn't available to us directly so I did it myself. Also this is important for our common knowledge that sometimes we take for granted.

Assumptions
Our intuition would say that the length of a tile is exactly 128.00, and that given the tile of the center of the map, which is at 0, 0, would have the edges as 64.00, 64.00, -64.00, -64.00 (up, right, down, left edges respectively).
Upon having a loop to check each edge, this assumption was just wrong. Edges are 63.499, 63.499, -64.500, -64.500 (same order as above), length is 127.999 instead.

Researched method
I delved into a basic method to find out the edges of a tile by alternating between 2 different tile types, and with a loop, which increases an axis point (variable r in test map).

Figuring out the logic
My first attempt was pretty wack, quite inacurate, still useful in certain situations. The second is fully accurate, although it appears to be somewhat slower? Not very significative I hope.
JASS:
function GetTileCenter takes real x returns real
    local real abs = RAbsBJ(x)
    local real mod = ModuloReal(abs, 128.00)
    local real multiples = R2I(abs/128)
    if mod >= 63.500 and x > 0 then
        return (128*(multiples + 1))*RSignBJ(x)
    elseif mod >= 64.501 and x < 0 then
        return (128*(multiples + 1))*RSignBJ(x)
    elseif mod == 0 and multiples >= 1 then
        return (128*(multiples))*RSignBJ(x)
    endif
    return (abs - mod)*RSignBJ(x)
endfunction
JASS:
function GetTileCenterEx takes real x returns real
    local real result = RAbsBJ(x)
    if x < 0 then
        return (result - ModuloReal(result, 128.00))*-1
    endif
    return result - ModuloReal(result, 128.00)
endfunction
For lua:
Lua:
--INACCURATE
---@param x number
---@return number
function GetTileCenterEx(x)
    local result = math.abs(x)
    if x < 0 then
        return (result - math.fmod(result, 128.00))*-1
    end
    return result - math.fmod(result, 128.00)
end

--FULLY ACCURATE
---@param x number
---@return number
function GetTileCenter(x)
    local abs = math.abs(x)
    local mod = math.fmod(abs, 128.00)
    local multiples = math.floor(abs/128)
    local sign = 1
    if x < 0 then
        sign = -1
    end
    if mod >= 63.500 and x > 0 then
        return (128*(multiples + 1))*sign
    elseif mod >= 64.501 and x < 0 then
        return (128*(multiples + 1))*sign
    elseif mod == 0 and multiples >= 1 then
        return (128*(multiples))*sign
    end
    return (abs - mod)*sign
end

You can test it on the test map, just to see that I'm not going crazy..., yet.
 

Attachments

  • Test tiles correctly.w3m
    21.5 KB · Views: 21
Last edited:
^ function GetTileCenterCoordinate is supposed to do the same.
Yeh, you're right with length. Edge coordinate precisely is the minimum x/y of one tile, but actually wouldn't belong as maximum of prior tile.
 
Last edited:

Wrda

Spell Reviewer
Level 25
Joined
Nov 18, 2012
Messages
1,870
I had seen this snippet before, but didn't really paid full attention to it :p
It does work nicely, with a margin of error of 0.501 on max edge, and 0.5 on min edge. Not sure it if it is a big deal.
Anyway, I still think this should be useful for people to be aware how annoying blizzard can be about these details.
 

Wrda

Spell Reviewer
Level 25
Joined
Nov 18, 2012
Messages
1,870
I am hesitant to approve this as it's not really a tutorial but rather a "useful tip"
Yes, definetely not a tutorial, but I didn't find any other appropriate place to post this useful tip or a slight knowledge about something.
Also either I am blind or the first function and the accurate function are identical.
They were, because I'm stupid :p fixed.
 
Top