/* CMD: Polygon Normal
*/
/* by GLYPH */
call addlib("LWModelerARexx.port",0)
call addlib("rexxmathlib.library",0,-30,0)
call addlib("rexxsupport.library",0,-30,0)
n = xfrm_begin()
do i=1 to n
tmp = xfrm_getpos(i)
parse var tmp x.i y.i z.i
end i
call xfrm_end()
if (n < 3) then return
cx = 0;cy=0;cz=0
do i=1 to n
cx = cx + x.i; cy = cy + y.i; cz = cz + z.i
end
cx = cx/n; cy = cy/n; cz = cz/n
avrad = 0
do i=1 to n
rad = (cx-x.i)**2+(cy-y.i)**2+(cz-z.i)**2
avrad = avrad + rad
end
avrad = sqrt(avrad/n)
ax = x.2-x.1;ay = y.2-y.1;az = z.2-z.1
bx = x.3-x.1;by = y.3-y.1;bz = z.3-z.1
nx = ay*bz-az*by; ny = az*bx-ax*bz; nz = ax*by-ay*bx
nrad = sqrt(nx**2+ny**2+nz**2)
if nrad ~= 0 then do
nx = nx/nrad*avrad; ny = ny/nrad*avrad; nz = nz/nrad*avrad
end
call add_begin()
p.1 = add_point(cx+nx cy+ny cz+nz)
p.2 = add_point(cx cy cz)
p.3 = add_point(cx-nx cy-ny cz-nz)
call add_polygon(p.1 p.2)
call add_polygon(p.2 p.3)
call add_end()
return
               (
geocities.com/g_fyffe)