mapA = (vp.r - vp.l)/winwid: // fill in mapping values // заполнение величин для преобразования

mapC = vpЛ - map.A * win.l:

mapB = (vp.t - vp.b)/winHt:

mapD = vp.b - map.В * win.b:

}

moveToO и lineTo() с отсечением Подпрограмма moveToO преобразует точку из мировых координат в экранные и затем вызывает специальную подпрограмму Turbo С++ movetoO для обновления внутренних текущих координат, поддерживаемых программной средой. Кроме того, moveToO одновременно обновляет и CP в мировых координатах класса Canvas. Подпрограмма 1 ineToO работает аналогично, однако она сначала должна определить, какая часть отрезка прямой расположена внутри окна (и расположена ли вообще). Для того чтобы выполнить это, она использует функцию clipSegmentO, описанную в разделе «Отсечение линий» и в тематическом задании 3.2, которая возвращает концевые точки fi rst и second лежащей внутри окна части отрезка прямой. Если какая-то часть отрезка расположена в окне, то происходит перемещение к first и рисование прямой до second. clipSegmentO заканчивает свою работу командой movetoO, для гарантии того, что CP класса Canvas и внутренние CP Turbo С++ будут текущими.

В приведенном ниже коде ChopLine и cl ipSegment такие же, как в тематическом задании 3.2:

//««««««< moveTo »>»»»

void Canvas:: moveTo(float x. float y)

{

Глава 3. Дополнительные инструменты для рисования

int sx = (intXmapA * х + mapC):

int sy = (intXmapB * у + mapD);

movetoCsx. sy); // a Turbo С++ routine // подпрограмма Turbo С++

CP.setCx. y):

}

//««««« lineTo »»»

void Canvas:: lineToCfloat x. float y)

{

// Draw a line from CP to (x.y). clipped to the window // Рисуем линию от CP до (x.y). отсеченным по окну

Point2 first = CP; // initial value of first // начальное значение first

Point2 second(x. y): // initial value of second // начальное значение second

if(clipSegment(first. second)) // any part inside?

// находится ли какая-нибудь часть внутри окна? {


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