/* 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

    Source: geocities.com/g_fyffe/lw

               ( geocities.com/g_fyffe)