Матрица поворота в двумерном пространстве. Представление матриц поворота через углы эйлера Свойства матрицы поворота

Матрицей поворота (или матрицей направляющих косинусов) называется ортогональная матрица, которая используется для выполнения собственного ортогонального преобразования в евклидовом пространстве. При умножении любого вектора на матрицу поворота длина вектора сохраняется. Определитель матрицы поворота равен единице.
Обычно считают, что, в отличие от матрицы перехода при повороте системы координат (базиса), при умножении на матрицу поворота вектора-столбца координаты вектора преобразуются в соответствии с поворотом самого вектора (а не поворотом координатных осей; то есть при этом координаты повернутого вектора получаются в той же, неподвижной системе координат). Однако отличие той и другой матрицы лишь в знаке угла поворота, и одна может быть получена из другой заменой угла поворота на противоположный; та и другая взаимно обратны и могут быть получены друг из друга транспонированием.

Матрица поворота в трёхмерном пространстве

Любое вращение в трехмерном пространстве может быть представлено как композиция поворотов вокруг трех ортогональных осей (например, вокруг осей декартовых координат). Этой композиции соответствует матрица, равная произведению соответствующих трех матриц поворота.
Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве являются:
Вращение вокруг оси x:

Вращение вокруг оси y:

Вращение вокруг оси z:

После преобразований мы получаем формулы:
По оси Х
x’=x;
y’:=y*cos(L)+z*sin(L) ;
z’:=-y*sin(L)+z*cos(L) ;


По оси Y
x’=x*cos(L)+z*sin(L);
y’=y;
z’=-x*sin(L)+z*cos(L);


По оси Z
x’=x*cos(L)-y*sin(L);
y’=x*sin(L)+y*cos(L);
z’=z;


Все три поворота делаются независимо друг от друга, т.е.

если надо повернуть вокруг осей Ox и Oy, вначале делается поворот вокруг оси Ox, потом применительно к полученной точки делается поворот вокруг оси Oy.

Положительным углам при этом соответствует вращение вектора против часовой стрелки в правой системе координат, и по часовой стрелке в левой системе координат, если смотреть против направления соответствующей оси. Правая система координат связана с выбором правого базиса (см. правило буравчика).

Геометрические преобразования в трёхмерном пространстве

Переход из одной прямолинейной координатной системы в трёхмерном пространстве к другой описывается в общем случае следующим образом:

или в матричном виде:

Рассмотрим матрицы, соответствующие следующим базовым геометрическим преобразованиям:

1. Повороты

2. Растяжение (сжатие):

3. Отражение (зеркалирование)

  • относительно плоскости XOY

  • относительно плоскости YOZ

  • относительно плоскости ZOX

4. Перенос (сдвиг, перемещение) на вектор

Важно: преобразование точки (с сохранением расположения исходной системы координат) соответствует выполнению обратной операции по отношению к преобразованию системы координат. Например, поворот точки на некоторый угол по часовой стрелке вокруг оси X соответствует повороту системы координат против часовой стрелки на тот же угол.

Все остальные преобразования, кроме вышеперечисленных, относятся к сложным преобразованиям. Матрицы сложных преобразований получаются при помощи нахождения произведения матриц, соответствующих базовым геометрическим преобразованиям, которые необходимо осуществить для получения искомого сложного преобразования (*-умножение производится строго в том порядке, в котором эти базовые преобразования производятся, т.к. преобразования некоммутативны).

В качестве примера рассмотрим сложное преобразование, заключающееся во вращении на угол вокруг прямой, проходящей через точку T(X, Y, Z) и имеющую направляющий вектор V(l, m, n) , причемl 2 +m 2 +n 2 =1 , т.е. вектор V является единичным.

Необходимо разложить преобразование на ряд элементарных шагов (базовых преобразований).

Цель: развернем систему координат так, чтобы ось Z совпала с V , после чего поворот на угол будет возможно произвести путем осуществления базового преобразования — поворота на этот угол вокруг оси Z .

Для достижения этой цели выполним следующую последовательность базовых преобразований:

Перспективное изображение возникает при центральном проецировании, т.е. когда центр проецирования (глаз наблюдателя) находится на конечном расстоянии от экрана.

Матрица перспективного преобразования с проецированием на плоскость XOY :

,
где С(0, 0, c) — точка расположения наблюдателя (центр проецирования). Плоскость проецирования, т.е. экран, совпадает с координатной плоскостью XOY .

3.2. Трехмерные преобразования и проекции

Рассмотрим трехмерную декартовую систему координат, являющуюся правосторонней .

Матрица вращения

Примем соглашение, в соответствии с которым будем считать положительными такие повороты, при которых (если смотреть с конца полуоси в направлении начала координат) поворот на 90° против часовой стрелки будет переводить одну полуось в другую. На основе этого соглашения строится следующая таблица, которую можно использовать как для правых, так и для левых систем координат:

Рис. 3.6. Трехмерная система координат

Аналогично тому, как точка на плоскости описывается вектором (x,y ), точка в трехмерном пространстве описывается вектором (x,y,z ).

Как и в двухмерном случае, для возможности реализаций трехмерных преобразований с помощью матриц перейдем к однородным координатам:

[x,y,x ,1] или [X,Y,Z,H ]

[x*,y*,z* 1] = , где Н ¹1, Н ¹0.

Обобщенная матрица преобразования 4´4 для трехмерных однородных координат имеет вид

е. [x,y,z, 1]*T(Dx,Dy,Dz)= [x+Dx,y+Dy,z+Dz, 1].

2. Трехмерное изменение масштаба.

Рассмотрим частичное изменение масштаба. Оно реализуется следующим образом:

Такой же результат можно получить при равных коэффициентах частичных изменений масштабов. В этом случае матрица преобразования такова:

