Матрица трансформации координат тk представляет собой

Матрица трансформации координат тk представляет собой

Кома нужна задача по строительной механике вариант 8. ПРОДАМ! пишите на почту [email protected]

Добавлено через 5 минут
Меняю 8 вариант работы на 3

Помогите, у кого есть 0 вариант.

Добавлено через 1 минуту
У кого есть 0 вариант РГР по строительной механике,помогите?

Тебе кто нибудь помог с вариантом 0?

Добавлено через 1 минуту
Здравствуйте! Если нужна строительная механика, пишите [email protected] Чем смогу,помогу)

Есть РГР по строительной механике, вариант 0 ?

Привет. Ищу решение задач по стр. механике.

Добавлено через 12 минут
Привет.Ищу решение задач

Добавлено через 1 минуту
Добрый день Уважаемые участники. 8 вариант контрольной ни кто не поделился?? Скиньте в личку [email protected] ПОЖАЛУЙСТА.

ответы на 2 часть контроль все верны на отлично

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

Нормальные напряжения в сводах-оболочках распределяются
Почти равномерно по толщине сечения

Меридианом стрельчатого купола является
дуга окружности, центр которой не лежит на оси вращения

На рисунке представлена (оболочка сферическая или близка к ней)
Оболочка вращения положительной Гауссовой кривизны

Оси глобальной системы координат при использовании метода конечных элементов обозначают
x°, y°, z°

на поверхностях положительной гауссовой кривизны отсутствуют
направления с нулевой кривизной

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

Оси локальной системы координат при использовании метода конечных элементов обозначают
x, y, z

На рисунке представлена схема стрельчатого купола. При уменьшении угла φ до 0, форма купола
Станет сферической

На рисунке представлена (оболочка цилиндрическая)
Оболочка вращения нулевой Гауссовой кривизны

Опирание сомкнутого свода возможно
Только по всему контуру

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

Опирание крестового свода возможно
на четыре колонны или пилона по углам

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

Классы гладких поверхностей гауссовой кривизны, (даже не имеющих математического описания) называются
И то и другое

Дата создания: 2009-09-10 02:22:29
Последний раз редактировалось: 2012-02-08 09:31:20

    Предварительные уроки:

  1. Векторы. Перейти.
  2. Матрицы. Перейти.
  3. Координатные пространства. Перейти.
    Дальнейшие уроки

  1. Виртуальная камера и перспективная проекция. Перейти.

Сначала определимся, что такое преобразования? Допустим у нас есть модель (для простоты, пусть это будет треугольник). И три координатных пространства: объектное (в котором и описан этот треугольник), мировое и пространство камеры. Так вот, преобразование — это выражение координат объекта, находящегося в одной координатной системе (объектной), с помощью координат другой координатной системы (сначала мировой, а потом камерной).

Как я уже писал раньше, использование разных координатных пространств упрощает создание виртуального мира. В объектном пространстве создаются объекты, причём, у каждого объекта есть своё координатное пространство. Мировое пространство связывает все объекты виртуального мира и позволяет сделать очень трудные вещи — очень простыми (например, перемещение объектов). После того как сцена создана и все объекты передвинуты, происходит преобразования мировых координат в координатное пространство камеры. Мы будем использовать только одну камеру, но в реальных ситуациях можно создать несколько. Несколько камер, например, использовалось в гениальной игре Earth 2150: Escape from the blue planet.

Так о чём это я: преобразования необходимы для использования нескольких координатных пространств.

Для начала вспомним кое-что о векторах. В этом нам поможет следующий рисунок:

Что же мы здесь видим: мировое пространство координат образованное осями x, y, z. Единичные векторы i, j, k называются ортами или базисными векторами мирового координатного пространства. С помощью суммы этих векторов можно получить любой вектор в мировом координатном пространстве.

v — вектор, который соединяет начало мировых координат и начало объектных координат. Длина вектора v равна расстоянию между началом мировых координат и началом объектных. Рассмотрим векторную форму v=(5,2,5):

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

Векторы p,q,r — базисные векторы объектного пространства. Заметьте, что i,j,k не обязательно будут равны p,q,r.

На данном рисунке я опустил ряд деталей: в объектном координатном пространстве заданы три точки, которые образуют треугольник. Кроме того, я не обозначил камеру, которая направлена в сторону треугольника.

Линейные преобразования координат с помощью матриц

Для начала давайте рассмотрим единичные векторы i,j,k, которые по направлению совпадают с координатными осями мирового пространства и называются ортами или базисными векторами мирового пространства.

