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