Algorithm 一种算法,用于检查当直线向下移动时,该点是否为直线的一部分,该算法工作不正常

Algorithm 一种算法,用于检查当直线向下移动时,该点是否为直线的一部分,该算法工作不正常,algorithm,go,geometry,Algorithm,Go,Geometry,代码是用GoLang编写的,但我认为这更像是语言不可知论,尽管欢迎使用GoLang特定的建议。我有一个结构点 type Point struct { X, Y int } 我有一个点[]点的数组,我想从点[0]->点开始画一条线。。。点数[n] 画布是一个矩形,所以这可能不是最好的解决方案,但我决定迭代画布上的每个像素,检查当前像素是否是任何线条的一部分,并给出另一种颜色: m := image.NewNRGBA(image.Rect(0, 0, 400, 400)) for i :

代码是用GoLang编写的,但我认为这更像是语言不可知论,尽管欢迎使用GoLang特定的建议。我有一个结构

type Point struct {
    X, Y int
}
我有一个
点[]点的数组,我想从点[0]->点开始画一条线。。。点数[n]

画布是一个矩形,所以这可能不是最好的解决方案,但我决定迭代画布上的每个像素,检查当前像素是否是任何线条的一部分,并给出另一种颜色:

m := image.NewNRGBA(image.Rect(0, 0, 400, 400))

for i := 0; i <= 400; i++ {
    for j := 0; j <= 400; j++ {
        m.Set(i, j, p.At(i, j))
    }
}
最后,
是介于
之间的函数,它应该返回true或false:

func is_between(a, c, b Point) bool {
  c1 := (b.X-a.X)*(c.Y-a.Y) == (c.X-a.X)*(b.Y-a.Y)
  c2 := math.Abs(compare(a.X, c.X)+compare(b.X, c.X)) <= 1
  c3 := math.Abs(compare(a.Y, c.Y)+compare(b.Y, c.Y)) <= 1

  return c1 && c2 && c3
}
因此,如果我输入一些点,就有这个代码:

Point{X: 5, Y: 180}
Point{X: 50, Y: 200}
Point{X: 100, Y: 150}
Point{X: 200, Y: 150}
Point{X: 250, Y: 190}
我得到以下结果:

正如您所看到的,水平线和向上的线是可以的,但是向下的线只绘制了几个像素。我怀疑是
功能之间。主要的目标不是这个算法,但我想得到一些可以接受的图片


我很确定这是
is_between
函数,它可能太精确了,或者我不知道,但我希望能得到任何帮助来解决这个问题。

它似乎在做你想做的事情,但你会看到间隙,因为它只显示恰好在直线上的网格点,通常直线在网格点之间。我真的不能提出解决办法,因为我不知道你真正想要什么。这似乎根本不是一种合理的画线方法。@MattTimmermans我想要的是相当标准的我有一个点的集合,更一般地说,我想要画一条从第一个点到最后一个点的路径(现在只假设正确的输入)。为了做到这一点,我正在尝试从GoLang实现
image
接口。你认为一个更好的方法来画线?我认为MattimMelman是正确的;向上的直线恰好有一个正好为1的梯度,因此没有间隙,因为梯度是一个整数。这可能是一个巧合,这两条梯度线不是整数,而是向下的两条。将整个图像涂成黑色,然后用@MattTimmermans绘制每条线谢谢,我会看一看。难道不可能添加某种公差或使我当前的实现工作没有间隙的东西吗?它似乎在做你想做的事情,但你看到了间隙,因为它只显示正好在直线上的网格点,通常直线在网格点之间。我真的不能提出解决办法,因为我不知道你真正想要什么。这似乎根本不是一种合理的画线方法。@MattTimmermans我想要的是相当标准的我有一个点的集合,更一般地说,我想要画一条从第一个点到最后一个点的路径(现在只假设正确的输入)。为了做到这一点,我正在尝试从GoLang实现
image
接口。你认为一个更好的方法来画线?我认为MattimMelman是正确的;向上的直线恰好有一个正好为1的梯度,因此没有间隙,因为梯度是一个整数。这可能是一个巧合,这两条梯度线不是整数,而是向下的两条。将整个图像涂成黑色,然后用@MattTimmermans绘制每条线谢谢,我会看一看。难道不可能添加某种容忍度或使我当前的实现工作没有间隙的东西吗?
func compare(x, y int) float64 {
  if x > y {
    return 1
  } else if x == y {
    return 0
  } else {
    return -1
  }
}
Point{X: 5, Y: 180}
Point{X: 50, Y: 200}
Point{X: 100, Y: 150}
Point{X: 200, Y: 150}
Point{X: 250, Y: 190}