14 std::vector<uint16_t>& indices)
15 : points_(points), indices_(indices) {}
18 if (points_.size() == 0u || contour_start_ == points_.size() - 1) {
23 auto start = contour_start_;
24 auto end = points_.size() - 1;
29 if (points_[end] == points_[start]) {
34 if (contour_start_ != 0) {
35 auto back = indices_.back();
36 indices_.push_back(back);
37 indices_.push_back(start);
38 indices_.push_back(start);
43 if (previous_contour_odd_points_) {
44 indices_.push_back(start);
47 indices_.push_back(start);
53 indices_.push_back(a);
54 indices_.push_back(
b);
59 indices_.push_back(a);
60 previous_contour_odd_points_ =
false;
62 previous_contour_odd_points_ =
true;
64 contour_start_ = points_.size();
68 points_.push_back(point);
76 return p0 + t * (p1 - p0);
80 return (1 - t) * (1 - t) * p0 +
81 2 * (1 - t) * t * p1 +
89 return 2 * (1 - t) * (p1 - p0) +
98 return (1 - t) * (1 - t) * (1 - t) * p0 +
99 3 * (1 - t) * (1 - t) * t * p1 +
100 3 * (1 - t) * t * t * p2 +
109 return -3 * p0 * (1 - t) * (1 - t) +
110 p1 * (3 * (1 - t) * (1 - t) - 6 * (1 - t) * t) +
111 p2 * (6 * (1 - t) * t - 3 * t * t) +
123 std::vector<Point>& points)
const {
124 if (points.size() == 0 || points.back() !=
p2) {
125 points.push_back(
p2);
137 return (
p1 -
p2).Normalize();
144 return (
p2 -
p1).Normalize();
165 for (
size_t i = 1; i < line_count; i += 1) {
173 std::vector<Point>& points)
const {
175 points.emplace_back(point);
184 for (
size_t i = 1; i < line_count; i += 1) {
185 proc(
Solve(i / line_count));
197 return (
p1 -
cp).Normalize();
200 return (
p1 -
p2).Normalize();
207 return (
p2 -
cp).Normalize();
210 return (
p2 -
p1).Normalize();
231 std::vector<Point>& points)
const {
233 scale, [&points](
const Point& point) { points.emplace_back(point); });
239 for (
size_t i = 1; i < line_count; i++) {
254 auto scale = (t1 - t0) * (1.0 / 3.0);
255 auto p1 = p0 +
scale * d.Solve(t0);
256 auto p2 = p3 -
scale * d.Solve(t1);
263 for (
size_t i = 1; i < line_count; i++) {
264 proc(
Solve(i / line_count));
270 return (a > (
b - epsilon)) && (a < (
b + epsilon));
282 const Scalar a = 3.0 * (-p1 + 3.0 * p2 - 3.0 * p3 + p4);
283 const Scalar b = 6.0 * (p1 - 2.0 * p2 + p3);
284 const Scalar c = 3.0 * (p2 - p1);
295 if (t >= 0.0 && t <= 1.0) {
296 values.emplace_back(t);
301 Scalar b2Minus4AC = (
b *
b) - (4.0 * a * c);
303 if (b2Minus4AC < 0.0) {
307 Scalar rootB2Minus4AC = ::sqrt(b2Minus4AC);
315 Scalar q = (
b < 0) ? -(
b - rootB2Minus4AC) / 2 : -(
b + rootB2Minus4AC) / 2;
319 if (t >= 0.0 && t <= 1.0) {
320 values.emplace_back(t);
326 if (t >= 0.0 && t <= 1.0) {
327 values.emplace_back(t);
336 std::vector<Scalar> values;
341 std::vector<Point> points = {
p1,
p2};
343 for (
const auto& value : values) {
344 points.emplace_back(
Solve(value));
352 return (
p1 -
cp1).Normalize();
355 return (
p1 -
cp2).Normalize();
358 return (
p1 -
p2).Normalize();
365 return (
p2 -
cp2).Normalize();
368 return (
p2 -
cp1).Normalize();
371 return (
p2 -
p1).Normalize();