如果你的CPoint
类是一个整数坐标的点,你必须在这里做一些转换才能得到你想要的结果。请参阅以下问题演示。考虑两点P = (1, 4)
和P2 = (5, 3)
:
m1=( max(P.y,P2.y) - min(P.y,P2.y) ) / ( max(P.x,P2.x) - min(P.x,P2.x) );
^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^
4 3 5 1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 4
但是,在整数除法中,1 / 4
是0
,但您希望结果是0.25
。结果变量具有类型的double
事实不会改变表达式的值(和类型) 。
要解决这个问题,您必须在表达式的各个部分被视为非整数之前对其进行转换。在您的情况下,这是除法的操作数,因此它将是浮点除法。(铸造除法的结果也无济于事。)
m1 = static_cast<double>( max(P.y,P2.y) - min(P.y,P2.y) )
/ static_cast<double>( max(P.x,P2.x) - min(P.x,P2.x) );
请注意,强制转换第二个操作数是可选的,因为double / int
始终使用浮点除法。
另请注意,您的表达式计算斜率的绝对值。您可能想要计算有符号斜率。
你可以在你的代码中改进的东西(这不会解决上面的问题):而不是减去差的最大值的最小值,只需取差的绝对值:
m1 = static_cast<double>( abs(P.y - P2.y) )
/ static_cast<double>( abs(P.x - P2.x) );
由于在 C++ 中,abs
是一个模板函数(在 C 中它是一个宏,呃...),您还可以使用显式模板类型强制结果类型:
m1 = abs<double>(P.y - P2.y)
/ abs<double>(P.x - P2.x);
此外,由于计算两个给定点之间的斜率似乎是一个常用函数,因此您可以将其实现为两个CPoint
s 上的独立函数:
double absoluteSlope(const CPoint & p, const CPoint & q) {
return abs<double>(p.y - q.y) / abs<double>(p.x - q.x);
}
更好的是,要使用 C++ 模板,请在具有成员x
和的泛型类上实现它y
:
template<class T>
double absoluteSlope(const T & p, const T & q) {
return abs<double>(p.y - q.y) / abs<double>(p.x - q.x);
}
此解决方案现在适用于您的CPoint
具有整数坐标的实例以及CPointF
具有浮点/双坐标的(可能即将推出的)类。
正如上面已经警告过的,这会计算绝对斜率。要将其更改为数学上正确(有符号)的斜率,只需替换abs
为static_cast
:
template<class T>
double slope(const T & p, const T & q) {
return static_cast<double>(p.y - q.y) / static_cast<double>(p.x - q.x);
}