60 lines
1.5 KiB
Awk
60 lines
1.5 KiB
Awk
# syntax: GAWK -f DRAW_A_SPHERE.AWK
|
|
# converted from VBSCRIPT
|
|
BEGIN {
|
|
draw_sphere(20,4,0.1)
|
|
draw_sphere(10,2,0.4)
|
|
exit(0)
|
|
}
|
|
function draw_sphere(radius,k,ambient, b,i,intensity,j,leng_shades,light,line,shades,vec,x,y) {
|
|
leng_shades = split0(".:!*oe&#%@",shades,"")
|
|
split("30,30,-50",light,",")
|
|
normalize(light)
|
|
for (i=int(-radius); i<=ceil(radius); i++) {
|
|
x = i + 0.5
|
|
line = ""
|
|
for (j=int(-2*radius); j<=ceil(2*radius); j++) {
|
|
y = j / 2 + 0.5
|
|
if (x*x + y*y <= radius*radius) {
|
|
vec[1] = x
|
|
vec[2] = y
|
|
vec[3] = sqrt(radius*radius - x*x - y*y)
|
|
normalize(vec)
|
|
b = dot(light,vec) ^ k + ambient
|
|
intensity = int((1-b) * leng_shades)
|
|
if (intensity < 0) {
|
|
intensity = 0
|
|
}
|
|
if (intensity >= leng_shades) {
|
|
intensity = leng_shades
|
|
}
|
|
line = line shades[intensity]
|
|
}
|
|
else {
|
|
line = line " "
|
|
}
|
|
}
|
|
printf("%s\n",line)
|
|
}
|
|
}
|
|
function ceil(x, tmp) {
|
|
tmp = int(x)
|
|
return (tmp != x) ? tmp+1 : tmp
|
|
}
|
|
function dot(x,y, tmp) {
|
|
tmp = x[1]*y[1] + x[2]*y[2] + x[3]*y[3]
|
|
return (tmp < 0) ? -tmp : 0
|
|
}
|
|
function normalize(v, tmp) {
|
|
tmp = sqrt(v[1]*v[1] + v[2]*v[2] + v[3]*v[3])
|
|
v[1] /= tmp
|
|
v[2] /= tmp
|
|
v[3] /= tmp
|
|
}
|
|
function split0(str,array,fs, arr,i,n) { # same as split except indices start at zero
|
|
n = split(str,arr,fs)
|
|
for (i=1; i<=n; i++) {
|
|
array[i-1] = arr[i]
|
|
}
|
|
return(n)
|
|
}
|