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 // досрочный выход