4. Трехмерное вращение

Двухмерный поворот, рассмотренный ранее, является в то же время трехмерным поворотом вокруг оси Z . В трехмерном пространстве поворот вокруг оси Z описывается матрицей

R z ()=

Матрица поворота вокруг оси X имеет вид

Подматрицу 3´3 называют ортогональной, так как ее столбцы являются взаимно ортогональными единичными векторами.

Матрицы поворота сохраняют длину и углы, а матрицы масштабирования и сдвига нет.

скачать

Реферат на тему:

Матрица поворота

План:

    Введение
  • 1Матрица поворота в двумерном пространстве
  • 2Матрица поворота в трёхмерном пространстве
  • 3Свойства матрицы поворота
  • Литература

Введение

Матрицей поворота (или матрицей направляющих косинусов ) называется матрица, умножение любого вектора на которую не меняет его длины.

1.

Матрица вращения

Матрица поворота в двумерном пространстве

В двумерном пространстве поворот можно описать одним углом θ со следующей матрицей линейного преобразования в декартовой системе координат:

Положительным углам при этом соответствует вращение против часовой стрелки в обычной, правосторонней системе координат, и по часовой в левосторонней системе координат.

Сам поворот происходит путём умножения матрицы поворота на вектор, описывающий вращаемую точку:

.

2. Матрица поворота в трёхмерном пространстве

Матрицами вращения вокруг оси декартовой правой системы координат на угол α в трёхмерном пространстве являются:

, , ,

В трёхмерном пространстве для описания поворота можно использовать


Матрицы поворота вектора в декартовой системе координат, соответствующие первым двум способам задания поворота:

Однако, поскольку умножение матриц не коммутативно, то есть: , следовательно, положение системы координат после поворота вокруг трех осей будет зависеть от последовательности поворотов, то существует 6 различных видов матрицы поворота:

  • 1) Поворот около осей: X -> Y -> Z
  • 2) Соответственно: X -> Z -> Y
  • 3) Y -> X -> Z
  • 4) Y -> Z -> X
  • 5) Z -> X -> Y
  • 6) Z -> Y -> X

Получить же нужную матрицу можно путем последовательного перемножения матриц поворота около одной оси (приведенных выше) в соответствии с желаемым порядком.

3. Свойства матрицы поворота

Если - матрица, задающая поворот вокруг оси на угол φ, то:

Литература

8.1.1. Преобразование координат в трехмерном пространстве.

B основе программ аффинных преобразований пространственных объектов, а также их про­е­ци­ро­ва­ния на картинную плоскость лежит аппарат однородных координат (см., на­при­мер, СПИСОК ЛИТЕРАТУРЫ). При этом все необходимые для построения проекции и установления нуж­ного ракурса преобразования координат описыва­ются матрицами размером 4 ´ 4 и пред­став­ля­ются в виде суперпозиции некоторых основных преобразований: переноса точки в пространстве на фиксированный вектор, поворота вокруг указанной оси на задан­ный угол, масштабирования вдоль какой-либо оси, сдвига, перспек­тивы и про­е­ци­ро­ва­ния на одну из главных координатных плоскос­тей.


Рис.8.1. Декартова система координат, проекция P’ точки P на плоскость XZ, сетка, на которой задана поверхность, и сечения, параллельные плоскостям XZ и YZ.

Основные преобразования координат. Pассмотрим некоторую декартову систему координат (рис.8.1). Любая точка пространства представляется в ней вектор-матрицей вида (х у z). Mы будем пользоваться однородными координатами точки в пространстве (х у z 1).

B качестве картинной плоскости выберем плоскость XZ, описы­ваемую уравнением Y = 0. Проекция точки объекта на эту плоскость получается в результате умножения (х у z 1) ×A, где

задает преобразование проецирования на плоскость XZ.

Поворот вокруг заданной оси (X, Y и Z соответственно) на указанный угол a описываются следующими матрицами:

где а = sin a, b = соs a. Положительным считается поворот в направлении против часовой стрелки, если смотреть с конца оси, вокруг которой поворачивается объект.

Mатрицы преобразований переноса на фиксированный вектор и масштабирования имеют следующий вид:

Здесь (t x , t y , t z) – вектор переноса; s x , s y , s z — масштабные множители вдоль осей X, Y и Z соответственно, 1/s – множитель общего масштабирования.

Сдвиг заключается в том, что одна из координат точки (зави­симая координата) изменяется на величину, пропорциональную одной из двух оставшихся координат (сдвигающей координате). Пусть зависимой координатой будет координата X, а сдвигающей – коорди­ната Y, тогда матрица сдвига будет иметь вид:

где F – коэффициент сдвига. Проекцию точек объекта на плоскость XZ из центра проекции C можно получить с помощью преобразования центрального проецирования. Eго матрица:

Здесь центр проекции лежит на оси Y и имеет Y-координату, равную (-H), где H > 0 (см. рис.8.1).

C помощью основных преобразований координат можно получить практически произвольные плоские геометрические проекции.

Pассмотрим сначала случай параллельного проецирования. В за­висимости от того, какой угол образует направление проецирования с картинной плоскостью, параллельные проекции делятся на прямоу­гольные (например, аксонометрические проекции) и косоугольные. B случае прямоугольных проекций направление проецирования пер­пендикулярно картинной плоскости. В случае косоугольных проекций направление проецирования образует с картинной плоскостью угол, отличный от прямого. Более подробные сведения об этих типах про­екций можно найти, например, в СПИСОК ЛИТЕРАТУРЫ.

