Commit f693c11c6f6e8bc327b520c31bae46f384903c17
1 parent
d1b47d4a
Implement color autoscaling, improvements to imaging process, change output type from GIF to WebP
Showing
4 changed files
with
52 additions
and
27 deletions
Show diff stats
.gitignore
structure.py
1 | 1 | from operator import itemgetter as ig |
2 | -from math import floor, sqrt, ceil, exp | |
2 | +from math import floor, sqrt, ceil | |
3 | 3 | from numpy import arange |
4 | 4 | class RSSVector(): |
5 | 5 | distances = [] |
... | ... | @@ -269,7 +269,7 @@ def resolve_barycenter(nC, d): |
269 | 269 | + 1 / (1+d[3]/d[1]+d[3]/d[2]+d[3]/d[0])*nC[3].location |
270 | 270 | |
271 | 271 | |
272 | -def NLateration(data, step=.1, xSize=0.0, ySize=0.0, zSize=0.0): | |
272 | +def NLateration(data, step=.1, xSize=0.0, ySize=0.0, zSize=0.0, md=.0, dmax=10): | |
273 | 273 | ''' |
274 | 274 | Returns a tuple containing (Computed Location, Total distance) |
275 | 275 | :param data: Array of tuples containing (Location, distance) of known emitters |
... | ... | @@ -281,8 +281,8 @@ def NLateration(data, step=.1, xSize=0.0, ySize=0.0, zSize=0.0): |
281 | 281 | ''' |
282 | 282 | minLoc = Location() |
283 | 283 | minDist = 0.0 |
284 | + maxDist= .0 | |
284 | 285 | revStep = ceil(1/step) |
285 | - #gifArray = [] | |
286 | 286 | for k in data: |
287 | 287 | minDist += abs(k[0].distanceTo(Location()) - k[1]) |
288 | 288 | xSize = k[0].x if k[0].x > xSize else xSize |
... | ... | @@ -298,6 +298,17 @@ def NLateration(data, step=.1, xSize=0.0, ySize=0.0, zSize=0.0): |
298 | 298 | if d < minDist: |
299 | 299 | minDist = d |
300 | 300 | minLoc = Location(round(k,2),round(l,2),round(m,2)) |
301 | - d = (max(1-d/10.0, 0))**2 | |
302 | - imageArray[floor(m*revStep)].append((265-floor(d*360), 255, floor(50+d*200))) | |
303 | - return (minLoc, minDist, imageArray[0], floor(xSize*revStep), floor(ySize*revStep), imageArray) | |
301 | + if d > maxDist: | |
302 | + maxDist = d | |
303 | + | |
304 | + pd=d | |
305 | + d = (max(1-d/dmax, 0)) | |
306 | + | |
307 | + if pd > md: | |
308 | + imageArray[floor(m*revStep)].append((260-floor(360-d*360), 200, floor(50+d*200))) | |
309 | + else: #mark the computed location with a while pixel | |
310 | + imageArray[floor(m*revStep)].append((100, 0, 255)) | |
311 | + #print(minDist,pd) | |
312 | + | |
313 | + | |
314 | + return (minLoc, minDist, imageArray[0], floor(xSize*revStep), floor(ySize*revStep), imageArray, maxDist) | ... | ... |
test_visuals.py
visuals.py
1 | 1 | from structure import NLateration, Location |
2 | -from math import floor, sqrt | |
2 | +from math import floor | |
3 | 3 | from PIL import Image, ImageDraw |
4 | 4 | |
5 | -global_step=.1 | |
6 | -dataset = [(Location(.5,.5,.5), 3.0), (Location(4.0,.0,.0), 2.0), (Location(4.0,5.0,5.0), 4.2)] | |
7 | -NLat_result = NLateration(dataset, step=global_step) | |
8 | -W,H = NLat_result[3], NLat_result[4] | |
5 | +global_step=.2 | |
6 | +upscale_factor=10 | |
7 | +upscale_method = Image.BILINEAR | |
8 | +dataset = [(Location(.5,.5,0), 3.0), (Location(5.0,7.0,.0), 2.0), (Location(8.0,.0,10.0), 8), (Location(5.0,3.0,9), 4)] | |
9 | +colorRange=1.0 # [0.0, 1.0] | |
10 | +#NLat_result = NLateration(dataset, step=global_step) | |
11 | + | |
9 | 12 | frames = [] |
10 | -dummy = [0 for _ in range(len(NLat_result[5][0]))] | |
13 | +max = NLateration(dataset, step=global_step) | |
11 | 14 | |
12 | -def createFrame(x,y,nbr): | |
15 | +def createFrame(x,y,arr,nbr): | |
13 | 16 | img = Image.new("HSV",(y,x)) |
14 | - img.putdata(NLat_result[5][nbr]) | |
17 | + img.putdata(arr[nbr]) | |
15 | 18 | return img |
16 | 19 | |
17 | 20 | |
18 | -def exportGif(): | |
21 | +def exportGif(includeReverse=False): | |
22 | + print("Calculating Array") | |
23 | + NLat_result = NLateration(dataset, step=global_step, md=max[1], dmax=max[6]*colorRange) | |
24 | + W,H = NLat_result[3], NLat_result[4] | |
25 | + print("Generating gif/video") | |
26 | + | |
19 | 27 | for i in range(len(NLat_result[5])): |
20 | - newFrame = createFrame(W,H,i) | |
21 | - newFrame = newFrame.resize((W*10,H*10), Image.BICUBIC) | |
28 | + print(".", end="") | |
29 | + newFrame = createFrame(W,H,NLat_result[5],i) | |
30 | + newFrame = newFrame.resize((W*upscale_factor,H*upscale_factor), upscale_method) | |
22 | 31 | draw = ImageDraw.Draw(newFrame) |
23 | 32 | draw.text(text="z="+str(round(i*global_step,2)), xy=(0,0)) |
24 | 33 | frames.append(newFrame) |
25 | 34 | |
26 | - for i in range(len(NLat_result[5])): | |
27 | - newFrame = createFrame(W,H,len(NLat_result[5])-i-1) | |
28 | - newFrame = newFrame.resize((W*10,H*10), Image.ANTIALIAS) | |
29 | - draw = ImageDraw.Draw(newFrame) | |
30 | - draw.text(text="z="+str(round(((len(NLat_result[5])-i-1)*global_step),2)), xy=(0,0)) | |
31 | - frames.append(newFrame) | |
32 | - | |
33 | - frames[0].save("out.gif", format="GIF", append_images=frames[1:], save_all=True, duration=20, loop=0) | |
35 | + if includeReverse: | |
36 | + for i in range(len(NLat_result[5])): | |
37 | + print(".", end="") | |
38 | + newFrame = createFrame(W,H,NLat_result[5],len(NLat_result[5])-i-1) | |
39 | + newFrame = newFrame.resize((W*upscale_factor,H*upscale_factor), upscale_method) | |
40 | + draw = ImageDraw.Draw(newFrame) | |
41 | + draw.text(text="z="+str(round(((len(NLat_result[5])-i-1)*global_step),2)), xy=(0,0)) | |
42 | + frames.append(newFrame) | |
43 | + | |
44 | + print("\r\nsaving gif/video") | |
45 | + #frames[0].save("out.gif", format="GIF", append_images=frames[1:], save_all=True, duration=20, loop=0) | |
46 | + frames[0].save("out.webp", format="WebP", append_images=frames[1:], save_all=True, duration=40, lossless=True) | |
34 | 47 | print("gif exported") |
35 | 48 | |
36 | -exportGif() | |
37 | 49 | \ No newline at end of file |
50 | +exportGif(True) | |
38 | 51 | \ No newline at end of file | ... | ... |