직교 좌표계, 원통 좌표계 및 구면 좌표계

직교 좌표계, 원통 좌표계 및 구면 좌표계

2022, Mar 01    


Calculus 관련 글 목차


  • 이번 글에서는 원통 좌표계와 구면 좌표계에 대하여 알아보도록 하겠습니다.


목차



직교 좌표계, 원통 좌표계, 구면 좌표계


  • 3차원 좌표계에서 일반적으로 많이 사용하는 직교 좌표계는 임의의 점 P=(x,y,z)P=(x,y,z) 로 나타냅니다.
  • 반면 이 글에서 다룰 원통 좌표계(Cylindrical Coordinate) 또는 구면 좌표계(Spherical Coordinate)는 직교좌표계의 x,y,zx,y,z 좌표를 다른 방식으로 표현합니다.
  • 원통 좌표계구면 좌표계를 사용하는 이유는 다양한 상황에서 이와 같은 좌표계를 사용하였을 때, 미적분 계산이 편리해지는 상황이 발생하기 때문입니다. 원통 좌표계의 경우 원통형으로 생긴 물체나 원형 케이블에서의 연산이 필요할 때 직교 좌표계를 사용할 때보다 계산이 편리해 집니다. 케이블에서의 전자기학 등을 생각해 보시면 이해가 되실 것입니다. 이와 같은 이유로 구면 좌표계의 경우에는 구형 물체나 3차원 상에서의 물체의 운동을 표현할 때, 계산의 편리함을 얻을 수 있습니다.
  • 이번 글에서는 간단히 직교 좌표계, 원통 좌표계, 구면 좌표계 간의 어떤 관계가 있는 지 살펴보고자 합니다. 추가적으로 3차원 상에서 많이 사용하는 오른손 좌표계에서의 좌표 변환 뿐 아니라 카메라 좌표계에서의 좌표 변환도 다루어 보도록 하겠습니다.


Drawing


  • 이 글에서 다루는 오른손 좌표계는 위 그림과 같이 검지가 XX 축, 중지가 YY 축, 엄지가 ZZ 축으로 표현되는 좌표계를 의미합니다. X,Y,ZX,Y,Z 축 순서로 Forward, Left, Up 이므로 이 글에서는 줄여서 FLU(Forward-Left-Up) 좌표계 라고 표현하겠습니다.


Drawing


  • 반면 카메라 좌표계 (또는 왼손 좌표계)는 다음과 같이 엄지가 XX 축, 중지가 YY 축, 검지가 ZZ 축으로 표현되는 좌표계를 의미합니다. X,Y,ZX,Y,Z 축 순서로 Right, Down, Forward 이므로 이 글에서는 줄여서 RDF(Right-Down-Forward) 좌표계 라고 표현하겠습니다.


  • 먼저 개념을 이해하기 위해 원통 좌표계구면 좌표계의 표현 방식에 대하여 살펴보도록 하겠습니다.


Drawing


  • 위 그림의 가운데 좌표계가 원통 좌표계입니다. FLU 좌표계에서 XX 축에서 YY 축 방향으로의 회전 각도를 ϕϕ 로 나타내며 이 각도를 azimuth angle이라고 부릅니다. 점 PPXYXY 평면에 투영하였을 때, 원점과 점 PP거리(distance)rr 로 나타냅니다. zz직교 좌표계와 동일하게 사용됩니다.
  • 원통 좌표계는 기존에 사용하는 직교 좌표계x,yx,y 좌표 표현을 사용하는 대신에 ϕ,rϕ,r 을 이용하여 좌표위 위치를 나타냅니다. 회전 각도와 원점으로 부터의 거리인 ϕ,rϕ,r 을 이용하여 점의 위치를 나타내기 때문에 원과 같은 곡면을 표현하기 유리해지며 높이는 그대로 zz 를 사용하기 때문에 원기둥의 표면을 좌표로 나타내기 쉬운 장점이 있습니다.


