1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
|
SUBROUTINE ISOSRF (T,LU,MU,LV,MV,MW,EYE,MUVWP2,SLAB,TISO,IFLAG)
C
C +-----------------------------------------------------------------+
C | |
C | Copyright (C) 1986 by UCAR |
C | University Corporation for Atmospheric Research |
C | All Rights Reserved |
C | |
C | NCARGRAPHICS Version 1.00 |
C | |
C +-----------------------------------------------------------------+
C
C
C
C
C DIMENSION OF T(LU,LV,MW),EYE(3),SLAB(MUVWP2,MUVWP2)
C ARGUMENTS
C
C LATEST REVISION DECEMBER 1984
C
C PURPOSE ISOSRF DRAWS AN APPROXIMATION OF AN ISO-VALUED
C SURFACE FROM A THREE-DIMENSIONAL ARRAY WITH
C HIDDEN LINES REMOVED.
C
C USAGE IF THE FOLLOWING ASSUMPTIONS ARE MET, USE
C
C CALL EZISOS (T,MU,MV,MW,EYE,SLAB,TISO)
C
C ASSUMPTIONS:
C -- ALL OF THE T ARRAY IS TO BE USED.
C -- IFLAG IS CHOSEN INTERNALLY.
C -- FRAME IS CALLED BY EZISOS.
C
C IF THE ASSUMPTIONS ARE NOT MET, USE
C
C CALL ISOSRF (T,LU,MU,LV,MV,MW,EYE,MUVWP2,
C SLAB,TISO,IFLAG)
C
C ARGUMENTS
C
C ON INPUT T
C THREE DIMENSIONAL ARRAY OF DATA THAT DEFINES
C THE ISO-VALUED SURFACE.
C
C LU
C FIRST DIMENSION OF T IN THE CALLING PROGRAM.
C
C MU
C THE NUMBER OF DATA VALUES OF T TO BE
C PROCESSED IN THE U DIRECTION (THE FIRST
C SUBSCRIPT DIRECTION). WHEN PROCESSING THE
C ENTIRE ARRAY, LU = MU (AND LV = MV).
C
C LV
C SECOND DIMENSION OF T IN THE CALLING PROGRAM.
C
C MV
C THE NUMBER OF DATA VALUES OF T TO BE
C PROCESSED IN THE V DIRECTION (THE SECOND
C SUBSCRIPT DIRECTION).
C
C MV
C THE NUMBER OF DATA VALUES OF T TO BE
C PROCESSED IN THE W DIRECTION (THE THIRD
C SUBSCRIPT DIRECTION).
C
C EYE
C THE POSITION OF THE EYE IN THREE-SPACE. T IS
C CONSIDERED TO BE IN A BOX WITH OPPOSITE
C CORNERS (1,1,1) AND (MU,MV,MW). THE EYE IS
C AT (EYE(1),EYE(2),EYE(3)), WHICH MUST BE
C OUTSIDE THE BOX THAT CONTAINS T. WHILE GAINING
C EXPERIENCE WITH THE ROUTINE, A GOOD CHOICE
C FOR EYE MIGHT BE (5.0*MU,3.5*MV,2.0*MW).
C
C MUVWP2
C THE MAXIMUM OF (MU,MV,MW)+2; THAT IS,
C MUVWP2 = MAX(MU,MV,MW)+2).
C
C SLAB
C A WORK SPACE USED FOR INTERNAL STORAGE. SLAB
C MUST BE AT LEAST MUVWP2*MUVWP2 WORDS LONG.
C
C TISO
C THE ISO-VALUE USED TO DEFINE THE SURFACE. THE
C SURFACE DRAWN WILL SEPARATE VOLUMES OF T THAT
C HAVE VALUES GREATER THAN OR EQUAL TO TISO FROM
C VOLUMES OF T THAT HAVE VALUES LESS THAN TISO.
C
C IFLAG
C THIS FLAG SERVES TWO PURPOSES.
C . FIRST, THE ABSOLUTE VALUE OF IFLAG
C DETERMINES WHICH TYPES OF LINES ARE DRAWN
C TO APPROXIMATE THE SURFACE. THREE TYPES
C OF LINES ARE CONSIDERED: LINES OF
C CONSTANT U, LINES OF CONSTANT V AND LINES
C OF CONSTANT W. THE FOLLOWING TABLE LISTS
C THE TYPES OF LINES DRAWN.
C
C LINES OF CONSTANT
C -----------------
C IABS(IFLAG) U V W
C ----------- --- --- ---
C 1 NO NO YES
C 2 NO YES NO
C 3 NO YES YES
C 4 YES NO NO
C 5 YES NO YES
C 6 YES YES NO
C 0, 7 OR MORE YES YES YES
C
C . SECOND, THE SIGN OF IFLAG DETERMINES WHAT
C IS INSIDE AND WHAT IS OUTSIDE, HENCE,
C WHICH LINES ARE VISIBLE AND WHAT IS DONE
C AT THE BOUNDARY OF T. FOR IFLAG:
C
C POSITIVE T VALUES GREATER THAN TISO ARE
C ASSUMED TO BE INSIDE THE SOLID
C FORMED BY THE DRAWN SURFACE.
C NEGATIVE T VALUES LESS THAN TISO ARE
C ASSUMED TO BE INSIDE THE SOLID
C FORMED BY THE DRAWN SURFACE.
C IF THE ALGORITHM DRAWS A CUBE, REVERSE THE
C SIGN OF IFLAG.
C
C ON OUTPUT T,LU,MU,LV,MV,MW,EYE,MUVWP2,TISO AND IFLAG ARE
C UNCHANGED. SLAB HAS BEEN WRITTEN IN.
C
C NOTE . THIS ROUTINE IS FOR LOWER RESOLUTION ARRAYS
C THAN ISOSRFHR. 40 BY 40 BY 40 IS A
C PRACTICAL MAXIMUM.
C . TRANSFORMATIONS CAN BE ACHIEVED BY
C ADJUSTING SCALING STATEMENT FUNCTIONS IN
C ISOSRF, SET3D AND TR32.
C . THE HIDDEN-LINE ALGORITHM IS NOT EXACT, SO
C VISIBILITY ERRORS CAN OCCUR.
C . THREE-DIMENSIONAL PERSPECTIVE CHARACTER
C LABELING OF ISOSRF IS POSSIBLE BY USING
C THE UTILITY PWRZI. FOR A DESCRIPTION OF
C THE USAGE, SEE THE PWRZI DOCUMENTATION.
C
C ENTRY POINTS ISOSRF, EZISOS, SET3D, TRN32I, ZEROSC,
C STCNTR, DRCNTR, TR32, FRSTS, KURV1S, KURV2S,
C FRSTC, FILLIN, DRAWI, ISOSRB, MMASK
C
C COMMON BLOCKS ISOSR1, ISOSR2, ISOSR3, ISOSR4, ISOSR5,
C ISOSR6, ISOSR7, ISOSR8, ISOSR9, TEMPR,
C PWRZ1I
C
C REQUIRED LIBRARY THE ERPRT77 PACKAGE AND THE SPPS.
C ROUTINES
C
C I/O PLOTS SURFACE
C
C PRECISION SINGLE
C
C LANGUAGE FORTRAN 77
C
C HISTORY DEVELOPED FOR USERS OF ISOSRFHR WITH SMALLER
C ARRAYS.
C
C ALGORITHM CUTS THROUGH THE THREE-DIMENSIONAL ARRAY ARE
C CONTOURED WITH A SMOOTHING CONTOURER WHICH ALSO
C MARKS A MODEL OF THE PLOTTING PLANE. INTERIORS
C OF BOUNDARIES ARE FILLED IN AND THE RESULT IS
C .OR.ED INTO ANOTHER MODEL OF THE PLOTTING PLANE
C WHICH IS USED TO TEST SUBSEQUENT CONTOUR LINES
C FOR VISIBILITY.
C
C TIMING VARIES WIDELY WITH SIZE OF T AND THE VOLUME OF
C THE SPACE ENCLOSED BY THE SURFACE DRAWN.
C
C **NOTE** SPACE REQUIREMENTS CAN BE REDUCED BY
C CHANGING THE SIZE OF THE ARRAYS ISCR, ISCA
C (FOUND IN COMMON ISOSR2), MASK(FOUND IN
C COMMON ISOSR5) AND THE VARIABLE NBPW
C (COMMON ISOSR5).
C ISCR AND ISCA NEED 128X128 BITS. SO ON A
C 64 BIT MACHINE ISCR, ISCA CAN BE
C DIMENSIONED TO (2,128). NBPW SET IN
C SUBROUTINE MMASK SHOULD CONTAIN THE
C NUMBER OF BITS PER WORD YOU WISH TO
C UTILIZE.
C THE DIMENSION OF MASK AND NMASK SHOULD
C EQUAL THE VALUE OF NBPW.
C LS SHOULD BE SET TO THE FIRST DIMENSION
C OF ISCA AND ISCR.
C
C EXAMPLES:
C ON A 60 BIT MACHINE:
C DIMENSION ISCA(4,128), ISCR(4,128)
C DIMENSION MASK(32)
C NBPW = 32
C ON A 64 BIT MACHINE:
C DIMENSION ISCA(2,128), ISCR(2,128)
C DIMENSION MASK(64)
C NBPW = 64
C
C INTERNAL PARAMETERS NAME DEFAULT FUNCTION
C ---- ------- --------
C IREF 1 FLAG TO CONTROL DRAWING OF AXES.
C .IREF=NONZERO DRAW AXES.
C .IREF=ZERO DO NOT DRAW AXES.
C
C
SAVE
DIMENSION T(LU,LV,MW),EYE(3) ,SLAB(MUVWP2,MUVWP2)
C
COMMON /ISOSR1/ ISLBT ,U ,V ,W
COMMON /ISOSR2/ LX ,NX ,NY ,ISCR(8,128),
1 ISCA(8,128)
COMMON /ISOSR3/ ISCALE ,XMIN ,XMAX ,YMIN ,
1 YMAX ,BIGD ,R0
COMMON /ISOSR4/ RX ,RY
COMMON /ISOSR5/ NBPW ,MASK(16) ,GENDON
COMMON /ISOSR6/ IX ,IY ,IDX ,IDY ,
1 IS ,ISS ,NP ,CV ,
2 INX(8) ,INY(8) ,IR(500) ,NR
COMMON /ISOSR7/ IENTRY ,IONES
COMMON /ISOSR9/ BIG ,IXBIT
C
LOGICAL GENDON
DATA IREF/1/
C
AVE(A,B) = (A+B)*.5
C
C A.S.F. FOR SCALING
C
SU(UTEMP) = UTEMP
SV(VTEMP) = VTEMP
SW(WTEMP) = WTEMP
C
C +NOAO - Blockdata ISOSRB rewritten as run time initialization
C EXTERNAL ISOSRB
call isosrb
C -NOAO
C
C THE FOLLOWING CALL IS FOR GATHERING STATISTICS ON LIBRARY USE AT NCAR
C
CALL Q8QST4 ('NSSL','ISOSRF','ISOSRF','VERSION 12')
NERR = 0
C
C 3-SPACE U,V,W,IU,IV,IW,ETC
C 2-SPACE X,Y,IX,IY,ETC
C
C INITIALIZE MASKS
C
IF (.NOT.GENDON) CALL MMASK
C
C SET SHIFT VALUE FOR X,Y PACKING
C
C IF YOUR MACHINE HAS MORE THAN 16 BITS PER WORD THIS CHECK MAY BE
C MODIFIED
C
IF (LU .LE. 256) GO TO 10
NERR = NERR + 1
CALL SETER('DIMENSION OF CUBE EXCEEDS 256',NERR,2)
RETURN
10 DO 20 J=1,30
IF (LU .LE. 2**(J-1)) GO TO 30
20 CONTINUE
30 IXBIT = J
NU = MU
NUP2 = NU+2
NV = MV
NVP2 = NV+2
NW = MW
NWP2 = NW+2
FNU = NU
FNV = NV
FNW = NW
SU1 = SU(1.)
SV1 = SV(1.)
SW1 = SW(1.)
SUNU = SU(FNU)
SVNV = SV(FNV)
SWNW = SW(FNW)
AVEU = AVE(SU1,SUNU)
AVEV = AVE(SV1,SVNV)
AVEW = AVE(SW1,SWNW)
EYEU = EYE(1)
EYEV = EYE(2)
EYEW = EYE(3)
NUVWP2 = MUVWP2
TVAL = TISO
NFLAG = IABS(IFLAG)
IF (NFLAG.EQ.0 .OR. NFLAG.GE.8) NFLAG = 7
C
C SET UP SCALING
C
FACT = -ISIGN(1,IFLAG)
CALL SET3D (EYE,1.,FNU,1.,FNV,1.,FNW)
C
C BOUND LOWER AND LEFT EDGE OF SLAB
C
EDGE = SIGN(BIG,FACT)
DO 40 IUVW=1,NUVWP2
SLAB(IUVW,1) = EDGE
SLAB(1,IUVW) = EDGE
40 CONTINUE
C
C SLICES PERPENDICULAR TO U. THAT IS, V W SLICES. T OF CONSTANT U.
C
IF (NFLAG .LT. 4) GO TO 100
CALL ZEROSC
ISLBT = -1
C
C BOUND UPPER AND RIGHT EDGE OF SLAB.
C
DO 50 IV=2,NVP2
SLAB(IV,NWP2) = EDGE
50 CONTINUE
DO 60 IW=2,NWP2
SLAB(NVP2,IW) = EDGE
60 CONTINUE
C
C GO THRU 3-D ARRAY IN U DIRECTION. IUEW=IU EITHER WAY.
C PICK IU BASED ON EYEU.
C
DO 90 IUEW=1,NU
IU = IUEW
IF (EYEU .GT. AVEU) IU = NU+1-IUEW
U = IU
C
C LOAD THIS SLICE OF T INTO SLAB.
C
DO 80 IV=1,NV
DO 70 IW=1,NW
SLAB(IV+1,IW+1) = T(IU,IV,IW)
70 CONTINUE
80 CONTINUE
C
C CONTOUR THIS SLAB.
C
CALL STCNTR (SLAB,NUVWP2,NVP2,NWP2,TVAL)
C
C CONSTRUCT VISIBILITY ARRAY.
C
CALL FILLIN
90 CONTINUE
C
C SLICES PERPENDICULAR TO V. U W SLICES. T OF CONSTANT V.
C
100 IF (MOD(NFLAG/2,2) .EQ. 0) GO TO 160
CALL ZEROSC
ISLBT = 0
C
C BOUND UPPER AND RIGHT EDGE OF SLAB.
C
DO 110 IU=2,NUP2
SLAB(IU,NWP2) = EDGE
110 CONTINUE
DO 120 IW=2,NWP2
SLAB(NUP2,IW) = EDGE
120 CONTINUE
C
C GO THRU T IN V DIRECTION. IVEW=IV EITHER WAY.
C
DO 150 IVEW=1,NV
IV = IVEW
IF (EYEV .GT. AVEV) IV = NV+1-IVEW
V = IV
C
C LOAD THIS SLICE OF T INTO SLAB.
C
DO 140 IU=1,NU
DO 130 IW=1,NW
SLAB(IU+1,IW+1) = T(IU,IV,IW)
130 CONTINUE
140 CONTINUE
C
C CONTOUR THIS SLAB.
C
CALL STCNTR (SLAB,NUVWP2,NUP2,NWP2,TVAL)
C
C CONSTRUCT VISIBILITY ARRAY.
C
CALL FILLIN
150 CONTINUE
C
C SLICES PERPENDICULAR TO W. U V SLICES. T OF CONSTANT W.
C
160 IF (MOD(NFLAG,2) .EQ. 0) GO TO 220
CALL ZEROSC
C
ISLBT = 1
C
C BOUND UPPER AND RIGHT EDGE OF SLAB.
C
DO 170 IU=2,NUP2
SLAB(IU,NVP2) = EDGE
170 CONTINUE
DO 180 IV=2,NVP2
SLAB(NUP2,IV) = EDGE
180 CONTINUE
C
C GO THRU T IN W DIRECTION.
C
DO 210 IWEW=1,NW
IW = IWEW
IF (EYEW .GT. AVEW) IW = NW+1-IWEW
W = IW
C
C LOAD THIS SLICE OF T INTO SLAB.
C
DO 200 IU=1,NU
DO 190 IV=1,NV
SLAB(IU+1,IV+1) = T(IU,IV,IW)
190 CONTINUE
200 CONTINUE
C
C CONTOUR THIS SLAB.
C
CALL STCNTR (SLAB,NUVWP2,NUP2,NVP2,TVAL)
C
C CONSTRUCT VISIBILITY ARRAY.
C
CALL FILLIN
210 CONTINUE
C
C DRAW REFERENCE PLANE EDGES AND W AXIS.
C
220 IF (IREF .EQ. 0) RETURN
CALL TRN32I (SU1,SV1,SW1,XT,YT,DUM,2)
IF (EYEV .LT. SV1) GO TO 240
CALL FRSTC (IFIX(XT),IFIX(YT),1)
DO 230 IU=2,NU
CALL TRN32I (SU(FLOAT(IU)),SV1,SW1,XT,YT,DUM,2)
CALL FRSTC (IFIX(XT),IFIX(YT),2)
230 CONTINUE
GO TO 250
240 CALL PLOTIT (IFIX(XT),IFIX(YT),0)
CALL TRN32I (SUNU,SV1,SW1,XT,YT,DUM,2)
CALL PLOTIT (IFIX(XT),IFIX(YT),1)
250 IF (EYEU .GT. SUNU) GO TO 270
CALL FRSTC (IFIX(XT),IFIX(YT),1)
DO 260 IV=2,NV
CALL TRN32I (SUNU,SV(FLOAT(IV)),SW1,XT,YT,DUM,2)
CALL FRSTC (IFIX(XT),IFIX(YT),2)
260 CONTINUE
GO TO 280
270 CALL PLOTIT (IFIX(XT),IFIX(YT),0)
CALL TRN32I (SUNU,SVNV,SW1,XT,YT,DUM,2)
CALL PLOTIT (IFIX(XT),IFIX(YT),1)
280 IF (EYEV .GT. SVNV) GO TO 300
CALL FRSTC (IFIX(XT),IFIX(YT),1)
DO 290 IUOW=2,NU
CALL TRN32I (SU(FLOAT(NU-IUOW+1)),SVNV,SW1,XT,YT,DUM,2)
CALL FRSTC (IFIX(XT),IFIX(YT),2)
290 CONTINUE
GO TO 310
300 CALL PLOTIT (IFIX(XT),IFIX(YT),0)
CALL TRN32I (SU1,SVNV,SW1,XT,YT,DUM,2)
CALL PLOTIT (IFIX(XT),IFIX(YT),1)
310 IF (EYEU .LT. SU1) GO TO 330
CALL FRSTC (IFIX(XT),IFIX(YT),1)
DO 320 IVOW=2,NV
CALL TRN32I (SU1,SV(FLOAT(NV-IVOW+1)),SW1,XT,YT,DUM,2)
CALL FRSTC (IFIX(XT),IFIX(YT),2)
320 CONTINUE
GO TO 340
330 CALL PLOTIT (IFIX(XT),IFIX(YT),0)
CALL TRN32I (SU1,SV1,SW1,XT,YT,DUM,2)
CALL PLOTIT (IFIX(XT),IFIX(YT),1)
340 IF (EYEU.LE.SU1 .OR. EYEV.LE.SV1) GO TO 360
CALL FRSTC (IFIX(XT),IFIX(YT),1)
DO 350 IW=2,NW
CALL TRN32I (SU1,SV1,SW(FLOAT(IW)),XT,YT,DUM,2)
CALL FRSTC (IFIX(XT),IFIX(YT),2)
350 CONTINUE
C +NOAO - Plotit buffer needs to be flushed before returning.
call plotit (0, 0, 2)
C -NOAO
RETURN
360 CALL PLOTIT (IFIX(XT),IFIX(YT),0)
CALL TRN32I (SU1,SV1,SWNW,XT,YT,DUM,2)
CALL PLOTIT (IFIX(XT),IFIX(YT),1)
C +NOAO - Plotit buffer needs to be flushed before returning.
call plotit (0, 0, 2)
C -NOAO
RETURN
END
SUBROUTINE EZISOS (T,MU,MV,MW,EYE,SLAB,TISO)
C
SAVE
DIMENSION T(MU,MV,MW),EYE(3)
C
DATA ANG,PI/.35,3.141592/
C
C THE FOLLOWING CALL IS FOR GATHERING STATISTICS ON LIBRARY USE AT NCAR
C
CALL Q8QST4 ('NSSL','ISOSRF','EZISOS','VERSION 12')
C
C ARGUMENTS DESCRIBED IN ISOSRF
C
C PICK TYPES OF LINES TO DRAW
C
NU = MU
NV = MV
NW = MW
TVAL = TISO
MAX = MAX0(NU,NV,NW)+2
ATU = NU/2
ATV = NV/2
ATW = NW/2
EYEU = EYE(1)
EYEV = EYE(2)
EYEW = EYE(3)
RU = EYEU-ATU
RV = EYEV-ATV
RW = EYEW-ATW
RU2 = RU*RU
RV2 = RV*RV
RW2 = RW*RW
DU = SQRT(RV2+RW2)
DV = SQRT(RU2+RW2)
DW = SQRT(RU2+RV2)
DR = 1./SQRT(RU2+RV2+RW2)
C
C COMPUTE THE ARCCOSINE
C
TU = DU*DR
ANGU = ATAN(ABS(SQRT(1.-TU*TU)/TU))
IF (TU .LE. 0.) ANGU = PI-ANGU
TV = DV*DR
ANGV = ATAN(ABS(SQRT(1.-TV*TV)/TV))
IF (TV .LE. 0.) ANGV = PI-ANGV
TW = DW*DR
ANGW = ATAN(ABS(SQRT(1.-TW*TW)/TW))
IF (TW .LE. 0.) ANGW = PI-ANGW
C
C BREAK POINT IS ABOUT 20 DEGREES OR ABOUT .35 RADIANS
C
IFLAG = 0
IF (ANGU .GT. ANG) IFLAG = IFLAG+4
IF (ANGV .GT. ANG) IFLAG = IFLAG+2
IF (ANGW .GT. ANG) IFLAG = IFLAG+1
C
C FIND SIGN OF IFLAG
C
ICNT = 0
IF (ABS(RU) .LE. ATU) GO TO 30
IU = 1
IF (EYEU .GT. ATU) IU = NU
DO 20 IW=1,NW
DO 10 IV=1,NV
IF (T(IU,IV,IW) .GT. TVAL) ICNT = ICNT-2
ICNT = ICNT+1
10 CONTINUE
20 CONTINUE
30 IF (ABS(RV) .LE. ATV) GO TO 60
IV = 1
IF (EYEV .GT. ATV) IV = NV
DO 50 IW=1,NW
DO 40 IU=1,NU
IF (T(IU,IV,IW) .GT. TVAL) ICNT = ICNT-2
ICNT = ICNT+1
40 CONTINUE
50 CONTINUE
60 IF (ABS(RW) .LE. ATW) GO TO 90
IW = 1
IF (EYEW .GT. ATW) IW = NW
DO 80 IV=1,NV
DO 70 IU=1,NU
IF (T(IU,IV,IW) .GT. TVAL) ICNT = ICNT-2
ICNT = ICNT+1
70 CONTINUE
80 CONTINUE
90 IFLAG = ISIGN(IFLAG,ICNT)
CALL ISOSRF (T,NU,NU,NV,NV,NW,EYE,MAX,SLAB,TVAL,IFLAG)
C +NOAO - Call to frame is suppressed.
C CALL FRAME
C -NOAO
RETURN
END
SUBROUTINE SET3D (EYE,ULO,UHI,VLO,VHI,WLO,WHI)
SAVE
COMMON /TEMPR/ RZERO
C
DIMENSION EYE(3)
C
COMMON /ISOSR3/ ISCALE ,XMIN ,XMAX ,YMIN ,
1 YMAX ,BIGD ,R0
COMMON /PWRZ1I/ UUMIN ,UUMAX ,VVMIN ,VVMAX ,
1 WWMIN ,WWMAX ,DELCRT ,EYEU ,
2 EYEV ,EYEW
C
C
AVE(A,B) = (A+B)*.5
C
C A.S.F. FOR SCALING
C
SU(UTEMP) = UTEMP
SV(VTEMP) = VTEMP
SW(WTEMP) = WTEMP
C
C CONSTANTS FOR PWRZ
C
UUMIN = ULO
UUMAX = UHI
VVMIN = VLO
VVMAX = VHI
WWMIN = WLO
WWMAX = WHI
EYEU = EYE(1)
EYEV = EYE(2)
EYEW = EYE(3)
C
C FIND CORNERS IN 2-SPACE FOR 3-SPACE BOX CONTAINING OBJECT
C
ISCALE = 0
ATU = AVE(SU(UUMIN),SU(UUMAX))
ATV = AVE(SV(VVMIN),SV(VVMAX))
ATW = AVE(SW(WWMIN),SW(WWMAX))
BIGD = 0.
IF (RZERO .LE. 0.) GO TO 10
C
C RELETIVE SIZE FEATURE IN USE.
C GENERATE EYE POSITION THAT MAKES BOX HAVE MAXIMUM PROJECTED SIZE.
C
ALPHA = -(VVMIN-ATV)/(UUMIN-ATU)
VVEYE = -RZERO/SQRT(1.+ALPHA*ALPHA)
UUEYE = VVEYE*ALPHA
VVEYE = VVEYE+ATV
UUEYE = UUEYE+ATU
WWEYE = ATW
CALL TRN32I (ATU,ATV,ATW,UUEYE,VVEYE,WWEYE,1)
CALL TRN32I (UUMIN,VVMIN,ATW,XMIN,DUMM,DUMM,2)
CALL TRN32I (UUMAX,VVMIN,WWMIN,DUMM,YMIN,DUMM,2)
CALL TRN32I (UUMAX,VVMAX,ATW,XMAX,DUMM,DUMM,2)
CALL TRN32I (UUMAX,VVMIN,WWMAX,DUMM,YMAX,DUMM,2)
BIGD = SQRT((UUMAX-UUMIN)**2+(VVMAX-VVMIN)**2+(WWMAX-WWMIN)**2)*.5
R0 = RZERO
GO TO 20
10 CALL TRN32I (ATU,ATV,ATW,EYE(1),EYE(2),EYE(3),1)
CALL TRN32I (SU(UUMIN),SV(VVMIN),SW(WWMIN),X1,Y1,DUM,2)
CALL TRN32I (SU(UUMIN),SV(VVMIN),SW(WWMAX),X2,Y2,DUM,2)
CALL TRN32I (SU(UUMIN),SV(VVMAX),SW(WWMIN),X3,Y3,DUM,2)
CALL TRN32I (SU(UUMIN),SV(VVMAX),SW(WWMAX),X4,Y4,DUM,2)
CALL TRN32I (SU(UUMAX),SV(VVMIN),SW(WWMIN),X5,Y5,DUM,2)
CALL TRN32I (SU(UUMAX),SV(VVMIN),SW(WWMAX),X6,Y6,DUM,2)
CALL TRN32I (SU(UUMAX),SV(VVMAX),SW(WWMIN),X7,Y7,DUM,2)
CALL TRN32I (SU(UUMAX),SV(VVMAX),SW(WWMAX),X8,Y8,DUM,2)
XMIN = AMIN1(X1,X2,X3,X4,X5,X6,X7,X8)
XMAX = AMAX1(X1,X2,X3,X4,X5,X6,X7,X8)
YMIN = AMIN1(Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8)
YMAX = AMAX1(Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8)
C
C ADD RIGHT AMOUNT TO KEEP PICTURE SQUARE
C
20 WIDTH = XMAX-XMIN
HIGHT = YMAX-YMIN
DIF = .5*(WIDTH-HIGHT)
IF (DIF) 30, 50, 40
30 XMIN = XMIN+DIF
XMAX = XMAX-DIF
GO TO 50
40 YMIN = YMIN-DIF
YMAX = YMAX+DIF
50 ISCALE = 1
CALL TRN32I (ATU,ATV,ATW,EYE(1),EYE(2),EYE(3),1)
RETURN
END
SUBROUTINE TRN32I (U,V,W,XT,YT,ZT,IENT)
C
C THIS ROUTINE IMPLEMENTS THE 3-SPACE TO 2-SPACE TRANSFOR-
C MATION BY KUBER, SZABO AND GIULIERI, THE PERSPECTIVE
C REPRESENTATION OF FUNCTIONS OF TWO VARIABLES. J. ACM 15,
C 2, 193-204,1968.
C ARGUMENTS FOR SET
C U,V,W ARE THE 3-SPACE COORDINATES OF THE INTERSECTION
C OF THE LINE OF SIGHT AND THE IMAGE PLANE. THIS
C POINT CAN BE THOUGHT OF AS THE POINT LOOKED AT.
C XT,YT,ZT ARE THE 3-SPACE COORDINATES OF THE EYE POSITION.
C
C TRN32 ARGUMENTS
C U,V,W ARE THE 3-SPACE COORDINATES OF A POINT TO BE
C TRANSFORMED.
C XT,YT THE RESULTS OF THE 3-SPACE TO 2-SPACE TRANSFOR-
C MATION. WHEN ISCALE=0, XT AND YT ANR IN THE SAME
C UNITS AS U,V, AND W. WHEN ISCALE'0, XT AND YT
C ARE IN PLOTTER COORDINATES.
C ZT NOT USED.
C
SAVE
COMMON /PWRZ1I/ UUMIN ,UUMAX ,VVMIN ,VVMAX ,
1 WWMIN ,WWMAX ,DELCRT ,EYEU ,
2 EYEV ,EYEW
COMMON /ISOSR3/ ISCALE ,XMIN ,XMAX ,YMIN ,
1 YMAX ,BIGD ,R0
C
C RANGE OF PLOTTER COORDINATES
C
C
C WARNING
C IF PLOTTER MAXIMUM VALUE RANGES (IN X OR Y DIRECTION) FALL BELOW
C 101, THEN CHANGES MUST BE MADE IN SUBROUTINE FRSTC. THE REQUIRED
C CHANGES ARE MARKED BY WARNING COMMENTS IN FRSTC.
DATA NLX,NBY,NRX,NTY/10,10,32760,32760/
DATA PI/3.1411592/
C
C STORE THE PARAMETERS OF THE SET CALL FOR USE
C WITH THE TRANSLATE CALL
C
C DECIDE IF SET OR TRANSLATE CALL
C
IF (IENT .NE. 1) GO TO 50
AU = U
AV = V
AW = W
EU = XT
EV = YT
EW = ZT
C
C
C
C
C
DU = AU-EU
DV = AV-EV
DW = AW-EW
D = SQRT(DU*DU+DV*DV+DW*DW)
COSAL = DU/D
COSBE = DV/D
COSGA = DW/D
C
C COMPUTE THE ARCCOSINE
C
AL = ATAN(ABS(SQRT(1.-COSAL*COSAL)/COSAL))
IF (COSAL .LE. 0.) AL = PI-AL
BE = ATAN(ABS(SQRT(1.-COSBE*COSBE)/COSBE))
IF (COSBE .LE. 0.) BE = PI-BE
GA = ATAN(ABS(SQRT(1.-COSGA*COSGA)/COSGA))
IF (COSGA .LE. 0.) GA = PI-GA
SINGA = SIN(GA)
C
C THE 3-SPACE POINT LOOKED AT IS TRANSFORMED INTO (0,0) OF
C THE 2-SPACE. THE 3-SPACE W AXIS IS TRANSFORMED INTO THE
C 2-SPACE Y AXIS. IF THE LINE OF SIGHT IS CLOSE TO PARALLEL
C TO THE 3-SPACE W AXIS, THE 3-SPACE V AXIS IS CHOSEN (IN-
C STEAD OF THE 3-SPACE W AXIS) TO BE TRANSFORMED INTO THE
C 2-SPACE Y AXIS.
C
ASSIGN 90 TO JDONE
IF (ISCALE) 10, 30, 10
10 X0 = XMIN
Y0 = YMIN
X1 = NLX
Y1 = NBY
X2 = NRX-NLX
Y2 = NTY-NBY
X3 = X2/(XMAX-XMIN)
Y3 = Y2/(YMAX-YMIN)
X4 = NRX
Y4 = NTY
FACT = 1.
IF (BIGD .LE. 0.) GO TO 20
X0 = -BIGD
Y0 = -BIGD
X3 = X2/(2.*BIGD)
Y3 = Y2/(2.*BIGD)
FACT = R0/D
20 DELCRT = X2
ASSIGN 80 TO JDONE
30 IF (SINGA .LT. 0.0001) GO TO 40
R = 1./SINGA
ASSIGN 70 TO JUMP
RETURN
40 SINBE = SIN(BE)
R = 1./SINBE
ASSIGN 60 TO JUMP
RETURN
C
C******************** ENTRY TRN32 ************************
C ENTRY TRN32 (U,V,W,XT,YT,ZT)
C
50 UU = U
VV = V
WW = W
Q = D/((UU-EU)*COSAL+(VV-EV)*COSBE+(WW-EW)*COSGA)
GO TO JUMP,( 60, 70)
60 UU = ((EW+Q*(WW-EW)-AW)*COSAL-(EU+Q*(UU-EU)-AU)*COSGA)*R
VV = (EV+Q*(VV-EV)-AV)*R
GO TO JDONE,( 80, 90)
70 UU = ((EU+Q*(UU-EU)-AU)*COSBE-(EV+Q*(VV-EV)-AV)*COSAL)*R
VV = (EW+Q*(WW-EW)-AW)*R
GO TO JDONE,( 80, 90)
80 XT = AMIN1(X4,AMAX1(X1,X1+X3*(FACT*UU-X0)))
YT = AMIN1(Y4,AMAX1(Y1,Y1+Y3*(FACT*VV-Y0)))
RETURN
90 XT = UU
YT = VV
RETURN
END
SUBROUTINE ZEROSC
SAVE
C
COMMON /ISOSR2/ LX ,NX ,NY ,ISCR(8,128),
1 ISCA(8,128)
C
C ZERO BOTH SCRENE MODELS.
C
DO 20 I=1,LX
DO 10 J=1,NY
ISCR(I,J) = 0
ISCA(I,J) = 0
10 CONTINUE
20 CONTINUE
RETURN
END
SUBROUTINE STCNTR (Z,L,M,N,CONV)
C
SAVE
DIMENSION Z(L,N)
C
C THIS ROUTINE FINDS THE BEGINNINGS OF ALL CONTOUR LINES AT LEVEL CONV.
C FIRST THE EDGES ARE SEARCHED FOR LINES INTERSECTING THE EDGE (OPEN
C LINES) THEN THE INTERIOR IS SEARCHED FOR LINES WHICH DO NOT INTERSECT
C THE EDGE (CLOSED LINES). BEGINNINGS ARE STORED IN IR TO PREVENT RE-
C TRACING OF LINES. IF IR IS FILLED, THE SEARCH IS STOPPED FOR THIS
C CONV.
C
COMMON /ISOSR6/ IX ,IY ,IDX ,IDY ,
1 IS ,ISS ,NP ,CV ,
2 INX(8) ,INY(8) ,IR(500) ,NR
COMMON /ISOSR7/ IENTRY ,IONES
COMMON /ISOSR9/ BIG ,IXBIT
C
C PACK X AND Y
C
IPXY(I1,J1) = ISHIFT(I1,IXBIT)+J1
C
IENTRY = 0
NP = 0
CV = CONV
C
C THE FOLLOWING CODE SHOULD BE RE-ENABLED IF THIS ROUTINE IS USED FOR
C GENERAL CONTOURING
C
C ISS=0
C DO 2 IP1=2,M
C I=IP1-1
C IF(Z(I,1).GE.CV.OR.Z(IP1,1).LT.CV) GO TO 1
C IX=IP1
C IY=1
C IDX=-1
C IDY=0
C IS=1
C CALL DRLINE(Z,L,M,N)
C 1 IF(Z(IP1,N).GE.CV.OR.Z(I,N).LT.CV) GO TO 2
C IX=I
C IY=N
C IDX=1
C IDY=0
C IS=5
C CALL DRLINE(Z,L,M,N)
C 2 CONTINUE
C DO 4 JP1=2,N
C J=JP1-1
C IF(Z(M,J).GE.CV.OR.Z(M,JP1).LT.CV) GO TO 3
C IX=M
C IY=JP1
C IDX=0
C IDY=-1
C IS=7
C CALL DRLINE(Z,L,M,N)
C 3 IF(Z(1,JP1).GE.CV.OR.Z(1,J).LT.CV) GO TO 4
C IX=1
C IY=J
C IDX=0
C IDY=1
C IS=3
C CALL DRLINE(Z,L,M,N)
C 4 CONTINUE
C
ISS = 1
DO 40 JP1=3,N
J = JP1-1
DO 30 IP1=2,M
I = IP1-1
IF (Z(I,J).GE.CV .OR. Z(IP1,J).LT.CV) GO TO 30
IXY = IPXY(IP1,J)
IF (NP .EQ. 0) GO TO 20
DO 10 K=1,NP
IF (IR(K) .EQ. IXY) GO TO 30
10 CONTINUE
20 NP = NP+1
IF (NP .GT. NR) RETURN
IR(NP) = IXY
IX = IP1
IY = J
IDX = -1
IDY = 0
IS = 1
CALL DRCNTR (Z,L,M,N)
30 CONTINUE
40 CONTINUE
RETURN
END
SUBROUTINE DRCNTR (Z,L,MM,NN)
SAVE
C
DIMENSION Z(L,NN)
C
C THIS ROUTINE TRACES A CONTOUR LINE WHEN GIVEN THE BEGINNING BY STLINE.
C TRANSFORMATIONS CAN BE ADDED BY DELETING THE STATEMENT FUNCTIONS FOR
C FX AND FY IN DRLINE AND MINMAX AND ADDING EXTERNAL FUNCTIONS.
C X=1. AT Z(1,J), X=FLOAT(M) AT Z(M,J). X TAKES ON NON-INTEGER VALUES.
C Y=1. AT Z(I,1), Y=FLOAT(N) AT Z(I,N). Y TAKES ON NON-INTEGER VALUES.
C
COMMON /ISOSR6/ IX ,IY ,IDX ,IDY ,
1 IS ,ISS ,NP ,CV ,
2 INX(8) ,INY(8) ,IR(500) ,NR
COMMON /ISOSR9/ BIG ,IXBIT
C
LOGICAL IPEN ,IPENO
C
DATA IOFFP,SPVAL/0,0./
DATA IPEN,IPENO/.TRUE.,.TRUE./
C
C PACK X AND Y
C
IPXY(I1,J1) = ISHIFT(I1,IXBIT)+J1
FX(X1,Y1) = X1
FY(X1,Y1) = Y1
C(P11,P21) = (P11-CV)/(P11-P21)
C
M = MM
N = NN
IF (IOFFP .EQ. 0) GO TO 10
ASSIGN 100 TO JUMP1
ASSIGN 150 TO JUMP2
GO TO 20
10 ASSIGN 120 TO JUMP1
ASSIGN 160 TO JUMP2
20 IX0 = IX
IY0 = IY
IS0 = IS
IF (IOFFP .EQ. 0) GO TO 30
IX2 = IX+INX(IS)
IY2 = IY+INY(IS)
IPEN = Z(IX,IY).NE.SPVAL .AND. Z(IX2,IY2).NE.SPVAL
IPENO = IPEN
30 IF (IDX .EQ. 0) GO TO 40
Y = IY
ISUB = IX+IDX
X = C(Z(IX,IY),Z(ISUB,IY))*FLOAT(IDX)+FLOAT(IX)
GO TO 50
40 X = IX
ISUB = IY+IDY
Y = C(Z(IX,IY),Z(IX,ISUB))*FLOAT(IDY)+FLOAT(IY)
50 IF (IPEN) CALL FRSTS (FX(X,Y),FY(X,Y),1)
60 IS = IS+1
IF (IS .GT. 8) IS = IS-8
IDX = INX(IS)
IDY = INY(IS)
IX2 = IX+IDX
IY2 = IY+IDY
IF (ISS .NE. 0) GO TO 70
IF (IX2.GT.M .OR. IY2.GT.N .OR. IX2.LT.1 .OR. IY2.LT.1) GO TO 190
70 IF (CV-Z(IX2,IY2)) 80, 80, 90
80 IS = IS+4
IX = IX2
IY = IY2
GO TO 60
90 IF (IS/2*2 .EQ. IS) GO TO 60
GO TO JUMP1,(100,120)
100 ISBIG = IS+(8-IS)/6*8
IX3 = IX+INX(ISBIG-1)
IY3 = IY+INY(ISBIG-1)
IX4 = IX+INX(ISBIG-2)
IY4 = IY+INY(ISBIG-2)
IPENO = IPEN
IF (ISS .NE. 0) GO TO 110
IF (IX3.GT.M .OR. IY3.GT.N .OR. IX3.LT.1 .OR. IY3.LT.1) GO TO 190
IF (IX4.GT.M .OR. IY4.GT.N .OR. IX4.LT.1 .OR. IY4.LT.1) GO TO 190
110 IPEN = Z(IX,IY).NE.SPVAL .AND. Z(IX2,IY2).NE.SPVAL .AND.
1 Z(IX3,IY3).NE.SPVAL .AND. Z(IX4,IY4).NE.SPVAL
120 IF (IDX .EQ. 0) GO TO 130
Y = IY
ISUB = IX+IDX
X = C(Z(IX,IY),Z(ISUB,IY))*FLOAT(IDX)+FLOAT(IX)
GO TO 140
130 X = IX
ISUB = IY+IDY
Y = C(Z(IX,IY),Z(IX,ISUB))*FLOAT(IDY)+FLOAT(IY)
140 GO TO JUMP2,(150,160)
150 IF (.NOT.IPEN) GO TO 170
IF (IPENO) GO TO 160
C
C END OF LINE SEGMENT
C
CALL FRSTS (D1,D2,3)
CALL FRSTS (FX(XOLD,YOLD),FY(XOLD,YOLD),1)
C
C CONTINUE LINE SEGMENT
C
160 CALL FRSTS (FX(X,Y),FY(X,Y),2)
170 XOLD = X
YOLD = Y
IF (IS .NE. 1) GO TO 180
NP = NP+1
IF (NP .GT. NR) GO TO 190
IR(NP) = IPXY(IX,IY)
180 IF (ISS .EQ. 0) GO TO 60
IF (IX.NE.IX0 .OR. IY.NE.IY0 .OR. IS.NE.IS0) GO TO 60
C
C END OF LINE
C
190 CALL FRSTS (D1,D2,3)
RETURN
END
SUBROUTINE TR32 (X,Y,MX,MY)
SAVE
C
COMMON /ISOSR1/ ISLBT ,U ,V ,W
C
C A.S.F. FOR SCALING
C
SU(UTEMP) = UTEMP
SV(VTEMP) = VTEMP
SW(WTEMP) = WTEMP
C
XX = X
YY = Y
IF (ISLBT) 10, 20, 30
10 CALL TRN32I (SU(U),SV(XX-1.),SW(YY-1.),XT,YT,DUM,2)
GO TO 40
20 CALL TRN32I (SU(XX-1.),SV(V),SW(YY-1.),XT,YT,DUM,2)
GO TO 40
30 CALL TRN32I (SU(XX-1.),SV(YY-1.),SW(W),XT,YT,DUM,2)
40 MX = XT
MY = YT
RETURN
END
SUBROUTINE FRSTS (XX,YY,IENT)
C
C THIS IS A SPECIAL VERSION OF THE SMOOTHING DASHED LINE PACKAGE. LINES
C ARE SMOOTHED IN THE SAME WAY, BUT NO SOFTFARE DASHED LINES ARE USED.
C CONDITIONAL PLOTTING ROUTINES ARE CALL WHICH DETERMINE THE VISIBILITY
C OF A LINE SEGMENT BEFORE PLOTTING.
C
SAVE
DIMENSION XSAVE(70) ,YSAVE(70) ,XP(70) ,YP(70) ,
1 TEMP(70)
C
COMMON /ISOSR7/ IENTRY ,IONES
C
DATA NP/150/
DATA L1/70/
DATA TENSN/2.5/
DATA PI/3.14159265358/
DATA SMALL/128./
C
AVE(A,B) = .5*(A+B)
C
C DECIDE IF FRSTS,VECTS,LASTS CALL
C
GO TO ( 10, 20, 40),IENT
10 DEG = 180./PI
X = XX
Y = YY
LASTFL = 0
SSLP1 = 0.0
SSLPN = 0.0
XSVN = 0.0
YSVN = 0.0
C
C INITIALIZE THE POINT AND SEGMENT COUNTER
C N COUNTS THE NUMBER OF POINTS/SEGMENT
C
N = 0
C
C NSEG = 0 FIRST SEGMENT
C NSEG = 1 MORE THAN ONE SEGMENT
C
NSEG = 0
CALL TR32 (X,Y,MX,MY)
C
C SAVE THE X,Y COORDINATES OF THE FIRST POINT
C XSV1 CONTAINS THE X COORDINATE OF THE FIRST POINT
C OF A LINE
C YSV1 CONTAINS THE Y COORDINATE OF THE FIRST POINT
C OF A LINE
C
XSV1 = MX
YSV1 = MY
GO TO 30
C
C ************************* ENTRY VECTS *************************
C ENTRY VECTS (XX,YY)
C
20 X = XX
Y = YY
C
C VECTS SAVES THE X,Y COORDINATES OF THE ACCEPTED
C POINTS ON A LINE SEGMENT
C
CALL TR32 (X,Y,MX,MY)
C
CIF THE NEW POINT IS TOO CLOSE TO THE PREVIOUS POINT, IGNORE IT
C
IF (ABS(FLOAT(IFIX(XSVN)-MX))+ABS(FLOAT(IFIX(YSVN)-MY)) .LT.
1 SMALL) RETURN
IFLAG = 0
30 N = N+1
C
C SAVE THE X,Y COORDINATES OF EACH POINT OF THE SEGMENT
C XSAVE THE ARRAY OF X COORDINATES OF LINE SEGMENT
C YSAVE THE ARRAY OF Y COORDINATES OF LINE SEGMENT
C
XSAVE(N) = MX
YSAVE(N) = MY
XSVN = XSAVE(N)
YSVN = YSAVE(N)
IF (N .GE. L1-1) GO TO 50
RETURN
C
C ************************* ENTRY LASTS *************************
C ENTRY LASTS
C
40 LASTFL = 1
C
C LASTS CHECKS FOR PERIODIC LINES AND SETS UP
C THE CALLS TO KURV1S AND KURV2S
C
C IFLAG = 0 OK TO CALL LASTS DIRECTLY
C IFLAG = 1 LASTS WAS JUST CALLED FROM BY VECTS
C IGNORE CALL TO LASTS
C
IF (IFLAG .EQ. 1) RETURN
C
C COMPARE THE LAST POINT OF SEGMENT WITH FIRST POINT OF LINE
C
50 IFLAG = 1
C
C IPRD = 0 PERIODIC LINE
C IPRD = 1 NON-PERIODIC LINE
C
IPRD = 1
IF (ABS(XSV1-XSVN)+ABS(YSV1-YSVN) .LT. SMALL) IPRD = 0
C
C TAKE CARE OF THE CASE OF ONLY TWO DISTINCT P0INTS ON A LINE
C
IF (NSEG .GE. 1) GO TO 70
IF (N-2) 160,150, 60
60 IF (N .GE. 4) GO TO 70
DX = XSAVE(2)-XSAVE(1)
DY = YSAVE(2)-YSAVE(1)
SLOPE = ATAN2(DY,DX)*DEG+90.
IF (SLOPE .GE. 360.) SLOPE = SLOPE-360.
IF (SLOPE .LE. 0.) SLOPE = SLOPE+360.
SLP1 = SLOPE
SLPN = SLOPE
ISLPSW = 0
SIGMA = TENSN
GO TO 110
70 SIGMA = TENSN
IF (IPRD .GE. 1) GO TO 90
IF (NSEG .GE. 1) GO TO 80
C
C SET UP FLAGS FOR A 1 SEGMENT, PERIODIC LINE
C
ISLPSW = 4
XSAVE(N) = XSV1
YSAVE(N) = YSV1
GO TO 110
C
C SET UP FLAGS FOR AN N-SEGMENT, PERIODIC LINE
C
80 SLP1 = SSLPN
SLPN = SSLP1
ISLPSW = 0
GO TO 110
90 IF (NSEG .GE. 1) GO TO 100
C
C SET UP FLAGS FOR THE 1ST SEGMENT OF A NON-PERIODIC LINE
C
ISLPSW = 3
GO TO 110
C
C SET UP FLAGS FOR THE NTH SEGMENT OF A NON-PERIODIC LINE
C
100 SLP1 = SSLPN
ISLPSW = 1
C
C CALL THE SMOOTHING ROUTINES
C
110 CALL KURV1S (N,XSAVE,YSAVE,SLP1,SLPN,XP,YP,TEMP,S,SIGMA,ISLPSW)
IF (IPRD.EQ.0 .AND. NSEG.EQ.0 .AND. S.LT.70.) GO TO 170
IENTRY = 1
C
C DETERMINE THE NUMBER OF POINTS TO INTERPOLATE FOR EACH SEGMENT
C
IF (NSEG.GE.1 .AND. N.LT.L1-1) GO TO 120
NPRIME = FLOAT(NP)-(S*FLOAT(NP))/(2.*32768.)
IF (S .GE. 32768.) NPRIME = .5*FLOAT(NP)
NPL = FLOAT(NPRIME)*S/32768.
IF (NPL .LT. 2) NPL = 2
120 DT = 1./FLOAT(NPL)
IF (NSEG .LE. 0) CALL FRSTC (IFIX(XSAVE(1)),IFIX(YSAVE(1)),1)
T = 0.0
NSLPSW = 1
IF (NSEG .GE. 1) NSLPSW = 0
NSEG = 1
CALL KURV2S (T,XS,YS,N,XSAVE,YSAVE,XP,YP,S,SIGMA,NSLPSW,SLP)
C
C SAVE SLOPE AT THE FIRST POINT OF THE LINE
C
IF (NSLPSW .GE. 1) SSLP1 = SLP
NSLPSW = 0
XSOLD = XSAVE(1)
YSOLD = YSAVE(1)
DO 130 I=1,NPL
T = T+DT
TT = -T
IF (I .EQ. NPL) NSLPSW = 1
CALL KURV2S (TT,XS,YS,N,XSAVE,YSAVE,XP,YP,S,SIGMA,NSLPSW,SLP)
C
C SAVE THE LAST SLOPE OF THIS LINE SEGMENT
C
IF (NSLPSW .GE. 1) SSLPN = SLP
C
C DRAW EACH PART OF THE LINE SEGMENT
C
CALL FRSTC (IFIX(AVE(XSOLD,XS)),IFIX(AVE(YSOLD,YS)),2)
CALL FRSTC (IFIX(XS),IFIX(YS),2)
XSOLD = XS
YSOLD = YS
130 CONTINUE
IF (IPRD .NE. 0) GO TO 140
C
C CONNECT THE LAST POINT WITH THE FIRST POINT OF A PERIODIC LINE
C
CALL FRSTC (IFIX(AVE(XSOLD,XS)),IFIX(AVE(YSOLD,YS)),2)
CALL FRSTC (IFIX(XSV1),IFIX(YSV1),2)
C
C BEGIN THE NEXT LINE SEGMENT WITH THE LAST POINT OF THIS SEGMENT
C
140 XSAVE(1) = XS
YSAVE(1) = YS
N = 1
150 CONTINUE
160 RETURN
170 N = 0
RETURN
END
SUBROUTINE FRSTC (MX,MY,IENT)
SAVE
C
COMMON /ISOSR2/ LX ,NX ,NY ,ISCR(8,128),
1 ISCA(8,128)
COMMON /ISOSR4/ RX ,RY
COMMON /ISOSR5/ NBPW ,MASK(16) ,GENDON
LOGICAL GENDON
COMMON /ISOSR8/ NMASK(16) ,IXOLD ,IYOLD ,IBTOLD ,
1 HBFLAG ,IOSLSN ,LRLX ,IFSX ,
2 IFSY ,FIRST ,IYDIR ,IHX ,
3 IHB ,IHS ,IHV ,IVOLD ,
4 IVAL ,IHRX ,YCHANG ,ITPD ,
5 IHF
LOGICAL YCHANG ,HBFLAG ,FIRST ,IHF
C
C
C DRAW LINE TO THE POINT MX,MY
C
C ENTER THE POINT INTO THE CURRENT SCREEN, ISCR, IF THE POINT CONFORMS
C TO THE SHADING ALGORITHM.
C THE POINT IS NOT ENTERED WHEN;
C 1. IT IS THE SAME POINT USED IN THE LAST CALL, RESOLUTION PROBLEM
C 2. IT IS PART OF A HORIZONTAL LINE BUT NOT AN END POINT
C 3. THE ENTIRE CONTOUR RESTS ON A HORIZONTAL PLANE
C
C WHEN DRAWING A HORIZONTAL LINE THREE CONDITIONS EXIST;
C 1. WHEN THE LINE IS A HORIZONTAL STEP ENTER ONLY THE OUTSIDE POINT.
C A HORIZONTAL STEP IS DEFINED BY THE ENTERING AND EXITING Y
C DIRECTION THAT IS THE SAME.
C 2. ENTER BOTH END POINTS OF A HORIZONTAL TURNING POINT. A HORIZONTAL
C TURNING POINT IS A LINE WITH GREATER THAN 1 HORIZONTAL BITS
C AND THE ENTERING AND EXITING Y DIRECTION IS DIFFIRENT.
C 3. WHEN THE ENTIRE CONTOUR IS A HORIZONTAL LINE NO POINTS ARE
C ENTERED. THIS CONDITION IS DETECTED BY THE STATUS OF YCHANG.
C IF IT IS TRUE THEN THE CONTOUR IS NOT A SINGLE HORIZONTAL LINE.
C
C THE PREVIOUS POINT IS ERASED IF IT IS A VERTICAL TURNING POINT.
C A VERTICAL TURNING POINT IS A HORIZONTAL LINE WITH ONLY 1 POINT
C AND THE ENTERING AND EXITING Y DIRECTION DIFFERS.THIS DATA IS
C IN THE VARIABLES IOSLSN-OLD SLOPE AND ISLSGN-NEW SLOPE.
C THE CHANGE IN SLOPE MUST BE -1 TO 1 OR 1 TO -1.
C
C OTHERWISE THE POINT IS ENTERED INTO ISCR.
C
C THE TWO ENTRY POINTS ARE REQUIRED BY THE HARDWARE DRAWING ROUTINES.
C FIRSTC IS USED FOR THE FIRST POINT ON THE CONTOUR. THE REMAINING
C POINTS ON THE SAME CONTOUR ARE ENTERED VIA VECTC.
C
DATA IONE/1/
AVE(A,B) = (A+B)*.5
C
C COMPUTE VISIBILITY OF THIS POINT
C
C WARNING
C IF X OR Y PLOTTER MAXIMUM VALUE RANGES FALL BELOW 101 THEN THE
C FOLLOWING TWO STATEMENTS WHICH SET IX AND IY MUST BE CHANGED.
C REPLACE THE CONSTANT 1.0 BY 0.5 IN THE STATEMENTS WHERE THE
C MAXIMUM PLOTTER VALUE IS LESS THAN 101 FOR THAT DIRECTION. THE
C PLOTTER CORDINATE RANGES ARE SET IN SET32.
C
IX = FLOAT(MX-1)*RX+1.0
NRLX = IX
IY = FLOAT(MY-1)*RY+1.0
IBIT = NBPW-MOD(IX,NBPW)
IX = IX/NBPW+1
IVNOW = IAND(ISHIFT(ISCA(IX,IY),1-IBIT),IONE)
C
C DECIDE IF FRSTC OR VECTC CALL
C
IF (IENT .NE. 1) GO TO 10
C
XOLD = MX
YOLD = MY
C
C
C SET INITIAL VALUES
C
IHF = .FALSE.
IYDIR = 0
ITPD = 0
IVAL = 0
IOSLSN = 0
IFSX = NRLX
IFSY = IY
LASTV = IVNOW
HBFLAG = .FALSE.
YCHANG = .FALSE.
CALL PLOTIT (IFIX(XOLD),IFIX(YOLD),0)
GO TO 180
C
C**************************** ENTRY VECTC ****************************
C ENTRY VECTC (MX,MY)
C
10 XNOW = MX
YNOW = MY
JUMP = IVNOW*2+LASTV+1
GO TO ( 20, 30, 40, 50),JUMP
C
C BOTH VISIBLE
C
20 CALL PLOTIT (IFIX(XNOW),IFIX(YNOW),1)
GO TO 50
C
C JUST TURNED VISIBLE
C
30 CALL PLOTIT (IFIX(AVE(XNOW,XOLD)),IFIX(AVE(YNOW,YOLD)),0)
GO TO 50
C
C JUST TURNED INVISIBLE
C
40 CALL PLOTIT (IFIX(AVE(XNOW,XOLD)),IFIX(AVE(YNOW,YOLD)),1)
C
C BOTH INVISIBLE
C
50 XOLD = XNOW
YOLD = YNOW
LASTV = IVNOW
C
C TEST FOR RESOLUTION PROBLEM
C
IF (NRLX.EQ.LRLX .AND. IY.EQ.IYOLD) RETURN
C
C TEST FOR HORIZONTAL BITS
C
IF (IYOLD .NE. IY) GO TO 70
C
C HORIZONTAL BITS DETECTED. SET FLAG AND EXIT.
C THIS AND THE NEXT HORIZONTAL BIT TEST IS NECESSARY FOR ISCR TO
C CONFORM TO THE SHADING ALGORITHM IN SUBROUTINE FILLIN
C
C
C IF HORIZONTAL LINE PREVIOUSLY DETECTED EXIT
C
IF (.NOT.HBFLAG) GO TO 60
C
C IF END OF CONTOUR ON A HORIZONTAL LINE BRANCH FOR SPECIAL PROCESSING.
C
IF (NRLX.EQ.IFSX .AND. IY.EQ.IFSY) GO TO 210
GO TO 200
C
C SAVE SLOPE PRIOR TO HORIZONTAL LINE
C
60 IHX = IXOLD
IHB = IBTOLD
IHS = IOSLSN
IOSLSN = 0
HBFLAG = .TRUE.
IHRX = LRLX
IHV = IVOLD
IF (LRLX.EQ.IFSX .AND. IYOLD.EQ.IFSY) IHF = .TRUE.
C
C THIS IS THE SECOND TRAP FOR END OF CONTOUR ON A HORIZONTAL LINE.
C
IF (NRLX.EQ.IFSX .AND. IY.EQ.IFSY) GO TO 210
GO TO 200
C
C COMPUTE THE SLOPE TO THIS POINT
C
70 IF (IY-IYOLD) 80, 90,100
80 ISLSGN = 1
GO TO 110
90 ISLSGN = 0
GO TO 120
100 ISLSGN = -1
110 IF (IYDIR .EQ. 0) IYDIR = ISLSGN
120 CONTINUE
C
C IF PROCESS REACHES THIS CODE THE CONTOUR IS NOT CONTAINED ON A SINGLE
C HORIZONTAL PLANE, SO RECORD THIS FACT BY SETTING Y CHANGE FLAG.
C
YCHANG = .TRUE.
C
C TEST FOR END OF HORIZONTAL LINE
C
IF (.NOT.HBFLAG) GO TO 160
HBFLAG = .FALSE.
C
C HORIZONTAL LINE JUST ENDED
C
C TEST FOR REDRAW
C
ITEMP = IAND(ISCR(IXOLD,IYOLD),MASK(IBTOLD))
IF ((IHV .EQ. 0) .AND. (ITEMP .EQ. 0)) GO TO 130
C
C REDRAWING ERASE THIS POINT
C
ISCR(IXOLD,IYOLD) = IAND(ISCR(IXOLD,IYOLD),NMASK(IBTOLD))
ISCR(IHX,IYOLD) = IAND(ISCR(IHX,IYOLD),NMASK(IHB))
GO TO 170
C
C TEST FOR STEP PROBLEM
C
130 IF (IHS .NE. ISLSGN) GO TO 140
C
C STEP PROBLEM
C
GO TO 170
C
C TURNING PROBLEM HORIZONTAL LINE IS A TURNING POINT
C
140 CONTINUE
C
C ENTER THE TURNING POINT ONLY IF IT IS NOT THE SECOND SUCCEEDING
C EVENT IN A ROW
C
ICTPD = 1
IF (IHRX .GT. NRLX) ICTPD = -1
IF (ICTPD .NE. ITPD) GO TO 150
ITPD = 0
C
C ERASE THE FIRST POINT
C
ISCR(IHX,IYOLD) = IAND(ISCR(IHX,IYOLD),NMASK(IHB))
GO TO 170
C
C ENTER THE TURNING POINT
C
150 CONTINUE
ITPD = ICTPD
C
C ENTER THE SECOND POINT
C
ISCR(IXOLD,IYOLD) = IOR(ISCR(IXOLD,IYOLD),MASK(IBTOLD))
GO TO 170
C
C CHECK IF PREVIOUS ENTRY WAS A VERTICAL TURNING POINT.
C IF SO ERASE IT.
C
160 IF (ISLSGN.EQ.IOSLSN .OR. (IOSLSN.EQ.0 .OR. ISLSGN.EQ.0))
1 GO TO 170
ITPD = 0
ISCR(IXOLD,IYOLD) = IAND(ISCR(IXOLD,IYOLD),NMASK(IBTOLD))
C
170 IOSLSN = ISLSGN
C
C CHECK IF THIS GRID POINT PREVIOUSLY ACTIVATED
C
IVAL = IAND(ISCR(IX,IY),MASK(IBIT))
C
C IF GRID POINTS ACTIVATED BRANCH
C
IF (IVAL .NE. 0) GO TO 190
C
C GRID POINT NOT ACTIVATED SET AND EXIT
C
180 CONTINUE
ISCR(IX,IY) = IOR(ISCR(IX,IY),MASK(IBIT))
GO TO 200
C
C THIS POINT IS BEING REDRAWN SO ERASE IT.
C (THIS IS TO CONFORM WITH THE SHADING ALGORITHM, FILLIN.
C HOWEVER IF BACK TO STARTING POINT DO NOT ERASE
C
190 IF (NRLX.EQ.IFSX .AND. IY.EQ.IFSY) RETURN
ISCR(IX,IY) = IAND(ISCR(IX,IY),NMASK(IBIT))
C
C
200 IXOLD = IX
LRLX = NRLX
IYOLD = IY
IBTOLD = IBIT
IVOLD = IVAL
RETURN
C
C PERFORM THIS OPERATION WHEN A CONTOUR STARTS OR ENDS ON A HORIZONTAL
C LINE.
C
210 CONTINUE
C
C ERASE THE FIRST POINT OF A CONTOUR WHEN IT IS PART OF A HORIZONTAL
C LINE SEGMENT AND IS NOT THE ENDPOINT OF THE SEGMENT
C
IF (.NOT.IHF) GO TO 220
ISCR(IX,IY) = IAND(ISCR(IX,IY),NMASK(IBIT))
220 CONTINUE
C
C ERASE THE FIRST POINT OF A HORIZONTAL LINE SEGMENT WHEN IT ENDS
C THE CONTOUR AND IS NOT THE HIGHEST LINE SEG ON THS SIDE.
C
IF (.NOT.YCHANG) GO TO 230
IF (IYDIR .NE. IHS) GO TO 200
230 ISCR(IHX,IY) = IAND(ISCR(IHX,IY),NMASK(IHB))
GO TO 200
END
SUBROUTINE FILLIN
C
SAVE
COMMON /ISOSR2/ LX ,NX ,NY ,ISCR(8,128),
1 ISCA(8,128)
COMMON /ISOSR5/ NBPW ,MASK(16) ,GENDON
LOGICAL GENDON
COMMON /ISOSR7/ IENTRY ,IONES
C
IF (IENTRY .EQ. 0) RETURN
C
C THIS IS A SHADING ALGORITHM IT IS USED TO DETERMINE CONTOUR LINES
C THAT ARE HIDDEN BY THE PRESENT LINE. THE ALGORITHM PROCESSES
C HORIZONTAL ROWS. IT ASSUMES THAT THE BIT PATTERN PASSED TO IT
C HAS ONLY BITS SET TO MARK THE START AND END OF SHADING. THE
C ALGORITHM ALSO ASSUMES THAT WHEN AN ON BIT IS ENCOUNTERED THAT A
C CORRESPONDING OFF BIT IS INCLUDED IN THE SAME ROW.
C
C
C PULL OUT ROWS OF THE CONTOUR PATTERN
C
IBVAL = 0
DO 80 IYNOW=1,NY
DO 40 IXNOW=1,LX
C
C IF NO ACTIVATED BITS BRANCH
C
ICRWD = ISCR(IXNOW,IYNOW)
IF (ICRWD .EQ. 0) GO TO 30
C
C ACTIVATED BITS IN WORD SET SHADING FLAG
C
C CHECK BIT BY BIT FOR ON/OFF FLAGS
C
DO 20 IB=1,NBPW
IBIT = (NBPW+1)-IB
C
C
C PULL OUT THE CURRENT GRID POINT VALUE
C
IVAL = IAND(ICRWD,MASK(IBIT))
C
C IF IVAL SET, THIS IS AN ON/OFF FLAG
C
IF (IVAL .EQ. 0) GO TO 10
C
C FLAG BIT, ALWAYS SET
C
IBVAL = MOD(IBVAL+1,2)
GO TO 20
C
C SHADE THE SCREEN ACCORDING TO THE STATUS OF IBVAL
C
10 IF (IBVAL .NE. 0) ICRWD = IOR(ICRWD,MASK(IBIT))
C
20 CONTINUE
C
C ZERO OUT THE SCREEN
C
ISCR(IXNOW,IYNOW) = 0
ISCA(IXNOW,IYNOW) = IOR(ICRWD,ISCA(IXNOW,IYNOW))
GO TO 40
C
30 IF (IBVAL .NE. 0) ISCA(IXNOW,IYNOW) = IONES
40 CONTINUE
C
C FIX FOR NONCORRECTABLE RUNAWAYS
C
IF (IBVAL .EQ. 0) GO TO 80
IBVAL = 0
DO 70 K=1,LX
ITEST = 0
IF (IYNOW .EQ. 1) GO TO 50
ITEST = ISCA(K,IYNOW-1)
IF (IYNOW .EQ. NY) GO TO 60
50 ITEST = IOR(ITEST,ISCA(K,IYNOW+1))
60 ISCA(K,IYNOW) = ITEST
70 CONTINUE
C
80 CONTINUE
RETURN
END
SUBROUTINE DRAWI (IXA,IYA,IXB,IYB)
C
C INCLUDED FOR USE BY PWRZ
C
SAVE
CALL FRSTC (IXA,IYA,1)
CALL FRSTC (IXB,IYB,2)
RETURN
END
SUBROUTINE MMASK
C
C MAKE THE MACHINE DEPENDENT MASKS USED IN THE CONTOUR DRAWING
C AND SHADING ALGORITHMS
C
SAVE
COMMON /ISOSR5/ NBPW ,MASK(16) ,GENDON
LOGICAL GENDON
COMMON /ISOSR7/ IENTRY ,IONES
COMMON /ISOSR8/ NMASK(16) ,IXOLD ,IYOLD ,IBTOLD ,
1 HBFLAG ,IOSLSN ,LRLX ,IFSX ,
2 IFSY ,FIRST ,IYDIR ,IHX ,
3 IHB ,IHS ,IHV ,IVOLD ,
4 IVAL ,IHRX ,YCHANG ,ITPD ,
5 IHF
COMMON /ISOSR9/ BIG ,IXBIT
LOGICAL YCHANG ,HBFLAG ,FIRST ,IHF
GENDON = .TRUE.
NBPW = 16
C
C GET BIGGEST REAL NUMBER
C
BIG = R1MACH(2)
C
C MASKS TO SELECT A SPECIFIC BIT
C
DO 10 K=1,NBPW
MASK(K) = ISHIFT(1,K-1)
10 CONTINUE
C
C GENERATE THE BIT PATTERN 177777 OCTAL
C
ITEMP1 = 0
ITEMP = MASK(NBPW)
IST = NBPW-1
DO 20 K=1,IST
ITEMP1 = IOR(ITEMP,ISHIFT(ITEMP1,-1))
20 CONTINUE
MFIX = IOR(ITEMP1,1)
C
C MASKS TO CLEAR A SPECIFIC BIT
C
DO 30 K=1,NBPW
NMASK(K) = IAND(ITEMP1,MFIX)
ITEMP1 = IOR(ISHIFT(ITEMP1,1),1)
30 CONTINUE
IONES = MFIX
RETURN
C
C REVISION HISTORY---
C
C JANUARY 1978 DELETED REFERENCES TO THE *COSY CARDS AND
C ADDED REVISION HISTORY
C JANUARY 1979 NEW SHADING ALGORITHM
C MARCH 1979 MADE CODE MACHINE INDEPENDENT AND CONFORM
C TO 66 FORTRAN STANDARD
C JUNE 1979 THIS VERSION PLACED ON ULIB.
C SEPTEMBER 1979 FIXED PROBLEM IN EZISOS DEALING WITH
C DETERMINATION OF VISIBILITY OF W PLANE.
C DECEMBER 1979 FIXED PROBLEM WITH PEN DOWN ON CONTOUR
C INITIALIZATION IN SUBROUTINE FRSTC
C MARCH CHANGED ROUTINE NAMES TRN32I AND DRAW TO
C TRN32I AND DRAWI TO BE CONSISTENT WITH THE
C USAGE OF THE NEW ROUTINE PWRZI.
C JUNE 1980 FIXED PROBLEM WITH ZERO INDEX COMPUTATION IN
C SUBROUTINE FRSTC. ADDED INPUT PARAMETER
C DIMENSION STATEMENT MISSING IN EZISOS.
C FIXED ERROR IN COMPUTATION OF ARCCOSINE
C IN EZISOS AND TRN32I.
C DECEMBER 1984 CONVERTED TO GKS LEVEL 0A AND STANDARD FORTRAN 77
C-----------------------------------------------------------------------
C
END
|