Более общие аксонометрические проекции можно получить с по­мощью двух последовательных поворотов объекта (сначала вокруг оси Z на некоторый угол Az, а потом вокруг оси X на угол Aх) и затем ортогонального проецирования на плоскость XZ. Для двух наиболее распространенных типов аксонометрических проекций — изометрии и диметрии — углы поворота имеют следующие значения: Az = -45 ° , Aх = 35 ° и Az = -20 ° , Aх = 20 ° .

Hа рис.8.2 приведены примеры изометрической и диметрической проекций одной и той же поверхности, показано также как при этом проецируются на картинную плоскость оси декартовой системы коор­динат.

Для построения косоугольных проекций удобно воспользоваться преобразованием сдвига. Одну из косоугольных проекций, например, можно построить следующей последовательностью преобразований:

1. сдвиг, в котором зависимой осью является ось X, сдвигаю­щей осью — ось Y; коэффициент сдвига F = 1 в случае, если задана «положительная» проекция (рис.8.3, б), и F = -1, если требуется «отрицательная» проекция (рис.8.3, а);

2. сдвиг, в котором зависимой является ось Z, сдвигающей — ось Y и коэффициент сдвига F = 1;

3. проецирование на плоскость XZ.

B случае если ни одна из упомянутых стандартных параллельных проекций (изометрия, ди­мет­рия и косоугольная проекция) по ка­ким-либо причинам не устраивает, можно пос­тро­ить требуемую про­екцию с помощью переноса, поворота, масштабирования и сдвига.

Используя эти преобразования, можно также расположить нужным образом изо­бра­жа­е­мый объект в пространстве и затем построить какую-либо стандартную проекцию.


Рис.8.2. Диметрическая и изометрическая проекции поверхности, а также осей декартовой системы координат.

C помощью основных преобразований координат легко также фор­мируется преобразование, которое позволит получать центральную проекцию объекта из произвольного центра проекции на плоскость, проходящую через начало координат перпендикулярно лучу зрения. Параллельная проекция тоже может быть задана по-другому — вектором направления проецирования, начало которого лежит в точ­ке (0,0,0), а конец определяется программистом.

Tаким образом, для построения произвольной проекции графи­ческого объекта достаточно сформировать матрицу преобразования, являющегося суперпозицией перечисленных выше основных преобразо­ваний координат. Умножая матрицу координат произвольной точки справа на матрицу результирующего преобразования, получим коор­динаты проекции этой точки на картинную плоскость в соответствии с выбранным способом проецирования.


Рис.8.3. «Отрицательная» (а) и «положительная» (б) косоуголь­ные проекции поверхности, а также осей осей декартовой системы координат.

Далее описаны программы, реализующие основные преобразования координат, некоторые стандартные типы проекций, а также другие средства, необходимые для построения произвольных плоских гео­метрических проекций объектов.

Программы преобразований. Чтобы построить желаемую проекцию трехмерного объекта, нужно задать соответствующее преобразова­ние.

Программы, определяющие преобразования, являются по сути установочными. Последовательность обращений к ним задает резуль­тирующее преобразование, соответствующее некоторому способу проецирования. Программы рисования будут использовать подготов­ленную матрицу преобразования для изображения объектов в выбран­ной проекции.

Kаждая из программ, устанавливающих свое преобразование, формирует матрицу раз­ме­ром 4 ´ 4 и умножает ее слева на матрицу текущего преобразования. B результате преобразования будут выполняться в том порядке, в котором они задавались. Hачальные ус­та­нов­ки выполняет программа INIT, которая формирует единичную матрицу. Обращение к ней отменяет уже накопленное преобразова­ние. Очевидно, когда требуется получить но­вое результирующее преобразование, необходимо начинать с обращения к этой програм­ме.

Получать некоторые стандартные проекции графических объектов позволяют программы ISOMET, DIMET, CABIN, VIEW, AXONOM. Однако иногда необходимо предварительно преобразовать объект (располо­жить некоторым образом в пространстве). Для этой цели можно вос­пользоваться программами, задающими поворот, растяжение, пере­нос, сдвиг. Это программы: TDROT, TDSCAL, TDTRAN, SHEAR.

Любое текущее преобразование можно сохранить (программа SAVETR) и при желании восстановить (программа SETTR). Bообще с помощью программы SETTR можно установить в качестве текущего преобразования произвольное преобразование, расширив тем самым круг основных преобразований координат.

Программа INIT производит инициализацию результирующего преобразования. Программа без параметров.

Программа TDTRAN(DX, DY, DZ) задает перенос объекта в про­странстве от­но­си­тель­но начала координат. Параметры программы DX,DY, DZ определяют вектор пе­ре­но­са.

Программа TDROT(NAXES,ALPHA) задает поворот системы коорди­нат относительно указанной оси на заданный угол. Eе параметры:

NAXES номер оси, относительно которой выполняется поворот: Кроме того, если NAXES < 0, угол поворота считается заданным в радиа­нах, NAXES > 0 — в градусах; ALPHA угол поворота: ALPHA > 0 — поворот выполняется против часовой стрелки, относительно оси, вокруг которой выполняется поворот; ALPHA < 0 — поворот выполняется по часовой стрелке.

Программа TDSCAL(NAXES,SCALE) позволяет выполнить растяжение (сжатие) вдоль ука­зан­ной оси и, возможно, симметричное отражение объекта. Параметры программы сле­ду­ю­щие:

NAXES номер оси, вдоль которой выполняется растяжение (сжатие): SCALE коэффициент растяжения (сжатия): SCALE ³ 1 — растяжение в SCALE раз, SCALE О (0,1) — сжатие в 1/SCALE раз, SCALE < 0 симметричное отражение относительно соответству­ющей координатной плоскости или начала координат и растяжение в |SCALE| раз или сжатие в 1/|SCALE| раз.

Программа SHEAR(I,J,F) определяет сдвиг. Параметры про­граммы:

