我在共线中的代码似乎不起作用,令我感到沮丧。我是否通过在我的积分课中使用两个点来最好地使用我的线类?我对colinearlirty的测试正在崩溃,所以我在过去的几天里陷入了困境。
bool line::isColinear(line)
{
bool line2=false;
line l1,l2;
if (l1.slope()==l2.slope())
{
if (l1.y_int()==l2.y_int())
{
line2 =true;
return line2;
}
}
else
{
line2 =false;
}
}
//下面是我的线类的副本
class line
{
private:
point p1,p2;
public:
bool isColinear(line);
bool isParallel(line);
point solve(line);
double slope();
double y_int();
void Display(ostream&);
};
答案 0 :(得分:2)
您在两点之间存储线。线的斜率通常定义为
slope = (y2 - y1) / ( x2 - x1 )
如果 x1 等于 x2 ,则可以将零除错误/异常。
其他需要注意的事项
答案 1 :(得分:1)
这里还不足以真正判断出现了什么问题,所以有一些概括:
永远不要直接比较浮点值是否相等。它在一段惊人的时间内不会工作。相反,将它们的差异与如此小的数量进行比较,以便您将其称为“零”" (通常我们称之为" epsilon"):
if (abs((num1 - num2)) < 0.001) {
/* pretend they're equal */
} else {
/* not equal */
}
line2
是不必要的。您也可以直接从结论中返回true
或false
。即使return true
或return false
通常也会不必要地混淆。让我们假设你稍微重写这个方法三个方法。 (这可能会或可能不会有所改善。只需假设一点。)
bool line::compare_slope(line l2) {
return fabs((l2.slope() - self.slope()) < 0.001; // don't hardcode this
}
bool line::compare_origin(line l2) {
return fabs((l2.y_int() - self.y_int()) < 0.001; // nor this
}
bool line::is_colinear(line l2) {
return compare_slope(l2) && compare_origin(l2);
}
在任何地方都没有true
或false
硬编码 - 而是依靠条件的值来计算true
或false
。 (顺便说一下,这些函数中的重复表明函数floating_comparison(double f1, double f2, double epsilon)
可以使得更容易在项目范围内修改epsilon或根据所讨论的浮点数的绝对值来计算epsilon。 )
答案 2 :(得分:1)
我的猜测是,由于l1
和l2
未初始化,他们的slope
方法正在除以零。正确初始化或切换到正确的变量,你就可以修复崩溃。
即使你开始工作,测试也可能会失败。您无法比较浮点数并期望它们相等,即使看起来它们应该相等。你应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。
答案 3 :(得分:0)
一条线的简单公式(在2D中)(从here派生)是:
P1(x1,y1)和P2(x2,y2)是决定该线的点。
(y-y1)(x2-x1)+(y1-y2)(x-x1)= 0(让我们用f(x,y)= 0)
测试两条线是否匹配,想象第二条线由点P3(x3,y3),P4(x4,y4)定义。
为了确保这些线条“相当”相同,你应该测试确定第二条线的两个点(P3,P4)是否与前一条线“足够”。
这很容易通过计算f(x3,y3)和f(x4,y4)来完成。如果这些值接近0,则线条相同。
Pseudocode:
// I would chose tolerance around 1
if ( f(x3,y3) < tolerance && f(x4,y4) < tolerance )
{
// line P1,P2 is the same as P3,P4
}