Запишем эти векторы в координатной форме в виде матриц:

Здесь векторы представлены матрицами размером 1×3 (матрицами-строками).

Эти базисные векторы мы можем записать с помощью одной матрицы:

И даже, что намного важнее, можем записать эти векторы вот так:

Как видим, получилась единичная матрица размером 3×3 или 4×4.

Казалось бы, что тут такого? Подумаешь, есть возможность записать какие-то дурацкие базисные векторы пространства в одной матрице. Но нет, не "подумаешь". Именно здесь сокрыта одна из самых страшных тайн трёхмерного программирования.

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

Где v — точка в пространстве, x,y,z — координаты точки v, а i,j,k — базисные векторы пространства. Заметьте, здесь мы говорим о точке, но рассматриваем вектор. Надеюсь вы помните, что вектор и точка — это по сути одно и то же.

Формула выше называется векторной формой вектора. Есть ещё одно название — линейная комбинация векторов. Это так, к слову.

Читайте также:  Можно ли сделать загрузочный внешний жесткий диск

Теперь ещё раз посмотрим на вектор v. Запишем его в матрице-строке: v = [ 5 2 5 ]

Заметьте, что длина вектора v — это расстояние от начала мирового координатного пространства к началу объектного координатного пространства.

Давайте попробуем умножить этот вектор на матрицу в которой записаны базисные векторы мирового пространства (надеюсь вы помните формулу перемножения матриц):

В итоге мы получим следующее уравнение:

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

a, b — векторы, M — матрица преобразования координатных пространств. Формулу можно прочитать так: "матрица M преобразовывает точку a в точку b".

Для наглядности давайте рассмотрим пример. Нам нужно преобразовать координаты из объектного пространства (p,q) в мировое (i,j):

i,j — базисные векторы мирового пространства, p,q — базисные векторы объектного пространства. На картинке можно увидеть, что объектное координатное пространство повёрнута на -45 градусов вокруг оси z (на рисунке её не видно). Кроме того, векторы q,p в 1,5 раза больше векторов i,j, а это значит, что объекты определённые в объектном пространстве, в мировом пространстве будут выглядеть в полтора раза меньше.

Чтобы наглядно представить, как модель объектного пространства будет выглядеть после преобразования можно дорисовать рамку для векторов i,j:

Можно такую же рамку нарисовать и для p,q, но я не стал загромождать рисунок.

Теперь, допустим, в объектном пространстве у нас нарисован треугольник (рис. а). В мировом пространстве этот треугольник будет повёрнут на 45 градусов и уменьшен на одну треть (рис. б):

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

Как мы узнали координаты? Во-первых, мы знаем, что координатные пространства повёрнуты друг относительно друга на 45 градусов. Во-вторых, базисные векторы объектного пространства в 1,5 раза длинее базисных векторов мирового пространства. Зная это, мы легко вычислили координаты векторов i,j.

В итоге у нас получается вот такая матрица преобразования (в данном случае — поворота или вращения):

Или в трёхмерном пространстве:

Все значения — приблизительные.

Это матрица преобразования координат из объектного пространства в инерционное (напоминаю, что базисные векторы инерционного пространства совпадают с базисными векторами мирового пространства). Чтобы преобразовать треугольник из объектного пространства в инерционное, нужно умножить все точки (векторы) треугольника на матрицу преобразования.

В последнем примере мы повстречались с двумя преобразованиями: поворот и масштабирование. Оба этих преобразовиния являются линейными.

Теперь, когда мы рассмотрели примеры линейных преобразования, можно познакомиться и с определением:

Линейные преобразования — это преобразования координат, при которых не происходит искажения пространств. Т.е. все параллельные прямые остаются параллельными (есть правда одно исключение). Или совсем по простому: при линейных преобразованиях треугольник никогда не превратится в круг или в квадрат, а всегда будет оставаться треугольником.

Теперь, когда мы приблизительно понимаем, что такое линейные преобразования, рассмотрим конкретные формулы:

Масштабирование (Scale)

k1,k2,k3 — коффициенты масштабирования. Если k 1, происходит увеличение объектов.

Поворот или вращение (Rotation)

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

Поворот вокруг оси x:

Поворот вокруг оси y:

Поворот вокруг оси z:

Кстати, именно эту матрицу (поворота вокруг оси z) мы использовали выше.

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

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

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

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

Аффинные преобразования