I номер сдвигающей координаты: J номер зависимой координаты; F коэффициент сдвига.

При I = J данное преобразование вырождается в преобразование масштабирования вдоль I-ой оси с коэффициентом растяжения равным (F+1).

Программа ISOMET формирует матрицу результирующего преобра­зования для по­лу­че­ния изометрической проекции с учетом текущего преобразования.

6.Перенос и повороты в трехмерном пространстве.

Программа без па­ра­мет­ров.

Программа DIMET позволяет сформировать матрицу результирую­щего пре­об­ра­зо­ва­ния для получения диметрической проекции с уче­том текущего преобразования. Прог­рам­ма без параметров.

Программа CABIN(J) позволяет сформировать матрицу результи­рующего преобразования для получения косоугольной проекции с учетом текущего преобразования. Параметр программы J определяет вид косоугольной проекции. При J = 1 получается положительная проекция, а при J = -1 — отрицательная проекция.

Программа VIEW(X,Y,Z) позволяет сформировать матрицу цент­рального проецирования на плоскость, перпендикулярную лучу зре­ния. Параметры программы:

X,Y,Z координаты центра проекции (точки зрения).

Изменяя координаты точки зрения можно получать различные проекции объекта. Для получения нужного ракурса иногда бывает удобнее перемещать в пространстве сам объект, оставляя центр проекции неподвижным. Этого можно достичь обращением к програм­мам TDROT и TDTRAN (до вызова программы VIEW).

При обращении к программе VIEW надо следить, чтобы центр проекции не оказался внутри изображаемого объекта, иначе резуль­таты работы программы рисования THREED будут непредсказуемы.

Программа AXONOM(X,Y,Z) формирует матрицу результирующего преобразования для получения аксонометрической проекции с учетом текущего преобразования. Hаправление проецирования определяется вектором, соединяющим точку (X,Y,Z) с началом координат.

A одномерный массив длины 16.

Программа SETTR(A) позволяет занести в матрицу текущего преобразования содержимое заданного массива A. Предполагается, что в массиве A последовательно записаны столбцы матрицы разме­ром 4 ´ 4.

Bспомогательные и служебные программы.

Программа HCUNIT(A) формирует единичную матрицу A размером 4 ´ 4.

Программа HCMULT(A,B) перемножает две квадратные матрицы четвертого порядка A ´B. Pезультат помещается на место матрицы A.

Программа HCPRSP(H) реализует преобразование центрального проецирования. Параметр H задает Y-координату центра проекции, расположенного на оси Y (H > 0).

Программа HCINV(X,Y,Z,XP,YP,ZP) вычисляет координаты (XP,YP,ZP) центра проекции с учетом обратного преобразования координат. Предварительно вычисляется матрица обратного преобра­зования.

Программа HCROT1(X,Y,Z) позволяет найти результирующее преобразование, переводящее двумя последовательными поворотами точку A(X,Y,Z) в точку с координатами .

Для пересчета векторов сил, моментов и т. д. из одной системы координат в другую необходимо вычислить матрицу перехода, элементами которой являются косинусы углов между осями исходной и повернутой систем координат. Эта матрица определяется последовательностью углов поворота, которые позволяют перейти от одной системы координат к другой. Осуществление такого перехода требует не больше трех поворотов системы координат. Выбор последовательности углов поворота обычно определяется физическим содержанием задачи. Эго могут быть углы, измеряемые с помощью приборов системы управления, углы, от которых зависят аэродинамические нагрузки и т. д.

В качестве примера рассмотрим расчет матрицы направляющих косинусов углов между осями начальной стартовой (инерциальной) 0о,х/„_у/„2/„ и связанной Охуг систем координат. Пусть начала обеих систем совпадают. Первый поворот осуществляется на угол ф вокруг инерциальной оси Оо,у7„ (рис. 1.5). Второй поворот происходит вокруг промежуточной оси 0(),2" на угол д. Наконец, третий поворот выполняется вокруг связанной оси Ох на угол 7. Таким образом, в результате

Рис. 1.5. Переход от стартовой системы координат к связанной последовательных поворотов на углы ф, д, 7 происходит переход от начальной стартовой системы координат Оок связанной Оху г (рис. 1.5). Именно эти углы обычно измеряются с помощью датчиков системы управления.

Рис. 1.6. Последовательные повороты на углы ф, &, 7

Угол ф между проекцией продольной оси ЛА Ох на плоскость Оо?х/„г 1 начальной стартовой системы координат и осью Оо,.т/„ называют углом рыскания. Угол д между продольной осью ЛА и плоскостью Оо/Л7„2/„ называют углом тангажа. Угол 7 между связанной осью Оу и плоскостью Оо?ху" называют углом крена. Эти углы, чаще всего используемые в задачах баллистики, отличаются от соответствующих углов, определяемых согласно ГОСТ’у 20058-74 в инерциальной системе координат, связанной с местной вертикалью.

Элементы матрицы направляющих косинусов представляют собой соответствующие проекции единичных векторов /, /, к, направленных по связанным осям, на начальные стартовые оси. Непосредственное вычисление указанных проекций достаточно сложно, поэтому предварительно рассмотрим матрицы перехода, порождаемые отдельными поворотами на углы ф, г), 7. Согласно изложенной методике, будем каждый раз проектировать единичные векторы, направленные по осям повернутой системы координат, на оси исходной системы координат (рис. 1.6). Тогда достаточно просто вычисляются матрицы направляющих косинусов, соответствующие последовательным поворотом на углы ф, д, 7:

Согласно рассматриваемому преобразованию системы координат, матрица направляющих косинусов, отвечающая переходу от начальной стартовой к связанной системе координат, будет вычисляться как произведение отдельных матриц:

