[CGs] Parametric Line Clipping Algorithm

박원준·2023년 4월 4일
0

CGs

목록 보기
8/20

💻 Liang and Barsky Algorithm

Basic Idea

  • clip edge를 무한으로 늘린 선과 edge가 교차하는 부분의 점들을 대표하는 tt값을 찾는다.

    • 선이 시작하는 점 P0P_{0} = tt = 0
    • 선이 끝나는 점 P1P_{1} = tt = 11
    • 0 <= tt <= 11
  • clip edge는 선에 교차하여 최대 4가지 tt값이 계산된다.

    • Line1Line 1 and Line2Line 2의 경우 2개의 tt
    • Line3Line 3의 경우 4개의 tt
  • 4가지 tt값 중 실제 교차점(window의 경계선과 교차하는 점)허수 교차점(window의 경계선의 연장선과 교차하는 점)을 구분해야 한다

  • 4가지 교차점에 대응하는 tt값 중 실제 교차하는 부분은 한개나 두개이다.

    • 일반적으로, 이것은 Cohen-Sutherland의 교차점 계산 알고리즘에 비해 시간을 절약할 수 있는데, 이유는 많은 clip-rectangle edge를 clip하는 반복적인 작업을 피할 수 있기 때문이다
  • Liang and Barsky Algorithm은 Cyrus-Beck Algorithm을 향상시킨 것으로, 모든 4개의 tt값이 계산되기 이전에 필요없는 line segment를 버린다.


Parametric Representation of the Line

  • NiN_{i} : edge 표면의 법선 벡터, edge에서 바깥으로 직각(90o^{o})방향으로 향해야한다.

    • 왼쪽 edge일 경우 그림과 같은 형태
    • 밑쪽 edge일 경우 NiN_{i}는 아래쪽으로 향한다.
  • PEiP_{Ei} : edge EiE_{i}의 임의적인 점

  • [P(t)[P(t)-PEi]P_{Ei}] : PEiP_{Ei}점에서 P(t)P(t)점까지의 벡터, P(t)P(t)P0P_{0}에서 P1P_{1}까지 선에 존재하는 점


Vector



내적 계산법

오른쪽 그래프는 cosθcosθ의 그래프이다.
xx축은 θθ이며 π\pi/2 = 90o90^{o}이다.

  • Bcosθ|B|cosθ :: B\overrightarrow{B} 의 머리 위에서 조명이 비추고 생긴 그림자이다.
    즉, B\overrightarrow{B}의 그림자 길이 = Bcosθ|B|cosθ

  • 만약 B\overrightarrow{B}가 지면과 맞닿는다면 그림자의 길이는 B\overrightarrow{B}의 길이와 같을 것이다.
    즉, θθ == 00일 때 cosθcosθ == 11이고 B\overrightarrow{B}는 지면과 평행하다.

  • θθ < 90o90^{o} (예각) 이라면 cosθcosθ >> 00 이므로 A\overrightarrow{A}·B\overrightarrow{B} > 0

  • θθ = 90o90^{o} (직각) 이라면 cosθcosθ == 00 이므로 A\overrightarrow{A}·B\overrightarrow{B} = 0

  • θθ > 90o90^{o} (둔각) 이라면 cosθcosθ << 00 이므로 A\overrightarrow{A}·B\overrightarrow{B} < 0


  • NiN_{i}·[P(t)PEi][P(t)-P_{Ei}] < 0 : window의 내부
  • NiN_{i}·[P(t)PEi][P(t)-P_{Ei}] = 0 : window의 경계선에 P(t)P(t)가 위치
  • NiN_{i}·[P(t)PEi][P(t)-P_{Ei}] > 0 : window의 외부

How the Algorithm Works

  • 나눗셈을 계산할때 오차를 조심해야하며 분모가 0이 되면 안된다.

  • tt값을 구할때 NiN_{i}는 법선벡터이므로 길이가 보통 1인데 절대 0이 되어선 안된다

  • DD(선분의 distance : P1P_{1}-P0P_{0})도 0이 되어서는 안된다.

    • DD의 길이가 0이라면 선분이 될 수 없다. 0이라면 선분이 아닌 점이다.
  • NiN_{i}·DD도 0이 되어선 안된다

    • NiN_{i}·DD =0= 0 이라면 Edge와 NiN_{i}가 직각이다.
    • 즉, Edge와 선분[P1P0][P_{1}-P_{0}]이 평행하다는 뜻이므로 절대 평행하면 안된다.

  • 위의 식을 계산하여 00 \leq tt \leq 11 범위를 제외한 tt값은 버린다.

  • Clip 경계선에 있는 교차점을 결정해야 한다

  • 남은 t를 sorting하고, 교차되는 점들 중 중간 값을 선택해야 한다(Line1Line 1)

  • Line2Line2의 경우 중간값을 선택해도 edge에 속하는 점이 아니고, Line3Line3의 경우, 중간값이 4개나 있어 어떤 점을 선택할지 결정해야 한다.

  • PE : 들어가는 교차점

    • NiN_{i}·DD <0<0
    • NiN_{i}DD가 이루는 각도가 90o90^{o}이상인 둔각이어야한다.
  • PL : 들어가는 교차점

    • NiN_{i}·DD >0>0
    • NiN_{i}DD가 이루는 각도가 90o90^{o}이하인 예각이어야한다.
  • 두개의 교차점은 늘 반대되는 label(PL,PE)를 가진다

  • 교차되는 선분은 range(tEt_{E},tLt_{L})로 결정된다

  • tEt_{E} : 가장 t값이 큰 PE

  • tLt_{L} : 가장 t값이 작은 PL

  • 다각형 내의 선은 항상 tEt_{E} << tLt_{L}

    • 만약 tEt_{E} >> tLt_{L}이라면, Trivial rejected상태를 의미한다.

Cohen-Sutherland Algorithm vs Parametric Algorithm

  • Cohen-Sutherland Algorithm은 구현 난이도가 쉽다(단순하다)

  • Cohen-Sutherland Algorithm은 trivially rejected된 것도 clipping대상이 되어 불필요한 연산을 해야 한다, 한번에 선을 자르는 것이 아니라 여러번 해야 한다, 사각형처럼 9개의 region에서만 사용 가능하다

  • Parametric Algorithm은 모양의 다양성이 높다

  • t값이 음수 or 1보다 큰 양수인 경우, 불필요한 계산을 해야 한다

0개의 댓글