Angenommen, ich verwende ein Kachel-basiertes System mit 16x16 Pixeln. Wie würden Sie herausfinden, welche Kacheln von einem Rechteck bedeckt sind, das durch Gleitkomma-Pixeleinheiten definiert ist?Ermitteln der Koordinaten von Kacheln, die von einem Rechteck mit x-, y-, w- und h-Pixelkoordinaten abgedeckt werden
für zB
rect(x=16.0,y=16.0, w=1.0, h=1.0) -> tile(x=1, y=1, w=1, h=1)
rect(x=16.0,y=16.0, w=16.0, h=16.0) -> tile(x=1, y=1, w=1, h=1) (still within same tile)
rect(x=24.0,y=24.0, w=8.0, y=8.0) -> (x=1,y=1,w=1,h=1) (still within same tile)
rect(x=24.0,y=24.0, w=8.1, y=8.1) -> (x=1,y=1,w=2,h=2)
Die einzige Art, wie ich dies sicher tun kann, ist durch eine Schleife verwenden. Gibt es einen besseren Weg? Die Division durch 16 gibt mir die falsche Antwort auf Randfälle. Hier einige Beispiel-Code ich in Python verwenden:
#!/usr/bin/env python
import math
TILE_W = 16
TILE_H = 16
def get_tile(x,y,w,h):
t_x = int(x/TILE_W)
t_x2 = t_x
while t_x2*TILE_W < (x+w):
t_x2 += 1
t_w = t_x2-t_x
t_y = int(y/TILE_H)
t_y2 = t_y
while t_y2*TILE_H < (y+h):
t_y2 += 1
t_h = t_y2-t_y
return t_x,t_y,t_w,t_h
(x,y) = 16.0,16.0
(w,h) = 1.0, 1.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0,16.0
(w,h) = 15.0, 15.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0,16.0
(w,h) = 16.0, 16.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 16.0,16.0
(w,h) = 16.1, 16.1
assert get_tile(x,y,w,h) == (1,1,2,2)
(x,y) = 24.0, 24.0
(w,h) = 1.0, 1.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 24.0, 24.0
(w,h) = 8.0, 8.0
assert get_tile(x,y,w,h) == (1,1,1,1)
(x,y) = 24.0, 24.0
(w,h) = 8.1, 8.1
assert get_tile(x,y,w,h) == (1,1,2,2)
(x,y) = 24.0, 24.0
(w,h) = 9.0, 9.0
assert get_tile(x,y,w,h) == (1,1,2,2)
Dieser auf dem folgenden Fall in der Frage angegeben ausfällt: (x, y) = 16.0,16.0 (w, h) = 16,1, 16.1 – Mathieu
siehe den bearbeiteten Code –
Ist die Ceil/Floor-Lösung nicht eleganter für die gleichen Ergebnisse? Das ist die Lösung, die ich in der Vergangenheit immer benutzt habe. – Mathieu