Производя перемножение матриц, получим

Если в начальной стартовой системе координат задан некоторый вектор своими составляющими

то составляющие этого вектора в связанной системе координат

можно вычислить с помощью матрицы Ь: или

Формула (1.2.2) определяет преобразование вектора из начальной стартовой в связанную систему координат.

Переход от связанной к начальной стартовой системе координат производится с помощью обратной матрицы L~ l (или транспонированной матрицы // в силу ортонормированности матрицы L):

Пользуясь указанным способом, можно найти матрицу перехода от скоростной системы координат к связанной. При этом ограничимся случаем, когда ЛА имеет плоскость симметрии, а ориентация вектора скорости задается углами атаки а и скольжения ?3:

Пересчет произвольного вектора a v , заданного в скоростной системе координат своими составляющими

в связанную систему координат осуществляется по формуле

Таким образом, при заданных углах, определяющих положение одной системы координат по отношению к другой, всегда можно вычислить матрицу перехода как произведение отдельных матриц, отвечающих последовательным поворотам на эти углы.

В двумерном пространстве поворот можно описать одним углом со следующей матрицей линейного преобразования в декартовой системе координат:

Поворот выполняется путём умножения матрицы поворота на вектор-столбец, описывающий вращаемую точку:

.

Координаты (x",y") в результате поворота точки (x,y) имеют вид:

Положительным углам при этом соответствует вращение вектора против часовой стрелки в обычной, правосторонней системе координат, и по часовой стрелке в левосторонней системе координат.

[править] Матрица поворота в трёхмерном пространстве

Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве являются:

· Вращение вокруг оси x:

,

· Вращение вокруг оси y:

,

· Вращение вокруг оси z:

.

Положительным углам при этом соответствует вращение вектора против часовой стрелки в правой системе координат, и по часовой стрелке в левой системе координат, если смотреть на плоскость вращении со стороны полупространства, где значения координат оси, вокруг которой осуществляется поворот, положительные. Правая система координат связана с выбором правого базиса (см. правило буравчика).

Свойства матрицы поворота.

Свойства матрицы поворота

Если - матрица, задающая поворот вокруг оси на угол ϕ, то:

· (след матрицы вращения)

· (матрица имеет единичный определитель).

· если строки (или столбцы матрицы) рассматривать как координаты векторов , то верны следующие соотношения):

o

· Матрица обратного поворота получается обычным транспонированием матрицы прямого поворота, т. о. .

24. Алгоритм Брезенхема для растеризации отрезка.

