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