Drawing


  • 위 그림을 참조하면 원통 좌표계의 의미를 이해하시는 데 도움이 되실 것입니다.
  • 앞에서 직교 좌표계와 비교하기 위하여 X,Y,ZX,Y,Z 축을 그대로 사용하였지만 위 그림의 AA 에 해당하는 ϕϕ 의 시작점을 나타내는 축은 Polar Axis라 하고 높이를 나타내는 LLLongitudinal Axis라고 합니다.


Drawing


  • 위 그림의 가장 오른쪽 좌표계는 구면 좌표계를 나타냅니다. 원통 좌표계와 비교하면 rr 의 의미가 달라진 점과 zz 대신에 θθ 를 사용하여 점 PP 를 표현하였다는 점입니다. 원통 좌표계에서는 r=x2+y2r=x2+y2 인 반면 구면 좌표계에서는 r=x2+y2+z2r=x2+y2+z2 으로 정의됩니다. 구면 좌표계에서의 θθelevation 또는 inclination 이라고 하며 높이 축으로 부터 아래로 내려오는 각도를 의미합니다.
  • 이와 같이 ϕ,θ,rϕ,θ,r 을 이용하여 점 PP 를 나타내면 x,y,zx,y,z 를 사용하지 않고도 점의 위치를 표현할 수 있으며 구 형태 표면에서의 좌표를 나타낼 때 용이합니다.


Drawing


  • 추가적으로 참고 자료에 따라 표기 방법이 다른 경우가 발생하여 그 부분을 정하고 넘어가고자 합니다.


Drawing


  • 위 내용은 위키피디아에서 발췌한 내용입니다. 왼쪽의 경우가 물리학이나 공학에서 많이 사용하는 표기법입니다. 즉, azimuth angleϕϕ 를 사용하고 elevation angleθθ 를 사용합니다. 본 글에서도 이 표기법을 따를 예정입니다.
  • 반면에 오른쪽 표기 방법은 수학에서 많이 사용하는 방법이라고 합니다. 참조하시면 되겠습니다.


Forward-Left-Up 좌표계에서의 좌표계 변환


  • 지금 부터는 FLU 좌표계에서 직교 좌표계, 원통 좌표계, 구면 좌표계의 변환 방법과 코드를 살펴보도록 하겠습니다.


Drawing


  • FLU 좌표계는 위 축의 방향과 같이 X,Y,ZX,Y,Z 축이 정의된 형태를 의미합니다. 앞에서 계속 살펴본 것과 동일한 축 방향입니다. 글 아랫 부분에서는 RDF 좌표계에서의 변환 방법을 다루어 볼 예정이므로 FLU 좌표계와 비교해서 살펴보면 도움이 될 것 같습니다.


직교 좌표계와 원통 좌표계 간의 좌표 변환


Drawing


  • 먼저 위 그림과 같이 FLU 좌표계에서의 직교 좌표계와 원통 좌표계 간의 변환에 대하여 살펴보도록 하겠습니다.


Drawing


  • 원통 좌표계에서 X,YX,Y 평면 상에 회전 각도인 ϕϕ 는 위 영상과 같이 오른손을 전/후 방향의 축 (XX 축) 에서 좌/우 방향의 축 (YY 축)을 손으로 감쌋을 때, 감싸는 회전 방향인 반시계 방향과 같습니다. 이 내용을 바탕으로 아래 글을 읽으시면 됩니다.


Drawing


  • 원통의 반지름인 rr 은 위 그림에서 다음과 같이 쉽게 얻을 수 있습니다.


  • r=x2+y2r=x2+y2


  • 그리고 ϕϕ 는 직교 좌표계의 x,yx,y 를 이용하여 다음과 같이 구할 수 있습니다.


  • ϕ=tan1(yx)ϕ=tan1(yx)


  • 위 내용과 같이 x,y,zx,y,z 를 이용하여 r,ϕ,zr,ϕ,z 를 쉽게 구할 수 있습니다.


  • 반대로 r,ϕr,ϕ 를 알고있을 때, 삼각함수를 이용하면 직교 좌표계 x,yx,y 로 변환할 수 있습니다.


  • x=rcos(ϕ)x=rcos(ϕ)
  • y=rsin(ϕ)y=rsin(ϕ)


  • 따라서 다음과 같이 직교 좌표계원통 좌표계 간의 변환 관계를 정의할 수 있습니다.


