Алгоритм проверки, является ли точка частью линии, не работающей хорошо, когда линия идет вниз - PullRequest
1 голос
/ 15 января 2020

Код написан на GoLang, но я хотел бы подумать, что это больше похоже на языковой агности c, хотя GoLang конкретный c предложения приветствуются. У меня есть структура Point

type Point struct {
    X, Y int
}

, и у меня есть массив Points []Point, и я хочу нарисовать линии, начинающиеся с Points [0] -> Points 1 ... Точки [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))
    }
}

, поэтому метод At должен возвращать цвет, если пиксель является частью линии, и эта часть доставляет мне некоторые проблемы. В настоящее время у меня есть это:

tempPoint := Point{X: x, Y: y}
for i := 1; i < len(p.Points); i++ {
    if p.Points[i].X == tempPoint.X && p.Points[i].Y == tempPoint.Y {
        return color.Alpha{255}
    }

    if is_between(p.Points[i-1], tempPoint, p.Points[i]) {
        return color.Alpha{255}
    }
}
return color.Alpha{0}

и, наконец, функция is_between, которая должна возвращать 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
}

это функция compare:

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}

я получу следующий результат:

enter image description here

Как вы можете видеть, горизонтальные и восходящие линии в порядке, но для линий, которые go вниз, нарисовано всего несколько пикселей. Я подозреваю, что это функция is_between. Главная цель не в этом алгоритме, но я все равно хотел бы получить приемлемую картинку.

Я почти уверен, что это функция is_between, которая может быть слишком точной, или я не знаю, но я был бы признателен за любую помощь, чтобы исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...