Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2013, 04:04   #1
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию Массив и прямая.

Дан двумерный массив, 2 координаты и пустой массив точек.
Как в массив точек можно занести ВСЕ точки массива, лежащих на прямой между 2мя заданными точками?
Знаю только как их занести с определенным интервалом, но если прямая лежит на мельчайшем кусочке квадрата, тот может не занестись. На изображении в список занесется только одна из попарно закрашенных клеток. Увеличивать число шагов не вариант, так как одна клетка - минимальная дискретная единица, то бишь пиксель.
Изображения
Тип файла: jpg Без имени-2.jpg (34.3 Кб, 55 просмотров)
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 30.05.2013, 08:44   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

www.ru.wikipedia.org/wiki/Алгоритм_Брезенхэма‎
phomm вне форума Ответить с цитированием
Старый 30.05.2013, 19:51   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Кроме уже предложенного Брезенхема можно просто проверять расстояние от центра клетки до линии и в случае, если оно меньше 1/sqrt(2), проверять углы клетки на то, что все они лежат по одну сторону прямой.

Если же идти по тому, пути, по которому пошли Вы - "шагать" вдоль прямой, то шаги нужно делать не постоянными, а до пересечения с ближайшей линией сетки.
Т.е.
1. Делаем текущей точкой исходную
2. Вычисляем ближайшее пересечение с сеткой линии, выходящей из исходной точки.
3. Делаем точку пересечения текущей.
4. Если мы не дошли до конца отрезка - на шаг 1.
s-andriano вне форума Ответить с цитированием
Старый 31.05.2013, 09:57   #4
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Кроме уже предложенного Брезенхема можно просто проверять расстояние от центра клетки до линии и в случае, если оно меньше 1/sqrt(2), проверять углы клетки на то, что все они лежат по одну сторону прямой.

Если же идти по тому, пути, по которому пошли Вы - "шагать" вдоль прямой, то шаги нужно делать не постоянными, а до пересечения с ближайшей линией сетки.
Т.е.
1. Делаем текущей точкой исходную
2. Вычисляем ближайшее пересечение с сеткой линии, выходящей из исходной точки.
3. Делаем точку пересечения текущей.
4. Если мы не дошли до конца отрезка - на шаг 1.
Брезенхем как раз таки не тот, что нужен. Мой такой же получается. Т.е. мне надо чтобы не было соединений по диагонали. Как на изображении (снизу)
Изображения
Тип файла: png Безымянный.png (18.0 Кб, 41 просмотров)
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 31.05.2013, 13:33   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Брезенхем - это не один единственный алгоритм, а семейство алгоритмов. Среди них есть и тот, что Вам нужен.

2. Надеюсь, насчет тех двух алгоритмов, которые я предложил кроме Брезенхема, возражений нет?
s-andriano вне форума Ответить с цитированием
Старый 31.05.2013, 14:03   #6
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
1. Брезенхем - это не один единственный алгоритм, а семейство алгоритмов. Среди них есть и тот, что Вам нужен.

2. Надеюсь, насчет тех двух алгоритмов, которые я предложил кроме Брезенхема, возражений нет?
Про точку пересечения... я хз как это сделать на пиксельной сетке (при натуральных числах).
На счет Брезенхема еще почитаю.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 31.05.2013, 17:37   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от alextrof94 Посмотреть сообщение
Про точку пересечения... я хз как это сделать на пиксельной сетке (при натуральных числах).
На счет Брезенхема еще почитаю.
Считайте в вещественных числах при размере пикселя/ячейки равном 1.0.

Интервал ведь Вы уже задавали вещественным числом?
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Числовая прямая ThomasHoffman Помощь студентам 3 26.11.2012 21:02
Прямая линия Kyran29 Мультимедиа в Delphi 7 30.05.2012 17:11
Квадрат и прямая xXSilentXx Общие вопросы C/C++ 14 26.07.2011 19:24
Прямая VirusOfLove Помощь студентам 8 05.12.2009 09:37
Прямая в пространстве Neuros1s Общие вопросы Delphi 12 29.06.2007 00:06