1. Line Strip, 각 Point들의 Angle 얻기
위 그림에서
라고 할 경우, 두 벡터 V1
, V2
가 이루는 각은
이다.
프로그램 코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
float calcAngle(
const Point2D& p1,
const Point2D& p2,
const Point2D& p3,
) {
Vector2D v1 = p2 - p1;
Vector2D v2 = p2 - p3;
return acos(v1.dot(v2) / (v1.length() * v2.length()));
}
2. Line Strip에 접하는 원
위 그림의 Line Strip은 3개의 Angle이 생기고 따라서 3개의 내접원을 얻을 수 있다.
각 A
와 선분 AB
를 알고 있으므로 원의 반지름은 아래와 같이 얻을 수 있다.
원의 좌표에 대한 두 가지의 경우는 다음과 같다.
- CW(Clock Wise): 아래 그림의
B
- CCW(Counter Clock Wise): 아래 그림의
C
Line Strip L이 L(A, B, C, D)로 구성되어 있을 경우, 원O는 CW에 의해 생성되지만, 원P는 CCW에 의해 생성된다. 따라서 Line Strip에 포함된 3개의 점(그림 4의 경우, ABC 와 BCD)이 CCW로 감기는지, CW로 감기는지 알아야 한다. 이는 외적을 통해 알 수 있다.
라고 하자,
V1
과 V2
의 외적
을 구한다고 할 경우, 두 벡터 모두 2차원 평면상의 점이므로 (x, y, 0)의 형태로 표현된다.
따라서, 외적은 아래와 같이 표현할 수 있다.
여기서, C.z의 값이 0보다 작으면 CW, 0보다 크면 CCW라고 판단할 수 있다.
V1
과 수직이고, 원의 중심을 향하는 벡터 O
는 아래와 같이 표현할 수 있다.
이제 원의 좌표는
이다.
3. Curvature Based Stroke Thickness
아래 그림읜 Curvature Based Stroke Thickness
를 표현할 결과이다.
검은색 라인(중앙선)이 Input로 사용된 Line Strip이고, 붉은색 라인(중앙선을 중심으로 양쪽에 있는선)이 Thickness를 나타내는 Line이다.
Curvature
에 따른 Thickness
의 변화는 아래와 같다.
- X축: Curvature
- Y축: Thickness
Curvature에 따른 Thickness는 위의 수식을 기본으로 한다.
min
/max
를 적용하면 아래와 같다.
참고
- S. Saito et al., Curvature-based Stroke Rendering, Visual Comput (2008)