Аффинные преобразования — это линейные преобразования с переносом. С помощью аффинных преобразований можно передвигать объекты.

Формула очень простая:

Где b — исходная точка, M — матрица линейного преобразования, a — преобразоавнная точка и v — вектор, соединяющий два пространства. Или другими словами, это вектор, длина которого равна расстоянию между двумя координатными пространствами.

На картинке в начале урока необходимо именно аффинное преобразование: сначала линейное преобразование из объектного пространства в инерционное, а затем перенос всех точек объектного пространства в мировое с помощью вектора v.

Однородная система координат

Для упрощения вычислений в программировании трёхмерной графики используются четырёхмерные векторы, матрицы размером 4×4 и так называемые однородные координаты. Четвёртое измерение не играет никакой роли, оно вводится только лишь для упрощения вычислений.

В четырёхмерном векторе, как вы возможно догадались, используются четыре компоненты: x, y, z и w. Четвёртая компонента вектора назывется однородной координатой.

Геометрически представить однородную координату очень сложно. Поэтому мы рассмотрим трёхмерное однородное пространство с координатами (x,y,w). Представим что двухмерная плоскость определа в точке w=1. Соответственно двухмерная точка представлена в однородном пространстве следующими координатами (x,y,1). Все точки пространства, которые не находятся в плоскости (они находятся в плоскостях, где w != 1) можно вычислить спроецировав на двухмерную плоскость. Для этого нужно разделить все компоненты этой точки на однородную. Т.е. если w!=1, в "физической" (там где мы работаем и там где w=1) плоскости координаты точки будут следующими: (x/w,y/w,w/w) или (x/w,y/w,1). Посмотрите на рисунок:

Читайте также:  Автомобили с крепкими кузовами

Координаты векторов следующие:

Эти векторы спроецируются в "физическую" плоскость (w=1) следующим образом:

На рисунке видно три вектора. Обратите внимание, что когда точка лежит в плоскости w=0, то эту точку нельзя спроецировать в физическую плоскость (вектор v2).

Для каждой точки физической плоскости существует бесконечное количество точек в однородном пространстве.

В четырёхмерном пространтстве всё точно так же. Мы работаем в физическом пространстве где w = 1: (x,y,z,1). Если в результате вычислений w != 1, значит нужно все координаты точки разделить на однородную: (x/w,y/w,z/w,w/w) или (x/w,y/w,z/w,1). Существует ещё особый случай, когда w = 0. Мы его рассмотрим попозже.

Теперь перейдём к практике: для чего же чёрт возьми нужна однородная координата?

Как мы уже выяснили, матрица размером 3×3 представляет линейное преобразование, т.е. в ней не содержится переноса (перемещения). Для переноса используется отдельний вектор (а это уже аффинное преобразование):

Т.е. мы умножаем все точки (векторы) объекта на матрицу преобразования M, чтобы перейти в инерционную систему координат (базисные векторы которой совпадают с базисными векторами мировой системы координат), а затем добираемся до мирового пространства с помощью вектора b. Напоминаю, что вектор b соединяет начало объектного пространства и начало мирового пространства.

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

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

Посмотрим на формулу умножения векторов на матрицу преобразования в четырёхмерном пространстве:

Как видим, компоненты преобразованного вектора с помощью матрицы размером 4×4, равны компонентам преобразованного вектора с помощью матрицы размером 3×3. Четвёртая же компонента, как мы условились, всегда будет равна единице, поэтому её можно просто отбросить. Следовательно, можно сказать, что преобразования осуществляемые матрицами размером 3×3 и 3×4 — эквиваленты.

Теперь посмотрим на матрицу переноса:

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

Обратите внимание, что это тоже линейное преобразование, только в четырёхмерном пространстве.

С помощью произведения матриц мы можем объединить матрицу вращения и матрицу переноса:

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

Введение

Матричные функции — matrix() and matrix3d() — две самые головоломные в плане понимания вещи в CSS3-трансформациях. В большинстве случаев, ради простоты и ясности, вы будете пользоваться функциями вроде rotate() и skewY() . Но всё же за каждой трансформацией скрывается эквивалентная матрица. Полезно хоть слегка понимать, как они работают, так что давайте рассмотрим их поближе.

CSS-трансформации «растут» из линейной алгебры и геометрии. Хотя продвинутая математическая подготовка будет весьма не лишней, понять матричные функции можно и без нее. Но вы должны быть хорошо знакомы с CSS-трансформациями. Если нет, то почитайте статью «CSS3 transitions and 2D transforms».

