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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2010, 22:58   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Сделать из линии, толщиной в несколько пикселей, линии, толщиной 1 пиксель.

Может кто делал такое и может помочь с алгоритмом? У меня пока только одно на уме: вычислять расстояние от крайних пикселей и делить на 2, при чем пиксели должны располагаться перпендикулярно, не знаю как объяснить... (Опечатка в названии темы: Сделать не линиИ, а линиЮ (одну) из одной толстой)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 28.08.2010, 10:14   #2
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
линиЮ (одну) из одной толстой)
А зачем это делать, берите и рисуйте линию на отдельном битмапе или что вы имеете в виду? Выложите хотя бы скрин
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 28.08.2010, 10:37   #3
Bonez92
Пользователь
 
Регистрация: 11.10.2009
Сообщений: 29
По умолчанию

Не очень понял, что Вам нужно, наверно Вам нужно использовать алгоритм Брезенхэма.
Что в гугле попалось: http://plagiata.net.ru/?p=277
Bonez92 вне форума Ответить с цитированием
Старый 28.08.2010, 11:28   #4
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Вот собственно, что мне нужно сделать есть во вложении. Алгоритм Брезенхэма - это не то, это - просто прямая линия, я её и без это алгоритма нарисую. dmitriegorovih, если бы можно было бы таким образом выйти из ситуации... всё сложнее.
П.С. Забыл касательную начертить.
Изображения
Тип файла: jpg 1px.jpg (61.4 Кб, 61 просмотров)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 28.08.2010 в 11:32.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 28.08.2010, 12:14   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

итеративно
если 9 (сама точка и все соседи вверх внизвправовлево) черные(цветной) то оставить точку черной иначе стереть цвет

нагядно это будет так
аккуратно по одному пикселю стираем все граничные точки рисунка
получаем новый рисунок с чуть более тонкими линиями
повторяем с новым рисунком до тех пор пока есть что стирать.

немного ( на число пикселей = 2 * количество итераций ) уменьшиться максимальная длина линии (торцевые границы линии тоже будут подвержены стиранию)

не совсем понятно как будет вести себя алгоритм по изломах и поворотах (могу предположить остануться утолщения)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.08.2010 в 12:22.
evg_m на форуме Ответить с цитированием
Старый 28.08.2010, 12:36   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Думаю, для начала нужно получить контур жирной линии. Для этого необходимо с каким-то шагом найти ее граничные точки
1.jpg
Далее обводим эти точки с помощью spline (http://ru.wikipedia.org/wiki/Сплайн)
2.jpg
Находим средние точки
3.jpg
И так же обводим их по сплайну
4.jpg
Sibedir вне форума Ответить с цитированием
Старый 28.08.2010, 12:39   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от evg_m
итеративно
если 9 (сама точка и все соседи вверх внизвправовлево) черные(цветной) то оставить точку черной иначе стереть цвет

нагядно это будет так
аккуратно по одному пикселю стираем все граничные точки рисунка
получаем новый рисунок с чуть более тонкими линиями
повторяем с новым рисунком до тех пор пока есть что стирать.
В итоге сотрётся абсолютно всё
Цитата:
Сообщение от evg_m
торцевые границы линии тоже будут подвержены стиранию
И это абсолютно правильно
Sibedir вне форума Ответить с цитированием
Старый 28.08.2010, 12:50   #8
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

evg_m, идея интересная! Только вот нужно доработать... Если у нас останется горизонтальная линия шириной один пиксел, и программа дальше будет проверять соседей, то и этот один пиксел сотрется... Нужно каким-то образом определить направление линии, задать вектора что ли по которым программа будет ориентироваться в направлении... Sibedir, вашего ответа нарисовал на бумаге точно такие же рисунки. Мы по этому алгоритму как бы преобразуем округлые части линии в нечто прямое (прямой сплайн), дабы провести касательную к нему (он сам может и являться этой касательной), и далее по алгоритму. Объясните мне пожалуйста как правильно заливать рисунки, я сейчас покажу наглядно какая идея мне ещё пришла в голову. Они очень похожи будут с вашей, Sibedir.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 28.08.2010, 12:57   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

В расширеном режиме нажимаем на скрепку. Заливаем вложения (*.jpg). Далее с помощью этой же скрепки вставляем ваши картинки в нужное место поста.
Кстати, можно не искать косательные. Можно прости искать ближайшую точку контура на противоположной стороне.

Последний раз редактировалось Sibedir; 28.08.2010 в 13:00.
Sibedir вне форума Ответить с цитированием
Старый 28.08.2010, 13:22   #10
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Программно вычисляем местоположение точек на границе жирной линии так, чтобы относительно центра начала линии их количество было одинаковое (а началом линии является либо одна вершина, если жирная линия острая и с неравномерной толщиной, либо вершина при делении расстояния длины прямой части начала жирной линии на 2). Шаг соблюсти не получится, так что надо как-то выйти из этого положения. Вопрос: как?
1px.jpg
После того, как нашли точки соединяем их да банальным LineTo(...); так как рисуется это всё дело на канве, соединяем ближайшие противоположные точки и центры получившихся отрезков. Получаем следующее:
1px копия.jpg
Потом просто сглаживаем острые углы на получившейся ломанной линии с помощью опять-таки алгоритма который надо придумать:
1px копия2.jpg
Почти тоже самое, что и у вас, Sibedir, поправьте, если что-то не так.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 28.08.2010 в 13:25.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прорисовка линии dmitriegorovih Общие вопросы Delphi 13 16.07.2010 13:09
Линии в паскаль Кинива Паскаль, Turbo Pascal, PascalABC.NET 0 13.06.2010 12:27
Очистка линии женя2010 Microsoft Office Excel 8 21.04.2010 10:19
динамические линии DIMEDROL1985 Помощь студентам 2 24.01.2010 00:37
Как сделать рамку толщиной 0,5 см Syltan Microsoft Office Word 0 14.11.2009 15:57