Drawing



직교 좌표계와 구면 좌표계 간의 좌표 변환


Drawing


  • 이번에는 직교 좌표계구면 좌표계 간의 변환 관계를 정의해 보도록 하겠습니다.


Drawing


  • 위 그림과 같이 3차원 상의 점 PP 를 구하기 위해 필요한 값을 하나씩 구해보면 다음과 같습니다.


  • r=x2+y2+z2r=x2+y2+z2
  • ϕ=tan1yxϕ=tan1yx


  • 위 그림에서 rr 은 원점과 x,y,zx,y,z 의 직선 거리이므로 x2+y2+z2x2+y2+z2 로 구할 수 있으며 ϕϕ원통 좌표계와 동일한 방법으로 구할 수 있습니다.
  • 다음으로 θθ 를 구하기 위해서는 θθ 를 사이각으로 하고 빗변이 rr, 밑변이 zz 인 삼각형을 이용하면 다음과 같이 구할 수 있습니다.


  • θ=cos1(zr)θ=cos1(zr)


  • 반대로 구면 좌표계 값인 r,θ,ϕr,θ,ϕ 를 알고 있을 때, 직교 좌표계 값인 x,y,zx,y,z 는 삼각함수를 이용하여 쉽게 구할 수 있습니다.


  • z=rcos(θ)z=rcos(θ)


  • 사잇각을 θθ 로 하는 삼각형에서 삼각비를 이용하면 zz 를 쉽게 구할 수 있습니다.
  • 그 다음으로 원점과 주황색 점 사이의 거리는 방금 사용한 삼각형에서의 삼각비를 이용하여 rsin(θ)rsin(θ) 로 구할 수 있으므로 (평행한 2개의 주황 점선을 참조하면 됩니다.) 다음과 같이 x,yx,y 에 접근할 수 있습니다.


Drawing


  • x=rsin(θ)cos(ϕ)x=rsin(θ)cos(ϕ)
  • y=rsin(θ)sin(ϕ)y=rsin(θ)sin(ϕ)


  • 따라서 다음과 같이 직교 좌표계구면 좌표계 간의 변환 관계를 정의할 수 있습니다.


Drawing



원통 좌표계와 구면 좌표계 간의 좌표 변환


Drawing


  • 마지막으로 원통 좌표계구면 좌표계간의 좌표 변환에 대하여 살펴보도록 하겠습니다. 두 좌표계 모두 rr 이 사용되므로 원통 좌표계에서는 rcrc 로 사용하고 구면 좌표계에서는 rsrs 로 사용하도록 하겠습니다.
  • 먼저 두 좌표계 모두 azimuth 각도로 ϕϕ 를 사용합니다. 원통 좌표계에서 구면 좌표계rs,θrs,θ 를 구하기 위해서는 rc,zrc,z 와 삼각비를 활용하면 쉽게 구할 수 있습니다.


  • rs=r2c+z2rs=r2c+z2
  • θ=tan1(rcz)θ=tan1(rcz)


  • 반면 구면 좌표계에서 rs,θrs,θ 를 이용하여 rc,zrc,z 를 구하는 방법 또한 삼각비를 활용하면 쉽게 구할 수 있습니다.


  • rc=rssin(θ)rc=rssin(θ)
  • z=rscos(θ)z=rscos(θ)


  • 정리하면 다음과 같이 원통 좌표계구면 좌표계를 변환할 수 있습니다.


Drawing


Python Code


  • 지금까지 살펴본 내용을 파이썬 코드를 이용하여 정리하면 다음과 같습니다.


import numpy as np