В этой статье я охвачу как матрицы 3×3, используемые для двумерных трансформаций, так и матрицы 4×4 для трехмерных.

Заметьте, что на момент этой публикации Opera не поддерживает трехмерных трансформаций. Я включила двумерный matrix() -эквивалент, где возможно.

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

Что такое матрица?

Матрица — это прикольный математический термин для прямоугольного массива чисел, символов или выражений (см. рис. 1). У матриц множество математических и научных применений. Физики, например, используют их при изучении квантовой механики. В области компьютерной графики они используются для вещей типа — внезапно! — линейных трансформаций и проекции трехмерных изображений на двумерный экран. Это и есть то, что делают матричные функции: matrix() позволяет нам создавать линейные трансформации, а matrix3d() дает возможность создавать иллюзию трехмерности в двух измерениях с помощью CSS.

Рис. 1. Пример матрицы

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

Важный для понимания момент — то, что трансформация умножает матрицу на координаты точки (или точек), выраженные в виде вектора.

Трансформации и системы координат

Сначала поговорим о системах координат. Каждая область просмотра документа является системой координат. Левый верхний угол — ее начало, с координатами (0,0) . Значения увеличиваются вправо по оси X и вниз по оси Y. Ось Z определяет кажущееся расстояние до зрителя в случае 3D-трансформаций. Бо́льшие значения — предметы ближе и крупнее, меньшие значения — мельче и дальше.

Когда трансформация применяется к объекту, она создает локальную систему координат. По умолчанию начало локальных координат — точка (0,0) — лежит в центре объекта, или на 50% ширины и 50% высоты (рис. 2).

Рис.2. Локальная система координат

Мы можем изменить начало локальной системы координат подгонкой свойства transform-origin (рис. 3). Задание transform-origin: 50px 70px; , например, помещает начало координат в 50 пикселях от левого края объекта и в 70 пикселях от его верха. Трансформации каждой точки в локальной системе координат объекта рассчитываются относительно этого начала.

Читайте также:  Как узнать ip адрес сканера

Рис. 3. Локальная система координат, с началом в точке (50px,70px) . Также показана точка (30px,30px)

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

Расчет трансформации: математика матриц и векторов

Взглянем на пример с использованием матрицы 3×3 для расчета двумерной трансформации (рис. 4). Матрица 4×4, используемая для трехмерных трансформаций, работает так же, с дополнительными числами для добавочной оси Z.

Рис. 4. Матрица двумерной CSS-трансформации

Мы можем записать это как transform: matrix(a,b,c,d,e,f) , где буквы от a до f — числа, определяемые типом трансформации, которую мы хотим применить. Матрицы — это рецепты тех видов трансформации, которые мы хотим применить. Это станет чуть понятнее, когда мы рассмотрим несколько примеров.

Когда мы применяем двумерную трансформацию, браузер умножает матрицу на вектор [x, y, 1] . Значения X и Y — координаты конкретной точки в локальном пространстве координат.

Чтобы найти координаты после трансформации, мы умножаем каждый элемент каждой строки матрицы на соответствующую ему строку вектора. Затем складываем произведения (рис. 5).

Рис. 5. Умножение матрицы на вектор

Я знаю, что это выглядит как куча бессмысленных цифр и букв. Но, как отмечено выше, у каждого типа трансформаций — своя собственная матрица. Рис. 6 показывает матрицу для трансформации сдвига.

Рис. 6. Матрица сдвига

Значения tx и ty — значения, на которые должно быть сдвинуто начало координат. Мы также можем представить это с помощью вектора [1 0 0 1 tx ty] . Этот вектор служит аргументом для функции matrix() , как показано ниже.

Давайте трансформируем объект, левый верхний угол которого совпадает с левым верхним углом области просмотра (Рис. 7). Его глобальные координаты равны (0,0) .

Рис. 7. Объект с глобальными координатами (0,0)

Мы переместим этот объект на 150 пикселей по осям X и Y, используя начало координат трансформации по умолчанию. Ниже приведен CSS для этой трансформации.

Кстати, это эквивалентно transform: translate(150px,150px) . Давайте рассчитаем результат этой трансформации для точки с координатами (220px,220px) (Рис. 8).

Рис. 8. Вычисление трансформации сдвига

