Я получил эти массивы, представляющие квадратную бумагу, или, может быть, пиксели, если хотите. Для согласованности в этом потоке пусть «1» представляет собой черную ячейку, «0» представляет собой белую ячейку.Рисунок почти прямой линии
Теперь я хочу нарисовать (черную) прямую линию от точки А до точки В. Я не могу просто использовать ваниль http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm, потому что мне нужно очернить каждую ячейку, которая была бы удалена, если бы это был лист квадрат бумаги и вы нарисовали линию от центра квадрата а в центре квадрата В.
Таким образом, они должны работать следующим образом:
+—+—+—+ +—+—+—+
|A| | | |█| | |
+—+—+—+ +—+—+—+
| | | | |█|█| |
+—+—+—+ +—+—+—+
| | | | → | |█|█|
+—+—+—+ +—+—+—+
| | |B| | | |█|
+—+—+—+ +—+—+—+
+—+—+—+ +—+—+—+
|A| | | |█| | |
+—+—+—+ +—+—+—+
| | | | → | |█| |
+—+—+—+ +—+—+—+
| | |B| | | |█|
+—+—+—+ +—+—+—+
+—+—+—+ +—+—+—+
|A| | | → |█|█| |
+—+—+—+ +—+—+—+
| | |B| | |█|█|
+—+—+—+ +—+—+—+
вы можете себе представить, эти эскизы, чтобы быть более квадратично например, или фактически набросать это на лист квадратной бумаги! Это может прояснить ситуацию.
И, как всегда, не стесняйтесь публиковать все, что может помочь. Благодаря!
(А) Раствор
использованием Кроме этого примера. И используя индексы, так как они используются моей картой, так что она немного отличается от той, которая содержится в ответах.
X 0 1 2 X 0 1 2
Y +—+—+—+ → Y +—+—+—+
0 |A| | | → 0 |█| | |
+—+—+—+ → +—+—+—+
1 | | | | → 1 |█|█| |
+—+—+—+ → +—+—+—+
2 | | | | → 2 | |█|█|
+—+—+—+ → +—+—+—+
3 | | |B| → 3 | | |█|
+—+—+—+ → +—+—+—+
Существо (0,0) =: (а1, а2), В является (2,3) = (b1, b2), поэтому ожидаемый набор точек {(0,0) , (0,1), (1,1), (1,2), (2,2), (2,3)}
Сначала мы оформляем прямую, которая будет нарисована на реальной бумаге.
Therefore first define constant m which holds our slope:
(b2 - a2)
m = —————————
(b1 - a1)
For arbitrary (A, B), the straight is now defined by:
g: y = (x - a1) · m + a2
and inverted:
ǵ: x = (y - a2)/m + a1
Note that for m = 0, the whole thing does fail. But a straight-to-the-right line does not only sound like a straightforward thing.
в этом примере, стрит
m = 3/2
g: y = x * 3/2
ǵ: x = y * 2/3
Мы будем кормить эти функции с «значениями строк» (точно между 2 целыми числами х и х + 1, широко известной как «х и на половину ") в нашей ограничительной рамке. Итак, сначала мы будем идти между a1 и b1 (фуражная г), то между а2 и b2 (фуражная ǵ):
g(0.5) = 1/2 * 3/2 = 0.75 // 1 < g(0.5) + 0.5 < 2
g(1.5) = 3/2 * 3/2 = 2.25 // 2 < g(1.5) + 0.5 < 3
ǵ(0.5) = 1/2 * 2/3 = 0.33 // 0 < ǵ(0.5) + 0.5 < 1
ǵ(1.5) = 3/2 * 2/3 = 1 // 1 < ǵ(1.5) + 0.5 < 2
ǵ(2.5) = 5/2 * 2/3 = 1.66 // 2 < ǵ(2.5) + 0.5 < 3
- Первое означает, что прямая пересекает первую вертикальную линию выше (показано как «ниже») первая горизонтальная линия. Очки для черных: (0,1), (1,1).
- Второй означает, что прямой пересекает вторую вертикальную линию над второй горизонтальной линией. Точки чернеют: (1,2), (2,2).
- Третий означает, что прямой пересекает первую горизонтальную линию после (показанную как «справа») 0-ю вертикальную линию. Очки для черных: (0,0), (0,1).
- Четвертое означает, что прямой пересекает вторую горизонтальную линию после первой вертикальной линии. Точки чернеют: (1,1), (1,2).
- Пятое означает, что прямой пересекает третью горизонтальную линию после второй вертикальной линии. Точки чернеют: (2,2), (2,3).
Все точки: {(0,1), (1,1), (1,2), (2,2), (0,0), (0,1), (1,1), (1,2), (2,2), (2,3)}
Без дублирует: {(0,0), (0,1), (1,1), (1,2), (2,2), (2,3)} (что точно так, как ожидалось)
- Итак, для линии, которая пересекает y't h вертикальной линии над x'-го горизонтальной, мы рисуем (x-1, y) и (x, y) черные.
- Хотя для линии, пересекающей x-ю горизонтальную линию после y-го вертикального, мы рисуем (x, y-1) и (x, y).
- (не обязательно здесь) И для линии, которая пересекает x'-го горизонтального прямо на y-й вертикальной, рисуем для m> 0 (x-1, y-1) и (x, y). Если m < 0, это сделало бы для (x-1, y) и (x, y-1)
Ощущается, что это так.
Любые мысли? Прокомментируйте, пожалуйста!
~ LDer ~
Как вы добрались от [ceil (x (1)) - 1; 1] - [2; 0]? Мне нравится решение, и теперь у меня есть собственная, непосредственно применимая идея, основанная на этом :) Надеюсь, что все получится хорошо. Кроме того, было бы здорово, если бы вы уточнили, как вы составили свои номера ... – LDericher
@LDericher извините, мой плохой :) Я имел в виду [2; 1], конечно. –
Таким образом, [ceil (x (2)) - 1; 2] - [1; 1] (должно быть [1; 2]) является тем же самым таинственным переходом, а также [ceil (x (3)) - 1; 3] - [0; 2] (должно быть [0; 3]), оставив мне только [(0, 3), (1, 2), (2, 1), (2, 0)] как разные значения? Подожди, это Бресенхам! D: – LDericher