26 lines
644 B
Go
26 lines
644 B
Go
|
|
// Package coord 坐标工具:floorDiv 与区块坐标换算(设计.md §4.1)。
|
|||
|
|
// 关键:世界坐标转区块坐标必须使用 floorDiv,正确处理负数。
|
|||
|
|
package coord
|
|||
|
|
|
|||
|
|
// FloorDiv 向下取整除法(负安全)。
|
|||
|
|
func FloorDiv(a, b int32) int32 {
|
|||
|
|
q := a / b
|
|||
|
|
r := a % b
|
|||
|
|
if r < 0 {
|
|||
|
|
q--
|
|||
|
|
}
|
|||
|
|
return q
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ChunkCoord 世界坐标 → 区块坐标(区块大小 16)。
|
|||
|
|
func ChunkCoord(worldX int32) int32 { return FloorDiv(worldX, 16) }
|
|||
|
|
|
|||
|
|
// LocalCoord 世界坐标 → 区块内局部坐标(0..15)。
|
|||
|
|
func LocalCoord(worldX int32) int32 {
|
|||
|
|
l := worldX - ChunkCoord(worldX)*16
|
|||
|
|
if l < 0 {
|
|||
|
|
l += 16
|
|||
|
|
}
|
|||
|
|
return l
|
|||
|
|
}
|