Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- """variables"""
- MAX_DISTANCE = 5.0
- PRECISION = 0.01
- results = [] #list of (int,int,float) ordered by delta
- """insert in results"""
- def insert(L, px, pz, delta):
- i=len(L)
- L.append((px,pz,delta))
- while i>0 and L[i-1][2] > delta:
- L[i-1],L[i] = L[i],L[i-1] #swap
- i = i-1
- """calculations - efficient algorithm
- Visually, this algorithm plots all points of integer coordinates within a circular ring"""
- inf = MAX_DISTANCE-PRECISION
- sup = MAX_DISTANCE
- step_inf = math.ceil(16*(math.sqrt(inf*inf/2)+0.6))
- step_sup = math.floor(16*(math.sqrt(sup*sup/2)+0.6))
- #linear setups (px=0)
- min_range_0 = math.ceil(16*(inf + 0.6))
- max_range_0 = math.floor(16*(sup + 0.6))
- for px in range(min_range_0, max_range_0+1):
- x = (px/16)-0.6
- delta = MAX_DISTANCE-x
- insert(results,px,0,delta)
- #px between minimum (10pixels) and step_inf-1.
- for px in range(10, step_inf):
- x = (px/16)-0.6
- min_range = math.ceil(16*(math.sqrt(max(inf*inf - x*x,0.0))+0.6))
- max_range = math.floor(16*(math.sqrt(max(sup*sup - x*x,0.0))+0.6))
- for pz in range(min_range, max_range+1):
- z = (pz/16)-0.6
- distance = math.sqrt(x*x + z*z)
- delta = MAX_DISTANCE-distance
- insert(results,pz,px,delta)
- #px between step_inf and step_sup. extra precaution is taken in case px>pz. otherwise identical to above code
- for px in range(step_inf, step_sup + 1):
- x = (px/16)-0.6
- min_range = math.ceil(16*(math.sqrt(max(inf*inf - x*x,0.0))+0.6))
- max_range = math.floor(16*(math.sqrt(max(sup*sup - x*x,0.0))+0.6))
- for pz in range(min_range, max_range+1):
- if px>pz: continue
- z = (pz/16)-0.6
- distance = math.sqrt(x*x + z*z)
- delta = MAX_DISTANCE-distance
- insert(results,pz,px,delta)
- """results display"""
- for X,Z,DELTA in results:
- print("X: %3d \t Z: %3d \t delta: %.6f" % (X,Z,DELTA))
- """alternative display, showing distance instead of delta"""
- #for X,Z,DELTA in results[::-1]:
- # print("X: %3d \t Z: %3d \t distance: %.6f" % (X,Z,MAX_DISTANCE-DELTA))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement