表格线识别通用库文档
载入中...
搜索中...
未找到
interval.hpp
浏览该文件的文档.
1/*
2 * @Description: 区间类 头文件及其实现
3 * @Version:
4 * @Autor: dreamy-xay
5 * @Date: 2023-12-01 15:02:12
6 * @LastEditors: dreamy-xay
7 * @LastEditTime: 2024-03-06
8 */
9
10#ifndef COMMON_INTERVAL_HPP
11#define COMMON_INTERVAL_HPP
12
13#include <iostream>
14#include <opencv2/core.hpp>
15
16#include "common/enum.h"
17#include "common/macro.h"
18#include "common/type.h"
19
20namespace cm {
21
29class Interval {
30 public:
32 int start;
34 int end;
35
58 private:
59 bool (*compare)(const Interval&, const Interval&);
60
61 public:
62 explicit CompareByLength(bool is_ascending = true);
63 bool operator()(const Interval& interval1, const Interval& interval2) const;
64 };
65
66 Interval();
67 Interval(int start, int end);
68 Interval(const Interval& interval);
69 Interval(const cv::Range& range);
70 ~Interval();
71
72 operator cv::Range() const;
73
74 friend bool operator==(const Interval& interval1, const Interval& interval2);
75 friend bool operator!=(const Interval& interval1, const Interval& interval2);
76 friend bool operator<(const Interval& interval1, const Interval& interval2);
77 friend bool operator>(const Interval& interval1, const Interval& interval2);
78 friend bool operator<=(const Interval& interval1, const Interval& interval2);
79 friend bool operator>=(const Interval& interval1, const Interval& interval2);
80
81 friend std::ostream& operator<<(std::ostream& out, const Interval& interval);
82
83 int Length() const;
84 template <typename T>
85 bool Include(T value) const;
86 double Middle() const;
87 bool IsValid(int min_interval_len = 1) const;
88 bool IsIntersect(const Interval& interval) const;
89 Interval Intersect(const Interval& interval) const;
90 Interval Union(const Interval& interval) const;
91 Interval& Translate(int start_trans_value, int end_trans_value);
92 Interval& Translate(int trans_value);
93
94 static Interval All();
95};
96
107 if (is_ascending)
108 compare = [](const Interval& interval1, const Interval& interval2) {
109 return interval1.Length() < interval2.Length();
110 };
111 else
112 compare = [](const Interval& interval1, const Interval& interval2) {
113 return interval1.Length() > interval2.Length();
114 };
115}
116
131inline bool Interval::CompareByLength::operator()(const Interval& interval1, const Interval& interval2) const {
132 return compare(interval1, interval2);
133}
134
142inline Interval::Interval() : start{}, end{} {}
143
154inline Interval::Interval(int start, int end) : start(start), end(end) {}
155
165inline Interval::Interval(const Interval& interval) : start(interval.start), end(interval.end) {}
166
176inline Interval::Interval(const cv::Range& range) : start(range.start), end(range.end) {}
177
186
196inline Interval::operator cv::Range() const {
197 return cv::Range(start, end);
198}
199
214inline bool operator==(const Interval& interval1, const Interval& interval2) {
215 return interval1.start == interval2.start && interval1.end == interval2.end;
216}
217
232inline bool operator!=(const Interval& interval1, const Interval& interval2) {
233 return interval1.start != interval2.start || interval1.end != interval2.end;
234}
235
250inline bool operator<(const Interval& interval1, const Interval& interval2) {
251 if (interval1.start == interval2.start)
252 return interval1.end < interval2.end;
253 return interval1.start < interval2.start;
254}
255
270inline bool operator>(const Interval& interval1, const Interval& interval2) {
271 if (interval1.start == interval2.start)
272 return interval1.end > interval2.end;
273 return interval1.start > interval2.start;
274}
275
290inline bool operator<=(const Interval& interval1, const Interval& interval2) {
291 if (interval1.start == interval2.start)
292 return interval1.end <= interval2.end;
293 return interval1.start < interval2.start;
294}
295
310inline bool operator>=(const Interval& interval1, const Interval& interval2) {
311 if (interval1.start == interval2.start)
312 return interval1.end >= interval2.end;
313 return interval1.start > interval2.start;
314}
315
328inline std::ostream& operator<<(std::ostream& out, const Interval& interval) {
329 out << '[' << interval.start << ", " << interval.end << ")";
330 return out;
331}
332
342inline int Interval::Length() const {
343 return end - start;
344}
345
363template <typename T>
364inline bool Interval::Include(T value) const {
365 return value >= start && value < end;
366}
367
377inline double Interval::Middle() const {
378 return (start + end - 1) / 2.0;
379}
380
394inline bool Interval::IsValid(int min_interval_len) const {
395 return end - start >= min_interval_len;
396}
397
413inline bool Interval::IsIntersect(const Interval& interval) const {
414 return this->Intersect(interval).Length() > 0;
415}
416
428inline Interval Interval::Intersect(const Interval& interval) const {
429 return {std::max(start, interval.start), std::min(end, interval.end)};
430}
431
443inline Interval Interval::Union(const Interval& interval) const {
444 return {std::min(start, interval.start), std::max(end, interval.end)};
445}
446
459inline Interval& Interval::Translate(int start_trans_value, int end_trans_value) {
460 start += start_trans_value;
461 end += end_trans_value;
462
463 return *this;
464}
465
477inline Interval& Interval::Translate(int trans_value) {
478 start += trans_value;
479 end += trans_value;
480
481 return *this;
482}
483
494 return {INT_MIN, INT_MAX};
495}
496
497} // namespace cm
498
499#endif
区间类
Definition interval.hpp:29
bool Include(T value) const
判断值是否被该区间包含
Definition interval.hpp:364
friend bool operator<(const Interval &interval1, const Interval &interval2)
区间类重载小于号
Definition interval.hpp:250
bool IsValid(int min_interval_len=1) const
判断区间是否有效
Definition interval.hpp:394
double Middle() const
获取区间中间值
Definition interval.hpp:377
int start
区间开始值(开区间)
Definition interval.hpp:32
~Interval()
区间类析构函数
Definition interval.hpp:185
int Length() const
获取区间长度
Definition interval.hpp:342
friend bool operator!=(const Interval &interval1, const Interval &interval2)
区间类重载不等于号
Definition interval.hpp:232
Interval Union(const Interval &interval) const
计算两个区间的并区间
Definition interval.hpp:443
friend std::ostream & operator<<(std::ostream &out, const Interval &interval)
区间类重载输出流运算符
Definition interval.hpp:328
Interval Intersect(const Interval &interval) const
计算两个区间的相交区间
Definition interval.hpp:428
friend bool operator>=(const Interval &interval1, const Interval &interval2)
区间类重载大于等于号
Definition interval.hpp:310
bool IsIntersect(const Interval &interval) const
判断两区间是否相交
Definition interval.hpp:413
friend bool operator>(const Interval &interval1, const Interval &interval2)
区间类重载大于号
Definition interval.hpp:270
int end
区间结束值(闭区间)
Definition interval.hpp:34
Interval & Translate(int start_trans_value, int end_trans_value)
区间的坐标平移
Definition interval.hpp:459
static Interval All()
获取表示全范围的区间
Definition interval.hpp:493
friend bool operator==(const Interval &interval1, const Interval &interval2)
区间类重载等于号
Definition interval.hpp:214
friend bool operator<=(const Interval &interval1, const Interval &interval2)
区间类重载小于等于号
Definition interval.hpp:290
Interval()
区间类的默认构造函数
Definition interval.hpp:142
bool operator>=(const Interval &interval1, const Interval &interval2)
区间类重载大于等于号
Definition interval.hpp:310
bool operator!=(const Interval &interval1, const Interval &interval2)
区间类重载不等于号
Definition interval.hpp:232
bool operator<(const Interval &interval1, const Interval &interval2)
区间类重载小于号
Definition interval.hpp:250
bool operator==(const Interval &interval1, const Interval &interval2)
区间类重载等于号
Definition interval.hpp:214
bool operator<=(const Interval &interval1, const Interval &interval2)
区间类重载小于等于号
Definition interval.hpp:290
std::ostream & operator<<(std::ostream &out, const Interval &interval)
区间类重载输出流运算符
Definition interval.hpp:328
bool operator>(const Interval &interval1, const Interval &interval2)
区间类重载大于号
Definition interval.hpp:270
区间的比较仿函数
Definition interval.hpp:57
CompareByLength(bool is_ascending=true)
区间的比较仿函数的带参构造函数
Definition interval.hpp:106
bool operator()(const Interval &interval1, const Interval &interval2) const
区间的比较仿函数重载括号运算符
Definition interval.hpp:131