-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbas05-03.txt
146 lines (134 loc) · 11.5 KB
/
bas05-03.txt
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
V.4.7. Ф у н к ц и я POINT . О п е р а т о р PAINT
Синтаксис функции POINT:
POINT [STEP](X,Y)
где: POINT ("point"-"точка") - служебное слово;
X - арифметическое выражение, целая часть значения которого принад-
лежит отрезку [0,255] и задает x-координату точки; Y -арифметическое вы-
ражение, целая часть значения которого принадлежит отрезку [0,191] и зада-
ет y-координату точки;
STEP(X,Y) определяет смещение кординат точки на X и Y соответственно
относительно текущей позиции графического курсора.
Функция POINT в графическом режиме (SCREEN2, SCREEN3) возвращает код
цвета точки с координатами (X,Y),т.е. целое число, принадлежащее отрезку
[0,15]. На текстовом экране функция POINT всегда возвращает н у л ь .
Будьте осторожны! Иногда в режиме SCREEN 2 в о с е м ь (!) последова-
тельных точек в строке окрашиваются одним цветом,т.к.на 8 соседних в стро-
ке точек изображения (с номерами 0÷7,8÷15,...,248÷255) должно приходиться
только два цвета: основной и фоновый. Попытка установить для этих восьми
точек третий цвет приведет к переопределению уже имеющихся цветов!
Если точка находится за пределами координатных ограничений (0≤X≤255,
0≤Y≤191), то функция возвращает -1;если точка не принадлежит изображению,
то функция возвращает код цвета фона.
Функция POINT в основном используется для:
α) определения принадлежности точки некоторому рисунку;
β) определения цвета границы;
γ) определения, было ли столкновение движущегося на графическом экране
объекта с другим объектом, также находящимся на графическом экране.
П р и м е р ы:
─────────────
1) NEW
Ok
5 '"Столкновение" движущегося отрезка с неподвижной "границей"
10 COLOR 1,15,8:SCREEN2:LINE(150,0)-(150,150),6
20 FOR K=10TO295:PSET(K,95):PRESET(K-10,95):FORI=1TO19:NEXT:IF POIN
T(150,95)=1 THEN FORI=1TO1000:NEXT:SCREEN0:LOCATE 11,12:PRINT"Столк
новение":END ELSE NEXT
А теперь замените в условии оператора IF...THEN...ELSE POINT(150,95)
на POINT(149,95)... Заметили разницу?!
2) NEW
Ok
10 COLOR 1,15,8:SCREEN 3
20 FORK=1TO12:PSET(20*K,95),INT(RND(-TIME)*16):NEXT:P=0
50 FOR K=1 TO 12:IF POINT(20*K,95)=1 THEN P=1
70 NEXT:FOR K=1 TO 1000:NEXT:SCREEN0:KEY OFF
80 IF P=1 THEN GOSUB 110:FORI=1TO1000:NEXT:GOTO 10 ELSE GOSUB 100:F
OR I=1 TO 1000:NEXT:GOTO 10
100 LOCATE 9,12:PRINT"Черных точек нет!":RETURN
110 LOCATE 9,12:PRINT"Черные точки есть!":RETURN
3) Для закраски точки (X,Y) примените следующий прием:
PSET(X,Y),POINT(U,V)
где точка (U,V) принадлежит ф о н у! Другой способ закраски точки на гра-
фическом экране Вы узнаете, изучив оператор PAINT.
Забегая д а л е к о в п е р е д, отметим, что эта функция игнорирует
с п р а й т ы. Если точка изображается в белом цвете потому,что скрыта бе-
лым спрайтом, возвращаемый цвет соответствует действительному цвету точки.
Для закрашивания областей,ограниченных замкнутыми о д н о ц в е т н ы-
м и линиями, используется оператор PAINT, синтаксис которого:
PAINT [@][STEP](X,Y),[C][,G]
где: PAINT("to paint"-"красить") - служебное слово;
@ - необязательный элемент оператора PAINT, никак не влияющий на его
выполнение;
X - арифметическое выражение, целая часть значения которого принад-
лежит отрезку [0,255] и определяет x-координату точки; Y - арифметическое
выражение, целая часть значения которого принадлежит отрезку [0,191] и оп-
ределяет y-координату точки; (заметим, что, в отличие от других графичес-
ких операторов, значения X и Y должны обязательно находиться в прямоуголь-
нике [0,255]╳[0,191], в противном случае компьютер сообщает об ошибке:
"Illegal function call in ...";
параметр STEP, как всегда, указывает смещение закрашиваемой точки
от последней упомянутой Вами точки;
С - арифметическое выражение, целая часть значения которого принад-
лежит отрезку [0,15] и задает код цвета закраски области графического эк-
рана; если параметр С опущен, то область закрашивается текущим цветом изо-
бражения;
G - арифметическое выражение, целая часть значения которого принад-
лежит отрезку [0,15] и задает код цвета границы закрашиваемой области; ес-
ли параметр G опущен, то используется код текущего цвета изображения;этот
параметр игнорируется в режиме SCREEN2, поэтому в SCREEN2 контур другого
цвета можно получить,рисуя этот контур повторно требуемым цветом. В режи-
мах SCREEN 3, SCREEN 5 ÷ SCREEN 8 такой проблемы не существует!
Заметим,что если параметр С опущен,а параметр G присутствует, то перед
параметром G должны стоять две запятые, указывающие на отсутствие парамет-
ра С.
Пусть целые части значений параметров X,Y определяют точку с координа-
тами (X1,Y1).
Обозначим ∑ - совокупность областей, ограниченных замкнутыми линиями
цвета C, для которых точка (X1,Y1) является в н у т р е н н е й (если точ-
ка принадлежит границе области, то компьютер окажется в "раздумье":что же
ему закрашивать? И ... ничего не закрасит!). Если таких областей нет, то
примем за ∑ весь экран дисплея. Далее, пусть область σ - пересечение обла-
стей семейства ∑. Тогда после выполнения оператора PAINT область σ закра-
шивается цветом С.
Итак, для закрашивания области необходимо указать:
α) координаты произвольной точки, лежащей внутри области;
β) цвет закраски области и цвет контура, который Вы не хотите пересе-
кать при закрашивании.
Отметим, что оператор PAINT - очень "медленный" оператор по сравнению
с оператором LINE (с параметром BF); так,закраска всего экрана занимает в
режиме SCREEN2 около 15 секунд. Наконец, учтите,что даже мельчайшая"проре-
ха" в границе (разрыв контура) позволяет оператору PAINT "пролиться нару-
жу"и закрасить те участки экрана, которые Вы и не собирались окрашивать!
Поскольку при выполнении оператора PAINT используется стековая память,
понятно,что в процессе закрашивания некоторой области на экране внезапно
может появиться сообщение об ошибке:
"Out of memory" .
Вероятность появления такой ошибки повышается, если оператор PAINT яв-
ляется частью "глубоко" вложенных друг в друга циклов FOR...NEXT или под-
программ, или же если контур, ограничивающий закрашиваемую область, имеет
достаточно сложную форму.
П р и м е р ы:
─────────────
1) NEW 2) NEW
Ok Ok
10 COLOR 1,15,8:SCREEN2 10 COLOR 1,15,8:SCREEN2
20 FOR K=0 TO 15 20 FOR K=0 TO 15
30 CIRCLE(128,95),127-8*K, 30 CIRCLE(128,95),127-8*K
15-K,,,.7 ,15-K,0.,6.25,.7' 2π≈6.28!
40 PAINT(128,95),15-K 40 PAINT(128,95),15-K
50 NEXT 50 NEXT
60 GOTO 60 60 GOTO 60
3) NEW 4) NEW
Ok Ok
10 COLOR 1,15,8:SCREEN3 10 SCREEN2
20 FOR K=0 TO 15:CIRCLE 20 CIRCLE(128,95),60,10
(128,95),127-8*K,K,,,.7: 30 PAINT STEP(0,0),10
PAINT(128,95),15-K,K:NEXT 40 GOTO 40
60 GOTO 60
5) 10 COLOR 1,10,4:SCREEN2:FOR I=20 TO 110 STEP 10:CIRCLE(I+128,95),80
,1:PAINT(1.85*I,I+1),1:NEXT:A$=INPUT$(1)
6) Ok
10 COLOR1,15,8:SCREEN2
20 CIRCLE(95,60),20,1,-.01,-4.7124,1.1:PAINT(85,55),1:CIRCLE(95,125
),20,1,-1.5708,-6.2832,1.1:PAINT(85,130),1:CIRCLE(154,60),20,1,-4.7
124,-3.1416,1.1:PAINT(145,50),1:CIRCLE(154,125),20,1,-3.1416,-1.570
8,1.1:PAINT(155,106),1:GOTO20