68 lines
1.4 KiB
Python
68 lines
1.4 KiB
Python
|
#!/usr/bin/python
|
||
|
|
||
|
import sys
|
||
|
import math
|
||
|
|
||
|
def sharpen(x):
|
||
|
alpha = 1
|
||
|
y = abs(2*x-1)**alpha # between 0 and 1
|
||
|
if x > 0.499 and x < 0.501:
|
||
|
return 0.5
|
||
|
elif x > 0.5:
|
||
|
return (y+1)/2
|
||
|
else:
|
||
|
return (1-y)/2
|
||
|
|
||
|
f = open(sys.argv[1])
|
||
|
lines = [x.split() for x in f]
|
||
|
f.close()
|
||
|
|
||
|
res1 = int(sys.argv[2]) # 400 pixel per unit
|
||
|
res2 = int(sys.argv[3]) # 50 pixel in picture (acutally one quadrant)
|
||
|
|
||
|
data = {(round(float(l[0])*res1), round(float(l[1])*res1)) : float(l[5]) for l in lines}
|
||
|
data[(0,0)] = 2.0
|
||
|
|
||
|
print("P3")
|
||
|
print("1000 1000")
|
||
|
print("255")
|
||
|
|
||
|
for i in range (-500,500):
|
||
|
for j in range(-500,500):
|
||
|
x = j/500*res2
|
||
|
y = i/500*res2
|
||
|
|
||
|
if y < 0:
|
||
|
y = -y
|
||
|
|
||
|
x0 = math.floor(x)
|
||
|
y0 = math.floor(y)
|
||
|
x1 = math.ceil(x)
|
||
|
y1 = math.ceil(y)
|
||
|
tx = sharpen(x-x0)
|
||
|
ty = sharpen(y-y0)
|
||
|
|
||
|
if not (x0,y0) in data or not (x0,y1) in data or not (x1,y0) in data or not (x1,y1) in data:
|
||
|
value = 0
|
||
|
else:
|
||
|
value = 0.0
|
||
|
value += data[(x0,y0)]*(1-tx)*(1-ty)
|
||
|
value += data[(x0,y1)]*(1-tx)*ty
|
||
|
value += data[(x1,y0)]*tx*(1-ty)
|
||
|
value += data[(x1,y1)]*tx*ty
|
||
|
value -= 1
|
||
|
|
||
|
value = 0 if value < 0 else 1 if value > 1 else value
|
||
|
|
||
|
r = round(255*math.sqrt(value))
|
||
|
g = round(255*(value)**3)
|
||
|
b = round(255*math.sin(2*math.pi*(value)))
|
||
|
|
||
|
r = 0 if r < 0 else 255 if r > 255 else r
|
||
|
g = 0 if g < 0 else 255 if g > 255 else g
|
||
|
b = 0 if b < 0 else 255 if b > 255 else b
|
||
|
|
||
|
print("%d %d %d" % (r,g,b))
|
||
|
|
||
|
#print(data)
|