- ์ถ์ฒ ๋ฌธ์ - Convex Hull
- [BOJ] Convex Hull of Lattice Points (์์ค์ฝ๋) - Convex Hull ๋์ ๋ฐฉ์ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ์์ฉํ๋ ๋ฌธ์
- [BOJ] Building the Moat (์์ค์ฝ๋) - Convex Hull ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ๊ตฌํ ๋ค๊ฐํ์ ๋๋ ๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์ (1)
- [BOJ] Wall construction (์์ค์ฝ๋) - Convex Hull ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ๊ตฌํ ๋ค๊ฐํ์ ๋๋ ๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์ (2)
- [BOJ] Wall (์์ค์ฝ๋) - Convex Hull ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ๊ตฌํ ๋ค๊ฐํ์ ๋๋ ๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์ (3) (๋ฐ์ฌ๋ฆผ ์ฃผ์)
- [BOJ] Cows (์์ค์ฝ๋) - Convex Hull ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ๊ตฌํ ๋ค๊ฐํ์ ๋๋ ๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์ (4)
- ์ถ์ฒ ๋ฌธ์ - Rotating Calipers
- [BOJ] Robert Hood (์์ค์ฝ๋) - ํ์ ํ๋ ์บ๋ฆฌํผ์ค๋ฅผ ์ฌ์ฉํด ๊ฐ์ฅ ๋จผ ๋ ์ ๊ณ์ฐ(1)
- [BOJ] Squares (์์ค์ฝ๋) - ํ์ ํ๋ ์บ๋ฆฌํผ์ค๋ฅผ ์ฌ์ฉํด ๊ฐ์ฅ ๋จผ ๋ ์ ๊ณ์ฐ(2)
- [BOJ] Highway (์์ค์ฝ๋) - ํ์ ํ๋ ์บ๋ฆฌํผ์ค๋ฅผ ์ฌ์ฉํด ๊ฐ์ฅ ๋จผ ๋ ์ ๊ณ์ฐ(3)
- [BOJ] ๋ฌ๋ฆฌ๊ธฐ ์ฝ์ค (์์ค์ฝ๋) - ํ์ ํ๋ ์บ๋ฆฌํผ์ค๋ฅผ ์ฌ์ฉํด ๊ฐ์ฅ ๋จผ ๋ ์ ๊ณ์ฐ(4)
- [BOJ] Breaking Biscuits (์์ค์ฝ๋) - ํ์ ํ๋ ์บ๋ฆฌํผ์ค + ์ ๊ณผ ๋ฒกํฐ ๊ฐ ์ต๋จ๊ฒฝ๋ก ๊ณ์ฐ
- [WIP]์ถ์ฒ ๋ฌธ์ - Point in Convex Polygon
- [BOJ] JABUKE (์์ค์ฝ๋) - ์ผ๊ฐํ ๋ด ์ ์ ์กด์ฌ ์ ๋ฌด ํ๋ณ ๋ฌธ์
- [BOJ] ๋ฏธ์คํ ๋ฆฌ ์ธ์ธ (์์ค์ฝ๋) - ๋ค๊ฐํ ๋ด ์ ์ ์กด์ฌ ์ ๋ฌด ํ๋ณ ๋ฌธ์ 1
- [BOJ] Saint John Festival (์์ค์ฝ๋) - ๋ค๊ฐํ ๋ด ์ ์ ์กด์ฌ ์ ๋ฌด ํ๋ณ ๋ฌธ์ 2
- [BOJ] Separate Points (์์ค์ฝ๋) - ๋ค๊ฐํ ๋ด ์ ์ ์กด์ฌ ์ ๋ฌด ํ๋ณ ๋ฌธ์ + ์ ๋ถ ๊ต์ฐจ ํ์
- 2์ฐจ์ ํ๋ฉด ์์ ์ขํ x, y๊ฐ ์ฃผ์ด์ง ๋, y ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋, y ์ขํ๊ฐ ๋์ผํ๋ค๋ฉด x ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
- ๊ธฐ์ค ์ขํ(๋ณดํต 0 ๋ฒ์งธ index๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํจ)๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ์ ๋ ฌํ๋ค:
- CCW ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ ๋ ์์๋ ๋ฐ์๊ณ ๋ฐฉํฅ, ์์๋ ์๊ณ ๋ฐฉํฅ์ ๋ํ๋
- ๋ง์ฝ 0์ด ๋์จ๋ค๋ฉด, ๊ธฐ์ค ์ขํ๋ก๋ถํฐ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ ์์ผ๋ก ์ ๋ ฌ
-
Graham's Scan์ ์ฌ์ฉํด ์ธ๊ณฝ ์ขํ๋ฅผ ์ฐพ๋๋ค:
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
// iostream
using std::cin;
using std::cout;
// vector
using std::vector;
// utility
using std::pair;
// algorithm
using std::sort;
pair<int, int> starting_point;
bool CmpCoor(const pair<int, int>&,
const pair<int, int>&);
bool CmpCcw(const pair<int, int>&,
const pair<int, int>&);
int64_t CalcCcw(const pair<int, int>&,
const pair<int, int>&,
const pair<int, int>&);
int64_t CalcSqDist(const pair<int, int>&,
const pair<int, int>&);
int main() {
int n;
cin >> n;
vector<pair<int, int>> v(n);
for (int i = 0; i < n; ++i)
cin >> v[i].first >> v[i].second;
// find the point with the lowest y-coordinate. (v[0], starting_point)
sort(v.begin(), v.end(), CmpCoor);
starting_point = v.front();
// the set of points must be sorted in increasing order of the angle they and
// the point P make with the x-axis
sort(v.begin() + 1, v.end(), CmpCcw);
// Graham's scan
vector<pair<int, int>> convex_hull;
for (const auto& p : v) {
while (convex_hull.size() >= 2) {
if (CalcCcw(convex_hull[convex_hull.size()-2], convex_hull.back(), p) > 0)
break;
convex_hull.pop_back();
}
convex_hull.push_back(p);
}
cout << convex_hull.size();
return 0;
}
bool CmpCoor(const pair<int, int>& s,
const pair<int, int>& t) {
if (s.second < t.second)
return true;
if (s.second == t.second && s.first < t.first)
return true;
return false;
}
bool CmpCcw(const pair<int, int>& s,
const pair<int, int>& t) {
int64_t res = CalcCcw(starting_point, s, t);
if (res)
return res > 0; // ccw : true, cw : false
// res = 0
int64_t dist1 = CalcSqDist(s, starting_point);
int64_t dist2 = CalcSqDist(t, starting_point);
return dist1 < dist2;
}
// ccw : pos.
// on the line : 0
// cw : neg.
int64_t CalcCcw(const pair<int, int>& a,
const pair<int, int>& b,
const pair<int, int>& c) {
int64_t u1 = b.first - a.first;
int64_t v1 = b.second - a.second;
int64_t u2 = c.first - a.first;
int64_t v2 = c.second - a.second;
return u1 * v2 - u2 * v1;
}
int64_t CalcSqDist(const pair<int, int>& s,
const pair<int, int>& t) {
int64_t diff_x = s.first - t.first;
int64_t diff_y = s.second - t.second;
return diff_x * diff_x + diff_y * diff_y;
}
- ์ปจ๋ฒก์ค ํ์ ํตํด ์ธ๊ฐ ์ ๋ค์ ๊ตฌํ๋ค.
- x์ถ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ผํธ์ ์์นํ๋ ์ ๊ณผ ๊ฐ์ฅ ์ค๋ฅธํธ์ ์์นํ๋ ์ ์ ๊ตฌํ๋ค.
0, 1, ..., idx_l, idx_l+1, ..., idx_r, idx_r+1, ...
- ๊ฐ์ฅ ์ผํธ ๋ฒกํฐ(
idx_l+1 - idx_l
)์ ๊ฐ์ฅ ์ค๋ฅธํธ ๋ฒกํฐ(idx_r - idx_r+1
)๋ฅผ ์ฌ์ฉํด ๊ธฐ์ค ๋ฒกํฐ(์ต์ด์ ๊ธฐ์ค ๋ฒกํฐ๋ x์ถ ๋ฒ์ ๋ฒกํฐ)์์ ๊ฐ์ ๊ณ์ฐํ ๋ค, ๊ฐ์ด ๋ ์์ ๋ฐฉํฅ์ผ๋ก ํ์์ ์งํํ๋ค. - ๋ง์ฝ ๊ธฐ์ค ๋ฒกํฐ์ ์ผํธ ๋ฒกํฐ ์ฌ์ด์ ๊ฐ์ด ๋ ์์์ ๊ฒฝ์ฐ, ์ผํธ ๋ฒกํฐ๋
idx_l+2 - idx_l+1
๋ก ๊ฐฑ์ ๋๋ฉฐ, ๊ธฐ์ค ๋ฒกํฐ๋idx_l+1 - idx_l
๋ก ๊ฐฑ์ - ๋ง์ฝ ๊ธฐ์ค ๋ฒกํฐ์ ์ค๋ฅธํธ ๋ฒกํฐ ์ฌ์ด์ ๊ฐ์ด ๋ ์์์ ๊ฒฝ์ฐ, ์ค๋ฅธํธ ๋ฒกํฐ๋
idx_r-1 - idx_r
๋ก ๊ฐฑ์ ๋๋ฉฐ, ๊ธฐ์ค ๋ฒกํฐ๋idx_r - idx_r+1
๋ก ๊ฐฑ์ - 3๋ฒ ๊ณผ์ ์ ํตํด ์ธ๊ฐ ์ ๋ค๋ก ๊ตฌ์ฑ๋ ๋ํ์ ๋ณ ์๋งํผ ์งํํ๋ค.
-
์ ๊ณผ์ ์ ๋ฌธ์ ์ :
-
๊ธฐ์ค ๋ฒกํฐ์ ๋์ ๋ฒกํฐ์์ ๊ฐ์ ๊ณ์ฐํ๋ ๊ณผ์ ์ ๊ฒฐ๊ณผ๋
double
์ด๋ฉฐ, ์ด๋ ์ค์๋ฒ์ ์ค์ฐจ๊ฐ ๋ฐ์ํด ๊ฒฐ๊ณผ๊ฐ ์๋ชป ๋์ฌ ์ ์์ -
๋ ๋ฒกํฐ์ ์ธ์ ์ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ณผ๋ ์ ์ํ์ด๋ฉฐ, ์ค์ฐจ ๋ฐ์์ ์ํ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ์๋ฐฉํ ์ ์์
-
๊ธฐ์ค ๋ฒกํฐ์์ ๊ฐ์ ๊ตฌํ๊ณ ์ ํ๋ ๋ ๋ฒกํฐ ๊ฐ ์ธ์ ๊ฒฐ๊ณผ๋ฅผ ํตํด ๊ธฐ์ค ๋ฒกํฐ์์ ๊ฐ์ด ๋ ์์ ๋ฒกํฐ๋ฅผ ๊ณ์ฐํ ์ ์์:
- ์ผํธ ๋ฒกํฐ๋ฅผ
i
, ์ค๋ฅธํธ ๋ฒกํฐ๋ฅผj
์ด๋ผ๊ณ ํ๋ค๋ฉด, ๋ ๋ฒกํฐ์ ์ธ์ ๊ฒฐ๊ณผ๊ฐ ์์์ผ ๋i
๋ฒกํฐ๋ฅผ, ๋ ๋ฒกํฐ์ ์ธ์ ๊ฒฐ๊ณผ๊ฐ ์์์ผ ๋j
๋ฒกํฐ๋ฅผ ๊ฐฑ์
- ์ผํธ ๋ฒกํฐ๋ฅผ
-
์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ ๋ฒกํฐ์ ์ธ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ๋ฒกํฐ ๊ฐฑ์ ๋ง ์งํํ๋ฉด ๋๋ฉฐ, ๊ธฐ์ค ๋ฒกํฐ์ ๊ฐฑ์ ์ ํ์ํ์ง ์์
-
-
์์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฒกํฐ๋ฅผ ๊ฐฑ์ ํ๋ ์ด์ ๋, ํฐ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฒกํฐ๋ฅผ ๊ฐฑ์ ํ ๊ฒฝ์ฐ ๋ ๋ฒกํฐ ์ค ํ๋๊ฐ ๊ธฐ์ค ๋ฒกํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐ์ด ๋์ฌ ์ ์์
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
// iostream
using std::cin;
using std::cout;
// vector
using std::vector;
// utility
using std::pair;
// algorithm
using std::sort;
pair<int, int> starting_point;
bool CmpCoor(const pair<int, int>&,
const pair<int, int>&);
bool CmpCcw(const pair<int, int>&,
const pair<int, int>&);
int64_t CalcCcw(const pair<int, int>&,
const pair<int, int>&,
const pair<int, int>&);
int64_t CalcSqDist(const pair<int, int>&,
const pair<int, int>&);
int main() {
int n;
cin >> n;
vector<pair<int, int>> v(n);
for (int i = 0; i < n; ++i)
cin >> v[i].first >> v[i].second;
// find the point with the lowest y-coordinate. (v[0], starting_point)
sort(v.begin(), v.end(), CmpCoor);
starting_point = v.front();
// the set of points must be sorted in increasing order of the angle they
// and the point P make with the x-axis
sort(v.begin() + 1, v.end(), CmpCcw);
// Graham's scan
vector<pair<int, int>> convex_hull;
for (const auto& p : v) {
while (convex_hull.size() >= 2) {
if (CalcCcw(convex_hull[convex_hull.size()-2], convex_hull.back(), p) > 0)
break;
convex_hull.pop_back();
}
convex_hull.push_back(p);
}
// Rotating calipers
int left_i = 0;
int right_i = 0;
int n_edge = convex_hull.size();
for (int i = 0; i < n_edge; ++i) {
if (convex_hull[i].first < convex_hull[left_i].first)
left_i = i;
if (convex_hull[i].first > convex_hull[right_i].first)
right_i = i;
}
int64_t longest_dist = CalcSqDist(convex_hull[left_i], convex_hull[right_i]);
pair<int, int> left_coor = convex_hull[left_i];
pair<int, int> right_coor = convex_hull[right_i];
pair<int, int> origin = { 0, 0 };
for (int i = 0; i < n_edge; ++i) {
pair<int, int> left_vector = {
convex_hull[(left_i + 1)%n_edge].first - convex_hull[left_i].first,
convex_hull[(left_i + 1)%n_edge].second - convex_hull[left_i].second
};
pair<int, int> right_vector = {
convex_hull[right_i].first - convex_hull[(right_i + 1)%n_edge].first,
convex_hull[right_i].second - convex_hull[(right_i + 1)%n_edge].second
};
if (CalcCcw(origin, left_vector, right_vector) > 0)
left_i = (left_i + 1) % n_edge;
else
right_i = (right_i + 1) % n_edge;
if (longest_dist < CalcSqDist(convex_hull[left_i], convex_hull[right_i])) {
longest_dist = CalcSqDist(convex_hull[left_i], convex_hull[right_i]);
left_coor = convex_hull[left_i];
right_coor = convex_hull[right_i];
}
}
cout << longest_dist;
return 0;
}
bool CmpCoor(const pair<int, int>& s,
const pair<int, int>& t) {
if (s.second < t.second)
return true;
if (s.second == t.second && s.first < t.first)
return true;
return false;
}
bool CmpCcw(const pair<int, int>& s,
const pair<int, int>& t) {
int64_t res = CalcCcw(starting_point, s, t);
if (res)
return res > 0; // ccw : true, cw : false
// res = 0
int64_t dist1 = CalcSqDist(s, starting_point);
int64_t dist2 = CalcSqDist(t, starting_point);
return dist1 < dist2;
}
// ccw : pos.
// on the line : 0
// cw : neg.
int64_t CalcCcw(const pair<int, int>& a,
const pair<int, int>& b,
const pair<int, int>& c) {
int64_t u1 = b.first - a.first;
int64_t v1 = b.second - a.second;
int64_t u2 = c.first - a.first;
int64_t v2 = c.second - a.second;
return u1 * v2 - u2 * v1;
}
int64_t CalcSqDist(const pair<int, int>& s,
const pair<int, int>& t) {
int64_t diff_x = s.first - t.first;
int64_t diff_y = s.second - t.second;
return diff_x * diff_x + diff_y * diff_y;
}
- ์ค๋ฅ ์์ :
idx = 0
,๊ทธ๋ฆผ
-
์ปจ๋ฒก์ค ํ์ ํตํด ์ธ๊ฐ ์ ๋ค์ ๊ตฌํ๋ค.
-
์ ์ด ์ปจ๋ฒก์ค ํ ๋ด์ ์กด์ฌํ๋์ง ํ๋ณํ๋ค:
- ๋ชจ๋ ๋ฒกํฐ์ ๊ธฐ์ค์ ์ ์ปจ๋ฒก์ค ํ์
0
๋ฒ ์ขํ์ด๋ค. - ์์์ ์ ์ด ๊ธฐ์ค์ ์ ์ผ์ชฝ ๋ฒกํฐ์์ ์ธ์ ๊ฒฐ๊ณผ๊ฐ ์์๋ผ๋ฉด, ํด๋น ์ ์ ๋ํ ์ธ๋ถ์ ์๋ ๊ฒ์ด๋ค.
- ์์์ ์ ์ด ๊ธฐ์ค์ ์ ์ค๋ฅธ์ชฝ ๋ฒกํฐ์์ ์ธ์ ๊ฒฐ๊ณผ๊ฐ ์์๋ผ๋ฉด, ํด๋น ์ ์ ๋ํ ์ธ๋ถ์ ์๋ ๊ฒ์ด๋ค.
- ์ด๋ถํ์์ ํตํด ์ ์ด ์์นํ ์ ์๋ ์์ญ์ ์ฐพ๋๋ค. ๋ง์ฝ ์ปจ๋ฒก์ค ํ์ ๊ฐ์๊ฐ
n
๊ฐ๋ผ๋ฉด, ์ด๋ถํ์์ ๋ฒ์๋[1, n)
์ด ๋๋ค. - ์์์ ์ (
p
)์ด ์์นํ ์ ์๋ ์์ญ์ ๋ฐ๊ฒฌํ๋ค๋ฉด,convex_hull[idx], p, convex_hull[idx+1]
์ธ ์ ์ ๋ํด ์ธ์ ํ๋ค:- ์ธ์ ๊ฒฐ๊ณผ๊ฐ ์์๋ผ๋ฉด ํด๋น ์ ์ ๋ํ ์ธ๋ถ์ ์๋ ๊ฒ์ด๋ค.
- ์ธ์ ๊ฒฐ๊ณผ๊ฐ ์์๋ผ๋ฉด ํด๋น ์ ์ ๋ํ ๋ด๋ถ์, 0์ด๋ผ๋ฉด ํด๋น ์ ์ ๋ํ ๊ฒฝ๊ณ์ ๊ฑธ์ฒ์๋ ๊ฒ์ด๋ค.
- ๋ชจ๋ ๋ฒกํฐ์ ๊ธฐ์ค์ ์ ์ปจ๋ฒก์ค ํ์
/*
Copyright 2022 Ryan M. Jeong <[email protected]>
*/
// CP
#define CP do { \
std::ios::sync_with_stdio(false); \
std::cin.tie(NULL); \
} while (0)
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
// iostream
using std::cin;
using std::cout;
using std::fixed;
// vector
using std::vector;
// utility
using std::pair;
// algorithm
using std::sort;
pair<int, int> starting_point;
bool CmpCoor(const pair<int, int>&,
const pair<int, int>&);
bool CmpCcw(const pair<int, int>&,
const pair<int, int>&);
int64_t CalcCcw(const pair<int, int>&,
const pair<int, int>&,
const pair<int, int>&);
int64_t CalcSqDist(const pair<int, int>&,
const pair<int, int>&);
int64_t PointInPolygon(const vector<pair<int, int>>& convex_hull,
const pair<int, int>&);
int main() {
CP;
int n = 3;
vector<pair<int, int>> v(n);
for (auto& i : v)
cin >> i.first >> i.second;
// find the point with the lowest y-coordinate. (v[0], starting_point)
sort(v.begin(), v.end(), CmpCoor);
starting_point = v.front();
// the set of points must be sorted in increasing order of the angle they and
// the point P make with the x-axis
sort(v.begin() + 1, v.end(), CmpCcw);
// Graham's scan
vector<pair<int, int>> convex_hull;
for (const auto& p : v) {
while (convex_hull.size() >= 2) {
if (CalcCcw(convex_hull[convex_hull.size()-2], convex_hull.back(), p) > 0)
break;
convex_hull.pop_back();
}
convex_hull.push_back(p);
}
int m;
cin >> m;
// Determine if a point is inside a polygon
int cnt = 0;
while (m--) {
static pair<int, int> p;
cin >> p.first >> p.second;
if (PointInPolygon(convex_hull, p) > 0)
continue;
++cnt;
}
cout << fixed;
cout.precision(1);
cout << static_cast<double>(CalcCcw(
convex_hull[0], convex_hull[1], convex_hull[2])) / 2 << '\n';
cout << cnt;
return 0;
}
bool CmpCoor(const pair<int, int>& s,
const pair<int, int>& t) {
if (s.second < t.second)
return true;
if (s.second == t.second && s.first < t.first)
return true;
return false;
}
bool CmpCcw(const pair<int, int>& s,
const pair<int, int>& t) {
int64_t res = CalcCcw(starting_point, s, t);
if (res)
return res > 0; // ccw : true, cw : false
// res = 0
int64_t dist1 = CalcSqDist(s, starting_point);
int64_t dist2 = CalcSqDist(t, starting_point);
return dist1 < dist2;
}
/* ccw : pos.
on the line : 0
cw : neg. */
int64_t CalcCcw(const pair<int, int>& a,
const pair<int, int>& b,
const pair<int, int>& c) {
int64_t u1 = b.first - a.first;
int64_t v1 = b.second - a.second;
int64_t u2 = c.first - a.first;
int64_t v2 = c.second - a.second;
return u1 * v2 - u2 * v1;
}
int64_t CalcSqDist(const pair<int, int>& s,
const pair<int, int>& t) {
int64_t diff_x = s.first - t.first;
int64_t diff_y = s.second - t.second;
return diff_x * diff_x + diff_y * diff_y;
}
// the value of return is positive: outside of the polygon
// the value of return is zero: lie on the line of the polygon
// the value of return is negative: inside of the polygon
int64_t PointInPolygon(const vector<pair<int, int>>& convex_hull,
const pair<int, int>& p) {
// check right-side
if (CalcCcw(convex_hull.front(), convex_hull[1], p) < 0)
return 1;
// check left-side
if (CalcCcw(convex_hull.front(), convex_hull.back(), p) > 0)
return 1;
// find a section which contains the point:
// direction: ccw
// low: right-side
// high: left-side
// idx: 1, For the case where the point lies on the line(a vector from 0 to 1)
int low = 1;
int high = convex_hull.size(); // [low, high)
int idx = 1;
while (low < high) {
int mid = (low + high) / 2;
if (CalcCcw(convex_hull.front(), convex_hull[mid], p) > 0) {
idx = mid;
low = mid + 1;
} else {
high = mid;
}
}
return CalcCcw(convex_hull[idx], p, convex_hull[idx+1]);
}
์ด์ - String | ๋ชฉ๋ก | ๋ค์ - ์์ |
---|