def cartesian_to_cylindrical(x, y, z):
    r = np.sqrt(x**2 + y**2)
    phi = np.arctan2(y, x)
    return r, phi, z

def cartesian_to_spherical(x, y, z):
    r = np.sqrt(x**2 + y**2 + z**2)
    phi = np.arccos(z / r)
    theta = np.arctan2(y, x)
    return r, theta, phi

def cylindrical_to_cartesian(r, phi, z):
    x = r * np.cos(phi)
    y = r * np.sin(phi)
    return x, y, z

def cylindrical_to_spherical(r_c, phi, z):
    r_s = np.sqrt(r_c**2 + z**2)
    theta = np.arctan2(r_c, z)
    return r_s, theta, phi

def spherical_to_cartesian(r, theta, phi):
    x = r * np.sin(phi) * np.cos(theta)
    y = r * np.sin(phi) * np.sin(theta)
    z = r * np.cos(phi)
    return x, y, z

def spherical_to_cylindrical(r_s, theta, phi):
    r_c = r_s * np.sin(theta)
    z = r_s * np.cos(theta)
    return r_c, phi, z

# Main Conversion Dispatcher Function

def convert_coordinates(src_system, dst_system, coordinates):
    if src_system == "cartesian" and dst_system == "cylindrical":
        return cartesian_to_cylindrical(*coordinates)
    elif src_system == "cartesian" and dst_system == "spherical":
        return cartesian_to_spherical(*coordinates)
    elif src_system == "cylindrical" and dst_system == "cartesian":
        return cylindrical_to_cartesian(*coordinates)
    elif src_system == "cylindrical" and dst_system == "spherical":
        return cylindrical_to_spherical(*coordinates)
    elif src_system == "spherical" and dst_system == "cartesian":
        return spherical_to_cartesian(*coordinates)
    elif src_system == "spherical" and dst_system == "cylindrical":
        return spherical_to_cylindrical(*coordinates)
    else:
        raise ValueError("Invalid source or destination coordinate system.")

# Example usage
point = (1, 1, 1)  # Cartesian coordinates
src_system = "cartesian"
dst_system = "cylindrical"
converted_point = convert_coordinates(src_system, dst_system, point)
print(f"Converted from {src_system} to {dst_system}:", converted_point)


Right-Down-Forward 좌표계에서의 좌표계 변환


  • 카메라 데이터를 사용하지 않거나 카메라에서의 좌표축을 고려하지 않는다면 아래 글은 생략하여도 무관합니다.


Drawing


  • 위 그림과 같이 RDF 좌표계카메라를 이용할 때 주로 사용되는 좌표 축입니다. 가로축이 XX, 세로축이 YY 이고 앞으로 향하는 방향이 ZZ 가 되며 이 방향의 값을 Depth 라고 부릅니다.
  • 본 글을 통하여 직교 좌표계를 사용하는 카메라 영상의 값을 앞에서 다룬 원통 좌표계구면 좌표계를 이용하여 어떻게 다루는 지 살펴보도록 하겠습니다.


직교 좌표계와 원통 좌표계 간의 좌표 변환


Drawing


  • 위 그림은 RDF 좌표계 기준으로 직교 좌표계원통 좌표계 간의 변환 관계를 보여줍니다.


Drawing


  • 원통 좌표계에서 X,ZX,Z 평면 상에 회전 각도인 ϕϕ 는 위 영상과 같이 오른손을 전/후 방향의 축 (ZZ 축) 에서 좌/우 방향의 축 (XX 축)을 손으로 감쌋을 때, 감싸는 회전 방향인 시계 방향과 같습니다. 이 내용을 바탕으로 아래 글을 읽으시면 됩니다.


  • 위 설명과 같은 이유로 FLU 좌표계에서 ϕϕ 는 전후방 축인 Forward 양의 방향축에서 좌우 수평축인 Left 양의 방향축으로의 회전 각도를 나타낸 것과 같이 RDF 좌표계에서도 ϕϕ 는 전후방 축인 Forward 양의 방향축에서 좌우 수평축인 Right 양의 방향축으로의 회전 각도를 나타냅니다.


