Processing math: 100%
본문 바로가기
SKIN & CSS

선형 변환과 CSS

글: 논어일기 2020. 11. 21.
반응형

시에스에스에서 변환(transform) 함수로 요소를 회전, 닮음, 비틀림, 평행 이동할 수 있다. 여기에도 당연히 수학이 들어 있다. 좌표를 다른 좌표로 옮기는 선형 변환이 바로 그것이다.

T:RnRn

데카르트 좌표(Cartesian coordinates)

수학 교과서와 조금 다르게 방향을 정한다. 수학 교과서는 y축의 양의 방향이 위쪽이지만 여기선 아래쪽이다. 시계 방향이 양의 방향이 된다. 오히려 일상 생활에서 생각하는 각과 같아지는 셈이니 수학을 잘 모르면 오히려 이해하기 쉽다고 해야 할까?

수학은 모든 자연수 n을 생각할 수 있지만 시에스에스에선 2차원과 3차원만 가능하다. 선형 변환을 표현하는 기본은 정사각 행렬이다. 2차 행렬로 모든 변환을 나타낼 수 있지만 웹 디자이너에게 선형 대수를 배우라고 하기는 좀 그러니 더 간단한 표현을 만들어 쓴다. 하지만 알아 둔다고 해롭지는 않다.

T:xax+cyybx+dyT[xy]=[acbd][xy]

변환 함수[1]를 행렬로 이해하기

  • 평행 이동-tranlate은 선형 변환이 아니라서 행렬로 나타낼 수 없다.
  • 회전-rotate, 닮음-scale은 행렬로 바꾸면 쉽게 이해할 수 있다.

rotate(θ)[cosθsinθsinθcosθ][xy]

scale(1.5)[1.5001.5][xy]

 

  • 비틀림-skew는 직관적으로 이해하기 어렵다. 행렬로 나타내면 조금 쉽게 이해할 수 있다.

skew(θx,θy) [1tanθxtanθy1][xy]

참고: 비틀림은 수학에서 쓰는 전단 변환(shear mapping or transformation)과 관련 있다.

평면 기하에서 전단 변환은 주어진 점을 좌표에 비례하여 정해진 방향으로 옮기는 선형 변환이다.

예를 들면 아래와 같은 변환이 전단 변환이다.

[xy]=[x+myy]=[1m01][xy].

위 변환은 x축 위의 점은 그대로지만 다른 점들은 x축에 평행한 방향으로 이동한다. m>0이면 y>0인 점은 양의 방향으로 y<0인 점은 음의 방향으로 옮겨 진다.

검은 점이 원점이다. m>0

매트릭스 함수는 닮음 변환과 비틀림 변환을 하고 평행이동까지 한 것을 나타낸다. 여기서 평행 이동은 선형 변환이 아니라서 2차 행렬로 나타내지 않는다.

  • 매트릭스 함수를 행렬로 표현하면 다음과 같다.
matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY())

matrix(a, m, n, d, 10, 30)

[a00d][1nm1][xy]+[1030]

m=n이면 역행렬이 없다. 따라서 이때 변환은 1-1대응이 아니다. 평면 위의 모든 점이 한 점 또는 한 직선으로 옮겨지므로 그림이 나타나지 않는다.

developer.mozilla.org/en-US/docs/Web/CSS/transform-function

 

 

The transform-function CSS data type represents a transformation that affects an element's appearance. Transformation functions can rotate, resize, distort, or move an element in 2D or 3D space. It is used in the transform property.

developer.mozilla.org

developer.mozilla.org/en-US/docs/Web/CSS/transform

 

transform

The transform CSS property lets you rotate, scale, skew, or translate an element. It modifies the coordinate space of the CSS visual formatting model.

developer.mozilla.org


[1] 변환 함수는 아래와 같다.

<함수 이름> = 문법(  )

<matrix()> = matrix( <number> )
<translate()> = translate( <length-percentage> , <length-percentage>? )
<translateX()> = translateX( <length-percentage> )
<translateY()> = translateY( <length-percentage> )
<scale()> = scale( <number> , <number>? )
<scaleX()> = scaleX( <number> )
<scaleY()> = scaleY( <number> )
<rotate()> = rotate( [ <angle> | <zero> ] )
<skew()> = skew( [ <angle> | <zero> ] , [ <angle> | <zero> ]? )
<skewX()> = skewX( [ <angle> | <zero> ] )
<skewY()> = skewY( [ <angle> | <zero> ] )
<matrix3d()> = matrix3d( <number> )
<translate3d()> = translate3d( <length-percentage> , <length-percentage> , <length> )
<translateZ()> = translateZ( <length> )
<scale3d()> = scale3d( <number> , <number> , <number> )
<scaleZ()> = scaleZ( <number> )
<rotate3d()> = rotate3d( <number> , <number> , <number> , [ <angle> | <zero> ] )
<rotateX()> = rotateX( [ <angle> | <zero> ] )
<rotateY()> = rotateY( [ <angle> | <zero> ] )
<rotateZ()> = rotateZ( [ <angle> | <zero> ] )
<perspective()> = perspective( <length> )

<length-percentage> = <length> | <percentage>

<number>에 쓸 수 있는 수

12 A raw <integer> is also a <number>.
4.01 Positive fraction
-456.8 Negative fraction
0.0 Zero
+0.0 Zero, with a leading +
-0.0 Zero, with a leading -
.60 Fractional number without a leading zero
10e3 Scientific notation
-3.4e-2 Complicated scientific notation
반응형