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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2015, 20:28   #1
AlexDn
Пользователь
 
Регистрация: 02.10.2009
Сообщений: 93
По умолчанию Вот такая графическая задачка

Есть небольшой рисунок, нужно отбросить всё, что находится вне трапеции. Что посоветуете? - (отбросить это значит закрасить/залить белым, например)

Последний раз редактировалось AlexDn; 01.06.2015 в 20:43.
AlexDn вне форума Ответить с цитированием
Старый 01.06.2015, 22:32   #2
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
По умолчанию

Вот кусок алгоритма, может не совсем красивого, но быстрее всего подходящего для вашего задания. Написал на "полуДельфийском" языке:
Код:
// n на m точек - размер рисунка
i := 0;
while i < n do
begin
  f := true;
  j := 0;
  while f and j < m do
  begin
    if Точка[i,j] = черная then
	  f := false
	else
	  Точка[i,j] := Закрасить_белым;
	inc(j);  
  end;	
end;
// еще надо закрасить часть справа
i := 0;
while i < n do
begin
  f := true;
  j := m-1;
  while f and j >= 0 do
  begin
    if Точка[i,j] = черная then
	  f := false
	else
	  Точка[i,j] := Закрасить_белым;
	dec(j);
  end;
end;
Не помню, как там массив точек с 0 начинается по N-1 или с 1 до N. Если что - подправите. Также можно вставить проверку на оранжевый цвет: Если оранжевый - то поменять на белый, в противном случае - ничего не делать.
P.S. На рисунке не трапеция, вспоминайте геометрию за 9 (10?) класс.
GNDragonFly вне форума Ответить с цитированием
Старый 01.06.2015, 23:18   #3
AlexDn
Пользователь
 
Регистрация: 02.10.2009
Сообщений: 93
По умолчанию

Что то я не понимаю как Ваш алгоритм сможет отличить где область внутри трапеции?
AlexDn вне форума Ответить с цитированием
Старый 01.06.2015, 23:52   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Этот алгоритм можно себе визуально представить так: сначала плеснули белой краской слева-направо (справа от четырехугольника оказалась незакрашенная область - он её "закрыл" собой), затем справа-налево (докрасили "защищенную" область). Каждая строка красится, пока не упрёмся в четырехугольник. Такой алгоритм сработает только на выпуклом четырехугольнике.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.06.2015, 00:05   #5
DpolenST
Форумчанин
 
Регистрация: 28.09.2013
Сообщений: 115
По умолчанию

находите координаты первой точки (не черной и не белой), и заливаете белым
Код:
img1.Canvas.Brush.Color:=clWhite;
img1.Canvas.FloodFill(x,y,img1.Canvas.Pixels[x,y],fsSurface);
сканируете все строки сначала слева направо, потом справа налево
Что бы еще такого сделать, чтобы ничего не делать?
DpolenST вне форума Ответить с цитированием
Старый 02.06.2015, 11:39   #6
GNDragonFly
Пользователь
 
Регистрация: 05.07.2012
Сообщений: 11
Злость

Цитата:
Сообщение от AlexDn Посмотреть сообщение
Что то я не понимаю как Ваш алгоритм сможет отличить где область внутри трапеции?
Что же тут, батенька, сложного?
В моем алгоритме мы идем построчно слева направо пока не найдем черную точку (либо до конца рисунка). Если черная точка нашлась - значит мы "натолкнулись" на трапецию и ДАЛЬШЕ НЕ ИДЕМ. И так с каждой строчкой повторить.
Но при таком алгоритме будет залита левая часть от трапеции. Поэтому делаем аналогично: идем с последней точки строки влево, пока не встретим черную точку (т.е. границу трапеции).
PS Этот алгоритм подходит для любого ВЫПУКЛОГО многоугольника.

Последний раз редактировалось GNDragonFly; 02.06.2015 в 11:45.
GNDragonFly вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вот такая задачка... nark25 Паскаль, Turbo Pascal, PascalABC.NET 1 31.05.2009 23:40
вот такая задачка student90 БД в Delphi 3 25.09.2008 10:12