⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interval.cpp

📁 粗糙集应用软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -