这是测试两条线是否共线的正确方法吗?

时间:2011-11-11 03:35:05

标签: c++ class codeblocks

我在共线中的代码似乎不起作用,令我感到沮丧。我是否通过在我的积分课中使用两个点来最好地使用我的线类?我对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&);
};

4 个答案:

答案 0 :(得分:2)

  1. 您在两点之间存储线。线的斜率通常定义为

    slope = (y2 - y1) / ( x2 - x1 )

  2. 如果 x1 等于 x2 ,则可以将零除错误/异常。

    其他需要注意的事项

    1. 如果您将点坐标存储为整数,那么您可能只进行整数除法而不能达到预期的效果
    2. 如果您在整个过程中使用双打,请在比较时使用容差

答案 1 :(得分:1)

这里还不足以真正判断出现了什么问题,所以有一些概括:

  • 永远不要直接比较浮点值是否相等。它在一段惊人的时间内不会工作。相反,将它们的差异与如此小的数量进行比较,以便您将其称为“零”" (通常我们称之为" epsilon"):

    if (abs((num1 - num2)) < 0.001) {
        /* pretend they're equal */
    } else {
        /* not equal */
    }
    
  • 在此示例中,
  • line2是不必要的。您也可以直接从结论中返回truefalse。即使return truereturn 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);
    }
    

    在任何地方都没有truefalse硬编码 - 而是依靠条件的值来计算truefalse。 (顺便说一下,这些函数中的重复表明函数floating_comparison(double f1, double f2, double epsilon)可以使得更容易在项目范围内修改epsilon或根据所讨论的浮点数的绝对值来计算epsilon。 )

答案 2 :(得分:1)

我的猜测是,由于l1l2未初始化,他们的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
}