Трансформации задают соответствие координатам и расстояниям в локальной системе координат объекта предыдущей системе координат. То, где точка отобразится в области просмотра, зависит от примененного при трансформации сдвига от начальной точки объекта. В этом примере наша точка с координатами (220px,220px) теперь отображается в точке (370px,370px) . Прочие координаты в границах нашего объекта тоже сместились на 150 пикселей вправо и на 150 пикселей вниз (рис. 9).

Рис. 9. Наш объект после применения трансформации

Матрица сдвига — особый случай. Она как аддитивна, так и мультипликативна. Более простым решением было бы просто прибавить значение сдвига к значениям X- и Y-координат нашей точки.

Расчет трехмерной трансформации

Выше мы рассмотрели матрицу переноса 3×3. Давайте возьмем другой пример, с использованием матрицы 4×4 для масштабирования (рис. 10).

Рис. 10. Матрица 4×4 для масштабирования

Здесь sx, sy и sz представляют масштабные коэффициенты по каждой оси. С функцией matrix3d это примет такой вид: transform: matrix3d(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1) .

Будем продолжать с тем же объектом, что раньше. Уменьшим его масштаб по осям X и Y с помощью функции matrix3d() , как показано ниже.

Это эквивалентно transform: scale3d(0.8, 0.5, 1) . Поскольку мы масштабируем только по осям X и Y (получая 2D-трансформацию), мы могли бы использовать также transform: matrix(.8, 0, 0, .5, 0, 0) либо scale(.8,.5) . Результат трансформации виден на рис. 11.

Рис. 11. Объект 300×300 пикселей после применения трансформации масштабирования

Если умножить эту матрицу на координатный вектор [150,150,1] , (рис. 12), мы получим такие новые координаты нашей точки: (120,75,1) .

Рис. 12: Вычисление трансформации масштабирования

Где взять значения матриц

Значения матриц для каждой функции трансформации приведены как в спецификации Scalable Vector Graphics, так и в спецификации CSS Transforms.

Составные трансформации с помощью матриц

Наконец, давайте рассмотрим, как создать составную трансформацию — трансформацию, эквивалентную применению нескольких функций трансформации одновременно. Ради простоты ограничимся двумя измерениями. Это значит, что мы будем использовать матрицу трансформации 3×3 и функцию matrix(). Этой трансформацией мы повернем наш объект на 45° и увеличим его масштаб в 1,5 раза от исходного размера.

Матрица поворота, выраженная в виде вектора — [cos(a) sin(a) -sin(a) cos(a) 0 0] , где a — угол. Для масштабирования понадобится матрица [sx 0 0 sy 0 0] . Чтобы объединить их, умножим матрицу поворота на матрицу масштабирования, как показано на рис. 13 (синус и косинус 45° оба равны 0,7071).

Рис. 13: Вычисление матрицы составной трансформации

В CSS это будет выглядеть так: transform: matrix(1.0606, 1.0606, -1.0606, 1.0606, 0, 1) . Рис. 14 показывает результат после применения трансформации.

Рис. 14: Наш объект 300×300 пикселей после масштабирования и поворота

Теперь рассчитаем новые координаты в области просмотра для точки (298,110) , как показано на рис. 15.

Рис. 15. Применение трансформации

Новыми координатами нашей точки будут (199.393px,432.725px) .

Узнать больше

Надеюсь, эта статья немного приподняла завесу тайны над CSS-трансформациями. Если ей это не удалось, попробуйте обратиться к ресурсам ниже.

Published on 23 May 2012 in Articles. Available in Russian, English. Translated by Maxim Usachev . Edit this article on GitHub. Licensed under a Creative Commons Attribution 3.0 Unported license.

Copyright © 2006—2019 Opera Software AS. Some rights reserved. Contribute!

Ссылка на основную публикацию
Люстра с пультом управления светодиодная инструкция
Идея установить и подключить люстру с пультом замечательна тем, что хозяева квартиры получают возможность управлять освещением, не привязываясь к выключателю....
Линза для лазерного диода
Асферические линзы используются для коррекции сферических аберраций. Вместо применения сложных линз такие аберрации могут быть снижены до минимума при использовании...
Линукс для нетбука acer aspire one
Автор — Андрес Брачо (Andrés Bracho) Я не технарь, не компьютерщик и не программист. Я всего лишь среднестатис-тический пользователь, кото-рый...
Ля рош позе скидки
12 актуальных предложений март 2020 Сэкономьте 10% с промокодом при покупке более 3000 рублей Приобретите в интернет-магазине La Roche Posay...
Adblock detector