Drawing


  • 앞에서 다룬 내용과 유사하게 XX 축과 ZZ 축이 이루는 평면에서 x,zx,z 좌표를 이용하면 위 그림과 같이 쉽게 r,ϕr,ϕ 를 구할 수 있습니다. yy 값은 직교 좌표계원통 좌표계 같은 값을 사용합니다. 따라서 직교 좌표계x,y,zx,y,z 값을 이용하면 원통 좌표계r,ϕ,yr,ϕ,y 를 다음과 같이 구할 수 있습니다.


  • r=x2+z2r=x2+z2
  • ϕ=tan1(xz)ϕ=tan1(xz)
  • y=yy=y


  • 반대로 원통 좌표계r,ϕ,yr,ϕ,y 를 이용하여 직교 좌표계x,y,zx,y,z 를 구하려면 삼각함수를 이용하여 변환할 수 있습니다.


  • x=rsin(ϕ)x=rsin(ϕ)
  • y=yy=y
  • z=rcos(ϕ)z=rcos(ϕ)


  • 따라서 다음과 같이 직교 좌표계원통 좌표계 간의 변환 관계를 정의할 수 있습니다.


Drawing


직교 좌표계와 구면 좌표계 간의 좌표 변환


Drawing


  • 이번에는 직교 좌표계구면 좌표계 간의 변환 관계를 정의해 보도록 하겠습니다.


Drawing


  • 위 그림과 같이 3차원 상의 점 PP 를 구하기 위해 필요한 값을 하나씩 구해보면 다음과 같습니다.


  • r=x2+y2+z2r=x2+y2+z2
  • ϕ=tan1(xz)ϕ=tan1(xz)


  • 구면 좌표계에서도 r,ϕr,ϕ원통 좌표계와 동일한 방식으로 구할 수 있습니다.
  • 반면 θθ 의 정의는 X,ZX,Z 축이 생성하는 평면을 시작으로 생성되는 각도가 됩니다. 이와 같이 정의 하는 이유는 카메라 좌표계에서 ZZ 축이 Forward로 향하는 원점을 Principal Point로 삼기 때문에 이 부분을 기준으로 θθ 의 회전각을 구하기 위함입니다.
  • 즉, ZZ 축을 기준으로 수평 방향으로의 회전 각도를 ϕϕ, 수직 방향으로의 회전 각도를 θθ 로 정의하는 것이 RDF 좌표계에서 ϕ,θϕ,θ 를 정의하는 방법입니다. FLU 좌표계와 다른 이유는 RDF 좌표계전통적으로 사용하는 카메라 좌표계와 대응하여 사용하기 위함입니다.


  • 따라서 θθ 를 구하기 위해서는 θθ 를 사이각으로 하고 빗변이 rr, 높이가 yy 인 삼각형을 이용하면 다음과 같이 구할 수 있습니다.


  • θ=sin1(yr)θ=sin1(yr)


  • 반대로 구면 좌표계 값인 r,θ,ϕr,θ,ϕ 를 알고 있으면, 직교 좌표계 값인 x,y,zx,y,z 는 삼각 함수를 이용하여 쉽게 구할 수 있습니다.
  • 먼저 사잇각을 θθ 로 하는 삼각형에서 삼각비를 이용하면 yy 를 쉽게 구할 수 있습니다.


  • y=rsin(θ)y=rsin(θ)


  • 그 다음 위 그림에서 원점과 보라색 점 사이의 거리는 방금 사용한 삼각형에서의 삼각비를 이용하면 rcos(θ)rcos(θ) 로 구할 수 있으므로 다음과 같이 x,zx,z 에 접근할 수 있습니다.


Drawing


  • x=rcos(θ)sin(ϕ)x=rcos(θ)sin(ϕ)
  • z=rcos(θ)cos(ϕ)z=rcos(θ)cos(ϕ)


  • 따라서 다음과 같이 직교 좌표계구면 좌표계간의 변환 관계를 정의할 수 있습니다.


