gpt4 book ai didi

c++ - 为什么这个表达式中的所有值都为零?

转载 作者:行者123 更新时间:2023-11-28 07:47:59 24 4
gpt4 key购买 nike

以下是用于推断两条线是否相交的程序片段。P 和 P2CPoint 对象,标记 2 条线之一的起点和终点。

double m1,m2;  //slopes
double b1,b2; //y-intercepts
double y,x; //intersection point

m1=(max(P.y,P2.y) - min(P.y,P2.y)) /( max(P.x,P2.x) - min(P.x,P2.x) );

出于某种原因,我总是将 m1 设置为 0。这是为什么?

最佳答案

如果您的 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/40,但您希望结果为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 上的独立函数:

double absoluteSlope(const CPoint & p, const CPoint & q) {
return abs<double>(p.y - q.y) / abs<double>(p.x - q.x);
}

更好的是,要使用 C++ 模板,请在具有成员 xy 的泛型类上实现它:

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 实例以及具有 float/double 坐标的(可能即将推出的)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);
}

关于c++ - 为什么这个表达式中的所有值都为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14485547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com