Код написан на 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}
я получу следующий результат:
Как вы можете видеть, горизонтальные и восходящие линии в порядке, но для линий, которые go вниз, нарисовано всего несколько пикселей. Я подозреваю, что это функция is_between
. Главная цель не в этом алгоритме, но я все равно хотел бы получить приемлемую картинку.
Я почти уверен, что это функция is_between
, которая может быть слишком точной, или я не знаю, но я был бы признателен за любую помощь, чтобы исправить это.