#!/bin/ksh ################################################################# # # OFF2TEK - A script to display OFF 3d data on the # Tektronix 4014 terminal. Designed specially # to bring 3D graphics to SDF users ;-) # # by Maciek Szymanski # # Release M1b - corrected coordinate transformation # formulas. # Release M1a - initial public release. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # ################################################################# # process command line parameters while [ $# -gt 0 ] do case $1 in -s) # -s - scale SCALE=$2 shift shift ;; -x) # -x - x offset XOFFS=$2 shift shift ;; -y) # -y - y offset YOFFS=$2 shift shift ;; -f) # -f - file name FILE=$2 shift shift ;; *) # display usage cat << EOF Usage: $0 [-s scale] [-x x offset] [-y y offset] [-f file name] Displays the off 3D file on the Tektronix 4014 terminal or a compatible emulator (eg. xterm). EOF exit 0 ;; esac done # run awk script to process off data awk -v "SCA=${SCALE:-1}" -v "DX=${XOFFS:-512}" -v "DY=${YOFFS:-383}" \ 'BEGIN { # Parameters and constants PI = 3.1415927; # SCA global scale # DX origin ofset # DY # Projection parameters FiX = 30; FiY = 120; SX = 1; SY = 1; SZ = 0.5; # recalculate angles Alpha = FiX * PI / 180; Beta = (FiY - 90) * PI / 180; # clear terminal clear_tek(); # Process input file getline; if ($0 ~ OFF) getline; # Get data header VERT = $1; FAC = $2; # Read vertices and project to 2D i = 0; while(i < VERT) { getline; vx[i] = (DX + SCA * proj_x($1, $2, $3)); vy[i] = (DY + SCA * proj_y($1, $2, $3)); i++; } # Read and draw faces i = 0; while(i < FAC) { getline; n = $1; # number of points j = 2; x0 = vx[$2]; y0 = vy[$2]; tek_graph(); while (j < n + 1) { send_tek_xy(vx[$j], vy[$j]); j++; } send_tek_xy(x0, y0); i++; } } # send coordinates in tek format function send_tek_xy(x, y, HiY, LoY, HiX, LoX) { HiY = int(y / 32); LoY = int(y - HiY * 32); HiX = int(x / 32); LoX = int(x - HiX * 32); printf("%c%c%c%c", HiY + 32, LoY + 96, HiX + 32, LoX + 64); } # clear tek screen function clear_tek() { printf("\033\014"); } # switch to graphics mode function tek_graph() { printf ("\035"); } # functions to transform coordinates # x,y,z -> 2d X function proj_x(x, y, z) { x = x * SX; y = y * SY; return (x * cos(Alpha) - y * sin(Beta)); } # x,y,z -> 2d Y function proj_y(x, y , z) { x = x * SX; y = y * SY; z = z * SZ; return x * sin(Alpha) + y * cos(Beta) + z; }' $FILE