Drawing


원통 좌표계와 구면 좌표계 간의 좌표 변환


Drawing


  • 마지막으로 원통 좌표계구면 좌표계간의 좌표 변환에 대하여 살펴보도록 하겠습니다. FLU 좌표계 예제와 마찬가지로 두 좌표계 모두 rr 이 사용되므로 원통 좌표계에서는 rcrc 로 사용하고 구면 좌표계에서는 rsrs 로 사용하도록 하겠습니다.
  • 먼저 두 좌표계 모두 azimuth 각도로 ϕϕ 를 사용합니다. 원통 좌표계에서 구면 좌표계rs,θrs,θ 를 구하기 위해서는 rc,yrc,y 와 삼각비를 활용하면 쉽게 구할 수 있습니다.


  • rs=r2c+y2rs=r2c+y2
  • θ=tan1(yrc)θ=tan1(yrc)


  • 반면 구면 좌표계에서 rs,θrs,θ 를 이용하여 rc,yrc,y 를 구하는 방법 또한 삼각비를 활용하면 쉽게 구할 수 있습니다.


  • rc=rscos(θ)rc=rscos(θ)
  • y=rssin(θ)y=rssin(θ)


  • 정리하면 다음과 같이 원통 좌표계구면 좌표계를 변환할 수 있습니다.


Drawing



Python Code


  • 지금까지 살펴본 내용을 파이썬 코드를 이용하여 정리하면 다음과 같습니다.


import numpy as np

def cartesian_to_cylindrical_RDF(x, y, z):
    r = np.sqrt(x**2 + z**2)
    phi = np.arctan2(x, z)
    return r, phi, y

def cylindrical_to_cartesian_RDF(r, phi, y):
    x = r * np.sin(phi)
    z = r * np.cos(phi)
    return x, y, z

def cartesian_to_spherical_RDF(x, y, z):
    r = np.sqrt(x**2 + y**2 + z**2)
    theta = np.arcsin(y / r)
    phi = np.arctan2(x, z)
    return r, theta, phi

def spherical_to_cartesian_RDF(r, theta, phi):
    x = r * np.cos(theta) * np.sin(phi)
    y = r * np.sin(theta)
    z = r * np.cos(theta) * np.cos(phi)
    return x, y, z

def spherical_to_cylindrical_RDF(r_s, theta, phi):
    r_c = r_s * np.cos(theta)
    y = r_s * np.sin(theta)
    return r_c, phi, z

def cylindrical_to_spherical_RDF(r_c, phi, z):
    r_s = np.sqrt(r_c**2 + y**2)
    theta = np.arctan2(y, r_c)
    return r_s, theta, phi


def convert_coordinates_RDF(src_system, dst_system, coordinates):
    if src_system == "cartesian" and dst_system == "cylindrical":
        return cartesian_to_cylindrical_RDF(*coordinates)
    elif src_system == "cartesian" and dst_system == "spherical":
        return cartesian_to_spherical_RDF(*coordinates)
    elif src_system == "cylindrical" and dst_system == "cartesian":
        return cylindrical_to_cartesian_RDF(*coordinates)
    elif src_system == "cylindrical" and dst_system == "spherical":
        return cylindrical_to_spherical_RDF(*coordinates)
    elif src_system == "spherical" and dst_system == "cartesian":
        return spherical_to_cartesian_RDF(*coordinates)
    elif src_system == "spherical" and dst_system == "cylindrical":
        return spherical_to_cylindrical_RDF(*coordinates)
    else:
        raise ValueError("Invalid source or destination coordinate system.")

# Example usage
point = (1, 1, 1)  # Cartesian coordinates
src_system = "cartesian"
dst_system = "cylindrical"
converted_point = convert_coordinates_RDF(src_system, dst_system, point)
print(f"Converted from {src_system} to {dst_system}:", converted_point)


Calculus 관련 글 목차