В листинге 3.16 показано, как можно провести такую проверку. Сначала code устанавливается в 0, а затем его отдельные биты устанавливаются в нужные значения с помощью побитовой операции OR. Величины 8, 4, 2 и 1 являются простыми масками. Например, поскольку 8 в двоичной форме равно 00001000, побитовая операция логического сложения с 8 установит четвертый бит с правого конца в 1.

Листинг 3.16. Установка битов кодового слова «внутри/вне» для точки Р unsigned char code - 0: // initially all bits are 0 // вначале все биты равны 0 …if(P.x < window.l) code |- 8: // set bit 3 // устанавливаем бит 3 if(P.y < window.t) code |- 4: // set bit 2 // устанавливаем бит 2 if(P.x < window.r) code |= 2: // set bit 1 // устанавливаем бит 1 if(P.y < window.b) code |- 1: // set bit 0 // устанавливаем бит О

В отсекателе обе конечные точки - PI и Р2 (см. рис. 3.17) - проверяются относительно окна, и формируются их кодовые слова codel и code2. Затем мы должны проверить их на «тривиальный прием» и «тривиальное отклонение».

О Тривиальный прием. Обе конечные точки находятся внутри окна, поэтому и codel, и code2 равны 0. В С и С++ это легко определяется с помощью побитовой операции OR: тривиальный прием имеет место при равенстве нулю (codel I code2).

О Тривиальное отклонение. Случай тривиального отклонения возникает, если обе конечные точки расположены вне окна по одну и ту же сторону от него: обе слева от окна, обе выше, обе ниже или обе справа. Это условие эквивалентно следующему: коды этих точек имеют по крайней мере одну единицу в той же битовой позиции. Пусть, например, codel - 0110, a code2 - 0100, тогда PI находится выше и правее окна, в то время как Р2 лежит выше окна, но ни правее, ни левее его. Поскольку обе точки располагаются выше окна, ни один отрезок прямой не может находиться внутри окна. Тривиальное отклонение легко проверяется с помощью побитовой операции AND над codel и code2; если каждая из них имеет 1 в той же самой позиции, то (codel & code2) будет отлична от нуля.


⇐ Предыдущая| |Следующая ⇒