00001 00002 c 00003 c Copyright (c) 1986,1987,1988,1989,1990,1991,1992,1993, 00004 c by Steve McMillan, Drexel University, Philadelphia, PA. 00005 c 00006 c All rights reserved. 00007 c 00008 c Redistribution and use in source and binary forms are permitted 00009 c provided that the above copyright notice and this paragraph are 00010 c duplicated in all such forms and that any documentation, 00011 c advertising materials, and other materials related to such 00012 c distribution and use acknowledge that the software was developed 00013 c by the author named above. 00014 c 00015 c THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 00016 c IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 00017 c WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00018 c 00019 00020 subroutine plotin(rcall,scall,ipen) 00021 save 00022 c 00023 c Move pen from the last point to a new point, drawing only that 00024 c segment of the line lying within the "eframe" boundaries. 00025 c 00026 common /scales/ x1,x2,dix,y1,y2,diy,rlen,slen 00027 common /fr sord/ idash 00028 common /last point/ rl,sl 00029 c 00030 c Note: a "plotin" session should start with a "plotin(.,.,3)" 00031 c call (to initialize il, etc.), not with "plot(.,.,3)" 00032 c 00033 integer MOVE, DRAW 00034 parameter (MOVE = 3, DRAW = 2) 00035 c 00036 save il,jl,kl,inl 00037 c 00038 c----------------------------------------------------------------------------- 00039 c 00040 c Alternate entry points: 00041 c ---------------------- 00042 c 00043 idash = 0 00044 r = rcall 00045 s = scall 00046 go to 1 00047 c 00048 entry uplotin(rcall,scall,ipen) 00049 entry userplotin(rcall,scall,ipen) 00050 idash = 0 00051 call fr inches(rcall,scall,r,s) 00052 go to 1 00053 c 00054 entry dplotin(rcall,scall,ipen) 00055 idash = 1 00056 r = rcall 00057 s = scall 00058 go to 1 00059 c 00060 entry udplotin(rcall,scall,ipen) 00061 entry userdplotin(rcall,scall,ipen) 00062 idash = 1 00063 call fr inches(rcall,scall,r,s) 00064 c 00065 c----------------------------------------------------------------------------- 00066 c 00067 c Locate the ends of the line relative to the current box: 00068 c 00069 c ! ! 00070 c (1,3) --> 7 ! (2,3) --> 8 ! (3,3) --> 9 00071 c ! ! 00072 c - - - - - - - - +---------------+ - - - - - - - - 00073 c | | 00074 c | EFRAME box | 00075 c (1,2) --> 4 | | (3,2) --> 6 00076 c | (2,2) --> 5 | 00077 c | | 00078 c - - - - - - - - +---------------+ - - - - - - - - 00079 c ! ! 00080 c (1,1) --> 1 ! (1,2) --> 2 ! (1,3) --> 3 00081 c ! ! 00082 c 00083 1 in = 0 00084 i = 2 00085 j = 2 00086 if (r.lt.0.) i = 1 00087 if (r.gt.rlen) i = 3 00088 if (s.lt.0.) j = 1 00089 if (s.gt.slen) j = 3 00090 c 00091 k = i + 3*(j-1) 00092 if (k.eq.5) in = 1 00093 if (ipen.eq.MOVE) go to 99 00094 c 00095 if (r.eq.rl.and.s.eq.sl) then 00096 if (in.eq.1) call plot(r,s,DRAW) 00097 go to 99 00098 end if 00099 c 00100 rp = r 00101 sp = s 00102 c 00103 c *** both in *** 00104 c 00105 if (in+inl.eq.2) go to 98 00106 c 00107 c *** both out *** 00108 c 00109 if (in+inl.eq.0) go to 20 00110 c 00111 c *** 1 in, 1 out *** 00112 c 00113 if (in.eq.1) go to 3 00114 c 00115 c Last point in. 00116 c 00117 rin = rl 00118 sin = sl 00119 2 rout = r 00120 sout = s 00121 iout = i 00122 kout = k 00123 go to 5 00124 c 00125 c Current point in. 00126 c 00127 3 rin = r 00128 sin = s 00129 4 rout = rl 00130 sout = sl 00131 iout = il 00132 kout = kl 00133 c 00134 c Move from (rin,sin) to (rout,sout). 00135 c 00136 5 call fr plt(rin,sin,MOVE) 00137 if (kout.eq.2) go to 11 00138 if (kout.eq.8) go to 12 00139 if (kout.eq.6) go to 14 00140 if (kout.eq.4) go to 15 00141 c 00142 c Exit to corner square; find exit side. 00143 c 00144 rp = 0. 00145 if (iout.eq.3) rp = rlen 00146 sp = sin + (rp-rin)*(sout-sin)/(rout-rin) 00147 if (sp.lt.0.) go to 11 00148 if (sp.gt.slen) go to 12 00149 go to 98 00150 c 00151 c Exit side known... 00152 c 00153 c ...through bottom. 00154 c 00155 11 sp = 0. 00156 go to 13 00157 c 00158 c ...through top. 00159 c 00160 12 sp = slen 00161 13 rp = rin + (sp-sin)*(rout-rin)/(sout-sin) 00162 go to 98 00163 c 00164 c ...through right. 00165 c 00166 14 rp = rlen 00167 go to 16 00168 c 00169 c ...through left. 00170 c 00171 15 rp = 0. 00172 16 sp = sin + (rp-rin)*(sout-sin)/(rout-rin) 00173 go to 98 00174 c 00175 c Both points outside -- look for any intersection with the frame. 00176 c 00177 c First dispose of points in same square, or in same outside row or column. 00178 c 00179 20 if (k.eq.kl) go to 99 00180 if (j+jl.eq.2) go to 99 00181 if (j+jl.eq.6) go to 99 00182 if (i+il.eq.2) go to 99 00183 if (i+il.eq.6) go to 99 00184 c 00185 c Is any square on a side of the frame? 00186 c 00187 kout = kl 00188 if (k.eq.2) go to 21 00189 if (k.eq.8) go to 22 00190 if (k.eq.6) go to 24 00191 if (k.eq.4) go to 25 00192 c 00193 kout = k 00194 if (kl.eq.2) go to 21 00195 if (kl.eq.8) go to 22 00196 if (kl.eq.6) go to 24 00197 if (kl.eq.4) go to 25 00198 go to 27 00199 c 00200 c Through bottom. 00201 c 00202 21 sin = 0. 00203 go to 23 00204 c 00205 c Through top. 00206 c 00207 22 sin = slen 00208 23 rin = r + (sin-s)*(rl-r)/(sl-s) 00209 if (rin.le.0.) go to 99 00210 if (rin.ge.rlen) go to 99 00211 if (kout.eq.kl) go to 4 00212 go to 2 00213 c 00214 c Through right side. 00215 c 00216 24 rin = rlen 00217 go to 26 00218 25 rin = 0. 00219 26 sin = s + (rin-r)*(sl-s)/(rl-r) 00220 if (sin.le.0.) go to 99 00221 if (sin.ge.slen) go to 99 00222 if (kout.eq.kl) go to 4 00223 go to 2 00224 c 00225 c Connect diagonally opposite corner squares. 00226 c 00227 27 ip = MOVE 00228 sin = 0. 00229 rin = r + (sin-s)*(rl-r)/(sl-s) 00230 if (rin.le.rlen.and.rin.ge.0.) then 00231 call fr plt(rin,sin,ip) 00232 ip = DRAW 00233 end if 00234 c 00235 sin = slen 00236 rin = r + (sin-s)*(rl-r)/(sl-s) 00237 if (rin.le.rlen.and.rin.ge.0.) then 00238 call fr plt(rin,sin,ip) 00239 if (ip.eq.DRAW) go to 99 00240 ip = DRAW 00241 end if 00242 c 00243 rin = 0. 00244 sin = s + (rin-r)*(sl-s)/(rl-r) 00245 if (sin.le.slen.and.sin.ge.0.) then 00246 call fr plt(rin,sin,ip) 00247 if (ip.eq.DRAW) go to 99 00248 ip = DRAW 00249 end if 00250 c 00251 rin = rlen 00252 sin = s + (rin-r)*(sl-s)/(rl-r) 00253 if (sin.le.slen.and.sin.ge.0.) call fr plt(rin,sin,ip) 00254 go to 99 00255 c 00256 c Plot final segment, then terminate on last point. 00257 c 00258 98 call fr plt(rp,sp,DRAW) 00259 99 call fr plt(r,s,MOVE) 00260 rl = r 00261 sl = s 00262 il = i 00263 jl = j 00264 kl = k 00265 inl = in 00266 c 00267 end