double tin -0.0. tOut -1.0:

Vector2 с. tmp:

form vector: с - seg. second - seg.first II формируем вектор: с - seg.second - seg.first

for(int i - 0: i < L.num: i++) // chop at each bounding line // отсекаем на каждой ограничивающей прямой

{

form vector tmp - L.line[i].pt - first II формируем вектор tmp - L.line[i].pt - first

numer - dot(L.1ine[i].norm. tmp):
denom - dot(L.line[i].norm. c):

ifdchopCKtln, tOut numer. denom.)) return 0; // early out // досрочный выход }

// adjust the endpoints of the segment: do second one 1st. // корректируем концевые точки отрезка: // сначала делаем второй

if (tOut < 1.0 ) // second endpoint was altered // вторая концевая точка была изменена

{

seg.second.х - seg.first.х + c.x * tOut: seg.second.у - seg.first.у + су * tOut:

}

if (tin > 0.0) // first endpoint was altered // первая концевая точка была изменена

{

seg.first.х - seg.first.х + c.x * tin: seg.first.у - seg.first.у + су * tin:

}

return 1: // some segment survives // какой-то отрезок остается }

В листинге 4.3 приведен псевдокод алгоритма Сайруса-Бека. Типы LineSegment, LineList и Vector2 являются типами данных, удобными для хранения используемых величин (см. упражнения в конце этого раздела). Переменные numer и denom содержат соответственно числитель и знаменатель выражения для £hit из уравнения (4.59):

numer = п (В - А);

denom = п с. (4.65)

Отметим, что значение seg. second обновляется первым, поскольку нам приходится использовать старое значение seg.first для обновления как seg.first, так и seg.second.

рулонные шторы на деревянные окна.

4.8. Задачи о пересечениях многоугольников Листинг 4.4. Отсечение относительно одной ограничивающей прямой

int chopCKdoubleS tin, doubles tOut. double numer. double denom) {
double tHit:

if (denom < 0) // ray is entering // луч входит

{
tHit - numer / denom;

if(tHit > tOut) return 0: // early out // досрочный выход

else if(tHit > tin) tin = tHit: // take larger t // берем большее t }

else if (denom > 0) // ray is exiting // луч выходит

{
tHit = numer / denom:

if (tHit < tin) return 0: // early out // досрочный выход


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