Алгоритм Брезенхе́ма (англ. Bresenham"s line algorithm ) - это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками. Это один из старейших алгоритмов в машинной графике - он был разработан Джеком Е. Брезенхэмом (Jack E. Bresenham) в компании IBM в 1962 году. Алгоритм широко используется, в частности, для рисования линий на экране компьютера. Существует обобщение алгоритма Брезенхэма для построения кривых 2-го порядка.

Алгоритм

Отрезок проводится между двумя точками - (x 0 ,y 0) и (x 1 ,y 1), где в этих парах указаны колонка и строка, соответственно, номера которых растут вправо и вниз. Сначала мы будем предполагать, что наша линия идёт вниз и вправо, причём горизонтальное расстояние x 1 − x 0 превосходит вертикальное y 1 − y 0 , т.е. наклон линии от горизонтали - менее 45°. Наша цель состоит в том, чтобы для каждой колонки x между x 0 и x 1 , определить, какая строка y ближе всего к линии, и нарисовать точку (x ,y ).

Общая формула линии между двумя точками:

Поскольку мы знаем колонку x , то строка y получается округлением к целому следующего значения:

Однако, вычислять точное значение этого выражения нет необходимости. Достаточно заметить, что y растёт от y 0 и за каждый шаг мы добавляем к x единицу и добавляем к y значение наклона

которое можно вычислить заранее. Более того, на каждом шаге мы делаем одно из двух: либо сохраняем тот же y , либо увеличиваем его на 1.

Что из этих двух выбрать - можно решить, отслеживая значение ошибки , которое означает - вертикальное расстояние между текущим значением y и точным значением y для текущего x . Всякий раз, когда мы увеличиваем x , мы увеличиваем значение ошибки на величину наклона s , приведённую выше. Если ошибка превысила 0.5, линия стала ближе к следующему y , поэтому мы увеличиваем y на единицу, одновременно уменьшая значение ошибки на 1. В реализации алгоритма, приведённой ниже, plot(x,y) рисует точку, а abs возвращает абсолютную величину числа:

function line(x0, x1, y0, y1) int deltax:= abs(x1 - x0) int deltay:= abs(y1 - y0) real error:= 0 real deltaerr:= deltay / deltax int y:= y0 for x from x0 to if error >= 0.5 y:= y + 1 error:= error - 1.0

Проблема такого подхода - в том, что с вещественными величинами, такими как error и deltaerr, компьютеры работают относительно медленно. Кроме того, при вычислениях с плавающей точкой может накапливаться ошибка. По этим причинам, лучше работать только с целыми числами. Это можно сделать, если умножить все используемые вещественные величины на deltax. Единственная проблема - с константой 0.5 - но в данном случае достаточно умножить обе части неравенства на 2. Получаем следующий код:

function line(x0, x1, y0, y1) int deltax:= abs(x1 - x0) int deltay:= abs(y1 - y0) int error:= 0 int deltaerr:= deltay int y:= y0 for x from x0 to x1 plot(x,y) error:= error + deltaerr if 2 * error >= deltax y:= y + 1 error:= error - deltax

Умножение на 2 для целых чисел реализуется битовым сдвигом влево.

Теперь мы можем быстро рисовать линии, направленные вправо-вниз с величиной наклона меньше 1. Осталось распространить алгоритм на рисование во всех направлениях. Это достигается за счёт зеркальных отражений, т.е. заменой знака (шаг в 1 заменяется на -1), обменом переменных x и y , обменом координат начала отрезка с координатами конца.

[править] Рисование линий

Реализация на C++:

Void drawLine(int x1, int y1, int x2, int y2){ int deltaX = abs(x2 - x1); int deltaY = abs(y2 - y1); int signX = x1 < x2 ? 1: -1; int signY = y1 < y2 ? 1: -1; int error = deltaX - deltaY; for (;;) { setPixel(x1, y1); if(x1 == x2 && y1 == y2) break; int error2 = error * 2; if(error2 > -deltaY) { error -= deltaY; x1 += signX; } if(error2 < deltaX) { error += deltaX; y1 += signY; } }}

25. Алгоритм Брезенхема для растеризации окружности.

Рисование окружностей

Также существует алгоритм Брезенхэма для рисования окружностей. По методу построения он похож на рисование линии. В этом алгоритме строится дуга окружности для первого квадранта, а координаты точек окружности для остальных квадрантов получаются симметрично. На каждом шаге алгоритма рассматриваются три пикселя, и из них выбирается наиболее подходящий путём сравнения расстояний от центра до выбранного пикселя с радиусом окружности.

// R - радиус, X1, Y1 - координаты центра int x:= 0 int y:= R int delta:= 2 - 2 * R int error:= 0 while (y >= 0) drawpixel(X1 + x, Y1 + y) drawpixel(X1 + x, Y1 - y) drawpixel(X1 - x, Y1 + y) drawpixel(X1 - x, Y1 - y) error = 2 * (delta + y) - 1 if ((delta < 0) && (error <= 0)) delta += 2 * ++x + 1 continue error = 2 * (delta - x) - 1 if ((delta > 0) && (error > 0)) delta += 1 - 2 * --y continue x++ delta += 2 * (x - y) y--

Void drawCircle(int x0, int y0, int radius) { int x = 0; int y = radius; int delta = 2 - 2 * radius; int error = 0; while(y >= 0) { setPixel(x0 + x, y0 + y); setPixel(x0 + x, y0 - y); setPixel(x0 - x, y0 + y); setPixel(x0 - x, y0 - y); error = 2 * (delta + y) - 1; if(delta < 0 && error <= 0) { ++x; delta += 2 * x + 1; continue; } error = 2 * (delta - x) - 1; if(delta > 0 && error > 0) { --y; delta += 1 - 2 * y; continue; } ++x; delta += 2 * (x - y); --y; }}

Алгоритм сглаживания Ву.

Алгоритм Ву - это алгоритм разложения отрезка в растр со сглаживанием. Был предложен У Сяолинем (Xiaolin Wu , отсюда устоявшееся в русском языке название алгоритма) в статье, опубликованной журналом Computer Graphics в июле 1991 года. Алгоритм сочетает высококачественное устранение ступенчатости и скорость, близкую к скорости алгоритма Брезенхема без сглаживания.

Алгоритм

Горизонтальные и вертикальные линии не требуют никакого сглаживания, поэтому их рисование выполняется отдельно. Для остальных линий алгоритм Ву проходит их вдоль основной оси, подбирая координаты по неосновной оси аналогично алгоритму Брезенхема. Отличие состоит в том, что в алгоритме Ву на каждом шаге устанавливается не одна, а две точки. Например, если основной осью является Х , то рассматриваются точки с координатами (х, у) и (х, у+1) . В зависимости от величины ошибки, которая показывает как далеко ушли пиксели от идеальной линии по неосновной оси, распределяется интенсивность между этими двумя точками. Чем больше удалена точка от идеальной линии, тем меньше ее интенсивность. Значения интенсивности двух пикселей всегда дают в сумме единицу, то есть это интенсивность одного пикселя, в точности попавшего на идеальную линию. Такое распределение придаст линии одинаковую интенсивность на всем ее протяжении, создавая при этом иллюзию, что точки расположены вдоль линии не по две, а по одной.

Результат работы алгоритма

Реализация в псевдокоде (только для линии по x):

function plot(x, y, c) is // рисует точку с координатами (x, y) // и яркостью c (где 0 ≤ c ≤ 1) function ipart(x) is return целая часть от x function round(x) is return ipart(x + 0.5) // округление до ближайшего целого function fpart(x) is return дробная часть x function draw_line(x1,y1,x2,y2) is if x2 < x1 then swap (x1, x2) swap (y1, y2) end if dx:= x2 - x1 dy:= y2 - y1 gradient:= dy ÷ dx // обработать начальную точку xend:= round(x1) yend:= y1 + gradient × (xend - x1) xgap:= 1 - fpart(x1 + 0.5) xpxl1:= xend ypxl1:= ipart(yend) plot(xpxl1, ypxl1, 1 - fpart(yend) × xgap) plot(xpxl1, ypxl1 + 1, fpart(yend) × xgap) intery:= yend + gradient // первое y-пересечение для цикла // обработать конечную точку xend:= round(x2) yend:= y2 + gradient × (xend - x2) xgap:= fpart(x2 + 0.5) xpxl2:= xend // будет использоваться в основном цикле ypxl2:= ipart(yend) plot(xpxl2, ypxl2, 1 - fpart(yend) × xgap) plot(xpxl2, ypxl2 + 1, fpart(yend) × xgap) // основной цикл for x from xpxl1 + 1 to xpxl2 - 1 do plot(x, ipart(intery), 1 - fpart(intery)) plot(x, ipart(intery) + 1, fpart(intery)) intery:= intery + gradient repeatend function

26. Алгоритмы закрашивания.

Алгоритм закрашивания

Алгоритм закрашивания очень часто используется в компьютерной графике для закрашивания фигур имеющих границы. Так же этот алгоритм может иметь и другое применение например его можно использовать для нахождения центра масс тела по его изображению.

Алгоритмы двумерной растровой графики: закрашивание

Рассмотрим алгоритмы закрашивания произвольного контура, который уже нарисован в растре. Сначала находится пиксель внутри контура фигуры. Цвет этого пикселя изменяем на нужный цвет заполнения. Потом проводится анализ цвета всех соседних пикселей. Если цвет некоторого соседнего пикселя не равен цвету границы контура или цвету заполнения, то цвет этого пикселя изменяется на цвет заполнения.

Простое рекурсивное заполнение.

Procedure PixelFill (x, y, BColor, Color: Integer);

{x, y – координаты затравочной точки, BColor – цвет границы,

Color – цвет заполнения}

C:=GetPixel (x,y) {анализируем текущий цвет пикселя}

if (C<>BColor) and (C<>Color) then

PutPixel (x, y, Color);

PixelFill (x+1, y, BColor, Color);

PixelFill (x, y+1, BColor, Color);

PixelFill (x-1, y, BColor, Color);

PixelFill (x, y-1, BColor, Color);

Этот алгоритм не оптимизирован относительно использования стековой памяти и является одним из самых медленных алгоритмов закрашивания (в среднем только один из четырёх вызовов используется для закрашивания). Алгоритм не может заполнить области, ограниченные цветом заполнения. Можно построить подобный алгоритм и без рекурсии, если вместо стека использовать массивы.

Алгоритм закрашивания линиями.

1. Имеется затравочная точка с координатами (x st , y st) и начальное направление действия рекурсивных вызовов dir=1 . Параметры левой и правой границы вначале совпадают с координатой затравочной точки: x PL = x st , x PR = x st . Вызывается процедура LineFill , в которой:

2. Находятся x L и x R – левая и правая границы, между которыми проводится текущая горизонтальная линия.

3. Делается приращение у=у+dir и, между x L и x R , анализируется цвет пикселей над линией. Если он не совпадает с цветом заполнения, процедура LineFill вызывается рекурсивно с dir = 1 и x PL = x L , x LR = x R .

4. Делается приращение y=y–dir и, начиная от x L до предыдущего значения x PL анализируется цвет пикселей под линией. Если цвет пикселя отличается от цвета заполнения, процедура вызывается рекурсивно с dir = –1 и x PL = x L , x PR = x R .

5. Продолжая по той же горизонтали от предыдущего x PR до x R анализируется цвет под линией. Если цвет какого-либо пикселя отличается от цвета заполнения, процедура вызывается рекурсивно с dir = –1 и x PL = x L , x PR = x R .
Ниже приведен пример реализации этого алгоритма на языке С++:

void LineFill (int x, int y, int dir, int xPL, int xPR)

// в этой переменной будет храниться цвет пикселя

// УСТАНАВЛИВАЕМ ТЕКУЩИЕ ГРАНИЦЫ xL И xR

color = GetPixel (--xL,y);

// xL=xL-1 помещается в вызов функции

while (color != bcolor); // bcolor – цвет границы

color = GetPixel (++xR,y);

while (color !=bcolor);

Line (xL,y, xR,y, Mycolor);

//это может быть любая функция рисования линии

// АНАЛИЗИРУЕМ ПИКСЕЛИ НАД ЛИНИЕЙ

for (x=xL; x<=xR; x++) {

color = GetPixel (x, y+dir);

if (color !=bcolor)

x = LineFill (x, y+dir, dir, xL, xR);

// АНАЛИЗИРУЕМ ПИКСЕЛИ ПОД ЛИНИЕЙ СЛЕВА

for (x=xL; x<=xPL; x++) {

color = GetPixel (x, y-dir);

if (color !=bcolor)

// АНАЛИЗИРУЕМ ПИКСЕЛИ ПОД ЛИНИЕЙ СПРАВА

for (x=xPR; x<=xR; x++) {

color = GetPixel (x, y-dir);

if (color !=bcolor)

x = LineFill (x, y–dir, –dir, xL, xR);

В программах функция LineFill вызывается следующим образом:

LineFill (xst, yst, 1, xst, xst);

Совершенно очевидно, что существуют и другие эффективные алгоритмы заполнения. Например, алгоритмы заполнения, которые используют математическое описание контура, связаны с конкретной формой того полигона, который должен быть заполнен (например, прямоугольник или окружность). При этом контур может совсем не выводиться в растр. При этом в качестве заполнения легко использовать какую-либо текстуру.

27. Алгоритм отсечения отрезка Сазерленда-Коэна.

Алгоритм Коэна - Сазерленда (англ. Cohen-Sutherland ) - алгоритм отсечения отрезков, то есть алгоритм, позволяющий определить часть отрезка, которая пересекает прямоугольник. Был разработан Дэном Коэном и Айвеном Сазерлендом в Гарварде в 1966-1968 гг., и опубликован на конференции AFIPS в 1968.

Описание алгоритма

Алгоритм разделяет плоскость на 9 частей прямыми, которые образуют стороны прямоугольника. Каждой из 9 частей присваивается четырёхбитный код. Биты (от младшего до старшего) значат «левее», «правее», «ниже», «выше». Иными словами, у тех трёх частей плоскости, которые слева от прямоугольника, младший бит равен 1, и так далее.

Алгоритм определяет код конечных точек отрезка. Если оба кода равны нулю, то отрезок полностью находится в прямоугольнике. Если битовое И кодов не равно нулю, то отрезок не пересекает прямоугольник (т.к. это значит, что обе конечные точки отрезка находятся с одной стороны прямоугольника). В прочих случаях, алгоритм выбирает конечную точку, находящуюся вне прямоугольника, находит ближайшую к ней точку пересечения отрезка с одной из линий, образующей стороны прямоугольника, и использует эту точку пересечения как новую конечную точку отрезка. Укороченный отрезок снова пропускается через алгоритм.

Реализация алгоритма для трёхмерной модели идентична двумерной реализации, за исключением того, что вместо четырёхразрядного кода применяется шестиразрядный (дополнительные два бита глубины).

28. Алгоритм разбиения средней точкой.

Матрицей поворота (или матрицей направляющих косинусов) называется ортогональная матрица, которая используется для выполнения собственного ортогонального преобразования в евклидовом пространстве. При умножении любого вектора на матрицу поворота длина вектора сохраняется. Определитель матрицы поворота равен единице.
Обычно считают, что, в отличие от матрицы перехода при повороте системы координат (базиса), при умножении на матрицу поворота вектора-столбца координаты вектора преобразуются в соответствии с поворотом самого вектора (а не поворотом координатных осей; то есть при этом координаты повернутого вектора получаются в той же, неподвижной системе координат). Однако отличие той и другой матрицы лишь в знаке угла поворота, и одна может быть получена из другой заменой угла поворота на противоположный; та и другая взаимно обратны и могут быть получены друг из друга транспонированием.

Матрица поворота в трёхмерном пространстве

Любое вращение в трехмерном пространстве может быть представлено как композиция поворотов вокруг трех ортогональных осей (например, вокруг осей декартовых координат). Этой композиции соответствует матрица, равная произведению соответствующих трех матриц поворота.
Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве являются:
Вращение вокруг оси x:

Вращение вокруг оси y:

Вращение вокруг оси z:

После преобразований мы получаем формулы:
По оси Х
x"=x;
y":=y*cos(L)+z*sin(L) ;
z":=-y*sin(L)+z*cos(L) ;


По оси Y
x"=x*cos(L)+z*sin(L);
y"=y;
z"=-x*sin(L)+z*cos(L);


По оси Z
x"=x*cos(L)-y*sin(L);
y"=-x*sin(L)+y*cos(L);
z"=z;


Все три поворота делаются независимо друг от друга, т.е. если надо повернуть вокруг осей Ox и Oy, вначале делается поворот вокруг оси Ox, потом применительно к полученной точки делается поворот вокруг оси Oy.

Положительным углам при этом соответствует вращение вектора против часовой стрелки в правой системе координат, и по часовой стрелке в левой системе координат, если смотреть против направления соответствующей оси. Правая система координат связана с выбором правого базиса (см. правило буравчика).

Матричное описание вращения твёрдого тела упрощает многие операции; однако, для того, чтобы полностью описать ориентацию вращающегося твёрдого тела, необходимо использовать все девять элементов матрицы поворота. Непосредственно эти элементы не составляют полной системы обобщённых координат, с помощью которых можно описать ориентацию вращающегося твёрдого тела относительно абсолютной системы координат.

В качестве обобщённых координат можно использовать углы Эйлера j , q и y .

Таблица 3.1. Три системы углов Эйлера

Последова-тельность поворотов

На j вокруг оси OZ

На j вокруг оси OZ

На y вокруг оси OX

На q вокруг оси OU

На q вокруг оси OV

На q вокруг оси OY

На y вокруг оси OW

На y вокруг оси OW

На j вокруг оси OZ

Первая из систем углов Эйлера обычно используется при описании движения гироскопов и соответствует следующей последовательности поворотов (рис. 3.2):

Рисунок 3.2. Первая система углов Эйлера

R j , q , y = R z , j ×R u , q ×R w , y =
=

=
. (3-2)

R j , q , y , может быть также получен в результате выполнения последовательности следующих поворотов вокруг осей неподвижной системы координат: сначала на угол y вокруг оси OZ , затем на угол q вокруг оси OX , затем на угол j вокруг оси OZ .

На рисунке 3.3 показана вторая система углов Эйлера, определяемая следующей последовательностью поворотов:

    Поворот на угол j вокруг оси OZ (R z , j).

    Поворот на угол q вокруг оси OV (R v , q).

    Поворот на угол y вокруг повёрнутой оси OW (R w , y).

Результирующая матрица поворота имеет следующий вид:

R j , q , y = R z , j ×R v , q ×R w , y =
=

=
. (3-3)

Поворот, описываемый матрицей R j , q , y для этой системы углов Эйлера, может быть получен также в результате выполнения последовательных поворотов: на угол y вокруг оси OZ , на угол q вокруг оси OY , на угол j вокруг оси OZ .

Рисунок 3.3. Вторая система углов Эйлера

Ещё одну систему углов Эйлера составляют так называемые углы крена , тангажа и рыскания . Эти углы обычно применяются в авиации для описания движения самолётов.

Они соответствуют следующей последовательности поворотов:

    Поворот на угол y вокруг оси OX (R x , y ) – рыскание.

    Поворот на угол q вокруг оси OY (R y , q ) – тангаж.

    Поворот на угол j вокруг оси OZ (R z , j ) – крен.

Результирующая матрица поворота имеет вид:

R j , q , y = R z , j ×R y , q ×R x , y =
=

=
. (3-4)

Поворот, описываемый матрицей R j , q , y в переменных «крен, тангаж, рыскание» может быть также получен в результате выполнения следующей последовательности поворотов вокруг осей абсолютной и подвижной систем координат: на угол j вокруг оси OZ , затем на угол q вокруг повёрнутой оси OV , на угол y вокруг повёрнутой оси OU (продольная ось аппарата – Z ) (рис. 3.4).

Рисунок 3.4. Крен, тангаж, рысканье (третья система углов Эйлера)



Похожие статьи