非轴交叉线性函数方程

equation for non-axis-crossing linear function

我想打印出一行,其点数由用户给出。我用它来检查一个点是否在线。 (我知道它可以做得更有效。别担心。)

int proportionalFactor = (x2 - x1) / (y2 - y1);
int offset = y1 - x1 * proportionalFactor;

for(int y = 0; y < 100; y++){                         //going over
   for(int x = 0; x < 100; x++){                      //every point
      if(y == proportionalFactor * x + offset){       //and checking if it's on the line
         printf("X");                                 //if so, mark it
      }else{
         printf(" ");                                 //if not, skip it
      }
   }
}

如您所见,我只是使用线性函数的正规方程。但在两种情况下这是行不通的。这条线要么是水平的,要么是垂直的。对于每条甚至稍微对角线它都有效。如果有帮助,以下是它在程序中的外观图片:

输入:10|10、90|90 - 工作正常

输入:10|10、10|90 - 如您所见,它是水平的,尽管它应该是垂直的

Aaa 最后但并非最不重要的输入:10|10、10|90 - 应该是垂直线

当我输入这些值时程序崩溃,所以没有图片

我的问题是,如果我可以改变我的等式中的任何东西来使这个工作正常,我解释错了等式的哪一部分?

如果一条线包含点 (x1, y1) 和 (x2, y2 ), 该直线的方程是 (yy1) / (xx1) = (y2y1) / (x2x1)。直观地,这表示从 (x1, y 1)到点(x,y)与从(x1, y1) 到 (x 2, y2).

然而,等式中的表达式在被零除时没有定义,这发生在直线垂直时,所以x1 = x2,或者当 xx1。为了纠正这个问题,我们可以乘以 (xx1) 和 (x2x1)。这给了我们 (yy1) • (x2x1) = (y 2y1) • (xx1)。这也是有益的,因为避免除法意味着我们可以使用整数运算,如果涉及的所有变量都是整数。

因此,如果运算中没有出现整数溢出,则点(xy)在(x1y1)定义的直线上并且 (x2, y2) 当且仅当 (y-y1) * (x2-x2) == (y2-y1) * (x-x1).