📄 interval.cpp
字号:
// Method........: IsBelow
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if this interval is "below" the input
// interval.
// Comments......: Interval validity assumed. Not thoroughly debugged.
// Revisions.....:
//===================================================================
bool
Interval::IsBelow(const Interval &interval) const {
return ((GetUpperValue() < interval.GetLowerValue()) ||
(GetUpperValue() == interval.GetLowerValue() && !(GetUpperDelimiter() == ToInclude() && interval.GetLowerDelimiter() == FromInclude())));
}
//-------------------------------------------------------------------
// Method........: Overlaps
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if this interval overlaps with the
// other interval.
// Comments......: Interval validity assumed. Not thoroughly debugged.
// Revisions.....:
//===================================================================
bool
Interval::Overlaps(const Interval &interval) const {
return (!IsBelow(interval) && !IsAbove(interval));
}
//-------------------------------------------------------------------
// Method........: Meets
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if this interval is adjacent to the
// input interval.
// Comments......: Interval validity assumed. Not thoroughly debugged.
// Revisions.....:
//===================================================================
bool
Interval::Meets(const Interval &interval) const {
return ((IsBelow(interval) && GetUpperValue() == interval.GetLowerValue()) ||
(IsAbove(interval) && GetLowerValue() == interval.GetUpperValue()));
}
//-------------------------------------------------------------------
// Method........: Contains
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if this interval fully covers the
// input interval.
// Comments......: Interval validity assumed.
// Revisions.....:
//===================================================================
bool
Interval::Contains(const Interval &interval) const {
return Contains(interval.GetLowerValue()) && Contains(interval.GetUpperValue());
}
//-------------------------------------------------------------------
// Method........: Contains
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns true if the interval contains (covers) the
// specified value.
// Comments......: Interval validity assumed.
// Revisions.....:
//===================================================================
bool
Interval::Contains(float value) const {
if ((GetLowerDelimiter() == From()) && (GetUpperDelimiter() == To()))
return ((GetLowerValue() < value) && (value < GetUpperValue()));
if ((GetLowerDelimiter() == FromInclude()) && (GetUpperDelimiter() == To()))
return ((GetLowerValue() <= value) && (value < GetUpperValue()));
if ((GetLowerDelimiter() == From()) && (GetUpperDelimiter() == ToInclude()))
return ((GetLowerValue() < value) && (value <= GetUpperValue()));
if ((GetLowerDelimiter() == FromInclude()) && (GetUpperDelimiter() == ToInclude()))
return ((GetLowerValue() <= value) && (value <= GetUpperValue()));
return false;
}
//-------------------------------------------------------------------
// Method........: Contains
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================
bool
Interval::Contains(const String &value) const {
return (value.IsFloat() && Contains(value.GetFloat()));
}
//-------------------------------------------------------------------
// Quantitative querying methods.
//===================================================================
//-------------------------------------------------------------------
// Method........: GetLength
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......: Interval validity assumed.
// Revisions.....:
//===================================================================
float
Interval::GetLength() const {
// Infinite length?
if (GetLowerValue() == -FLT_MAX || GetUpperValue() == FLT_MAX)
return FLT_MAX;
return (GetUpperValue() - GetLowerValue());
}
//-------------------------------------------------------------------
// Method........: GetMidpoint
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......: Interval validity assumed.
// Revisions.....:
//===================================================================
float
Interval::GetMidpoint() const {
// Infinite length?
if (GetLowerValue() == -FLT_MAX && GetUpperValue() == FLT_MAX)
return 0.0;
else if (GetLowerValue() == -FLT_MAX)
return -FLT_MAX;
else if (GetUpperValue() == FLT_MAX)
return FLT_MAX;
// Finite length.
return 0.5f * (GetUpperValue() + GetLowerValue());
}
//-------------------------------------------------------------------
// Method........: GetDistance
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Returns the distance between the interval and a
// given value.
// Comments......: Interval validity assumed.
// Revisions.....:
//===================================================================
float
Interval::GetDistance(float value) const {
if (Contains(value))
return 0.0;
float ldist = (GetLowerValue() == -FLT_MAX) ? FLT_MAX : fabs(value - GetLowerValue());
float udist = (GetUpperValue() == FLT_MAX) ? FLT_MAX : fabs(value - GetUpperValue());
return (ldist < udist) ? ldist : udist;
}
//-------------------------------------------------------------------
// Formatting methods.
//===================================================================
//-------------------------------------------------------------------
// Method........: Format
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================
bool
Interval::Format(String &formatted) const {
formatted = "";
String lower = String::Format(GetLowerValue());
String upper = String::Format(GetUpperValue());
if (lower.IsInteger())
lower = String::Format(lower.GetInteger());
if (upper.IsInteger())
upper = String::Format(upper.GetInteger());
// Format range.
if (GetLowerValue() == -FLT_MAX)
formatted += Infinity();
else
formatted += lower;
formatted += Separator();
formatted += ' ';
if (GetUpperValue() == FLT_MAX)
formatted += Infinity();
else
formatted += upper;
// Wrap delimiters around range.
formatted = GetLowerDelimiter() + formatted + GetUpperDelimiter();
return true;
}
//-------------------------------------------------------------------
// Method........: Format
// Author........: Aleksander 豩rn
// Date..........:
// Description...:
// Comments......:
// Revisions.....:
//===================================================================
String
Interval::Format() const {
String formatted;
if (!Format(formatted))
formatted = Undefined::String();
return formatted;
}
//-------------------------------------------------------------------
// Miscellanous methods.
//===================================================================
//-------------------------------------------------------------------
// Method........: MakeInterval
// Author........: Aleksander 豩rn
// Date..........:
// Description...: Creates the interval. Returns true if everything
// is OK.
// Comments......:
// Revisions.....:
//===================================================================
bool
Interval::MakeInterval(char ldelimiter, float lvalue, float uvalue, char udelimiter) {
bool ok = true;
// Set delimiters.
if (!SetLowerDelimiter(ldelimiter))
ok = false;
if (!SetUpperDelimiter(udelimiter))
ok = false;
// Set values.
if (!SetLowerValue(lvalue))
ok = false;
if (!SetUpperValue(uvalue))
ok = false;
// Check validity of interval.
if (!IsValid())
ok = false;
return ok;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -