• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Графика в Delphi

NotaKron

Ученик
Регистрация
19 Ноя 2012
Сообщения
8
Реакции
0
Баллы
0
Графика в Delphi

Здравствуйте. Нужна помощь в решении следующей задачи.есть картинка с n-фигурами произвольной формы, нужно найти xmin,xmax и ymin,ymax каждой.Все фигуры черного цвета. я картинку с помощью scanline перегнал в двумерный массив, где 0 - белый цвет, 1 - черный. Далее в цикле последовательно сверху вниз прохожу точки, проверяя их цвет. Но если фигуры, расположены, как на картинке в примере, то возникают проблемы( Как определить, что точка А принадлежит первой фигуре, а точка Б нет?
Может есть алгоритмы попроще, а то ощушение, что удаляю гланды не через то отверстие((
 

Вложения

  • q.webp
    q.webp
    1.9 KB · Просмотры: 79
пройдите по массиву и если строка равна 0, то первая фигура закончилась.
 
Спасибо за совет, но:
1. В этой строке, может быть и черные цвета, от фигуры, расположенной дальше по оси Х.
2.Я прохожу масси во стоблцам, а Вы, если я правильно понял, предлогаете по строкам. Но тогда если мы рассмотрим представленные на рисунке фигуры, повернув их на 90 градусов, то опять получим ту же самую проблему.
 
Это что у вас распознавание образов о_О

1) Что такое x,y (min, max) как расположены координаты.
2) Как вы считываете картинку? что, строка пикселей это столбец массива?

1. Ставьте правильно условие(т.к. вы написали относительно данной картинки)... Тогда надо анализировать каждый пиксель... если он - 1 и есть сосед 1, то это все та же фигура. И соответственно высчитывать max, min для этой фигуры.(эти координаты добавляем в какой-то массив т.е. будет массив массивов. где ключ - номер фигуры).
Как только нету соседа (тоже 1) то это либо новая фигура, либо больше их нету.

На когда нужна задача?
 
1. xmin,xmax - это крайний левый и крайний правый пиксель фигуры.
2.Нет, строка картинки=страка массива. Извиняюсь,что не так выразился. Просто цикл у меня идет по столбцам, но можно и по строкам. Не вижу принципиальной разницы.
Про сравнение и поиск соседнего пикселя я уже думал.
Вот мы анализируем первую строку с черными пикселями. Назначаем ключ 1 и до точки 2 у всех сосед есть. Потом идет разрыв в строке, и у точки 3 соседа с ключем 1 нет. На этой проблеме я и застрял.

Сроки не важны.
 

Вложения

  • 2.webp
    2.webp
    2.1 KB · Просмотры: 63
Интересное задание, попробую что-нибудь для себя написать.
 
Вобщем, я алгоритм придумал, но он настолько извращенный и индийский, что мне даже не много стыдно.
в цикле находим первую точку черную.
вызываем функцию, которая считает хмах, хmin и ymax,ymin первой попавшейся фигуры (эту функцию я так же приудмал, и она так же корява, как и этот алгоритм).
Далее вызывае функцию, которая в цикле будет проходить от xmin до хmax и ymin и ymaх. В нем обнуляем все точки с черным цветом(заоодно и площадь фигуры можно посчитать).
Далее продолжаем первый цикл, до следующей фигуры.

З.Ы. прошу сильно не пинать,знаю что мысль ужасная. Так что тема актуальна.
 
Можно сделать так, что бы он двигался от первого пикселя враво, как только находит точку черную записывает координаты, далее двигается дальше, как только обнаружил белую точку, то записывает координаты предыдущей позиции, и начинает считывать след. строку. и так далее, потом просто вбить формулы площади и все=)
 
Можно сделать так, что бы он двигался от первого пикселя враво, как только находит точку черную записывает координаты, далее двигается дальше, как только обнаружил белую точку, то записывает координаты предыдущей позиции, и начинает считывать след. строку. и так далее, потом просто вбить формулы площади и все=)

Примерно так я и организовал функцию нахождения xmax,xmin и ymax,ymin первой попавшей фигуры. Но для решения всей задачи это не подходит, т.к. отрезаются фигуры, находящиеся правее первой фигуры(
 
А если запустить опять задачу, и пусть она шагает дальше и записывает параметры дальше.
 
В сообшении №9 я и описал этот метод. Но мне он кажется громоздким, излишне сложным и не правильным. Эта моя первая программа, поэтому я не очень понимаю, как правильно, а как нет. Но хотелось бы, чтобы все было просто, понятно и не стыдно показать.
 
Ну для первой программы, вы выбрали себе очень трудную программу....
 
Ну, это не моя инициатива. Нужда так сказать. Тема актуальна.
 
Ну в общем верное решение.
Еще есть вариант попробовать обход границ. Пока есть мысли но попробую реализовать.
 
Про обход границ мысль очень интересная. Тоже попробую ее развить. Спасибо за идею.
 
Еще есть вариант попробовать обход границ. Пока есть мысли но попробую реализовать.
Между прочим, последние несколько дней я эту задачку тоже периодически принимался в голове крутить. И пришел к тому же выводу насчет обхода границ. Похоже, другого решения тут нет, если учесть, что фигуры могут, например, представлять собой два уголка, вставленные один в другой с зазором, так что пустые строки/столбцы явно отпадают. Но реализовать (алгоритмизировать) этот обход - ой!
 
Назад
Сверху