Как найти шаблоны (строки, круги, …) из списка точек?

TDD стал любимым подходом разработчиков программного обеспечения, которые серьезно относятся к своей профессии. [ IEEE: TDD ] Преимущества этого подхода значительны, а затраты по сравнению с ним невелики. [ Три закона TDD ]

Нет программных доменов, для которых TDD не подходит или неэффективен. Однако есть домены, в которых это сложно. Игры, оказывается, один из них.

На самом деле, проблема не столько в играх, сколько в пользовательском интерфейсе. Причина, по которой пользовательский интерфейс является проблемой, заключается в том, что вы часто не знаете, как вы хотите, чтобы пользовательский интерфейс выглядел, пока не увидели его. Пользовательский интерфейс - это одна из тех вещей, с которыми вам придется возиться. Правильно понять это - глубоко итеративный процесс, который полон поворотов, тупиков и тупиков. Написание тестов сначала для пользовательского интерфейса, вероятно, будет и трудным, и расточительным.

Теперь, прежде чем все будут реветь и говорить: «Дядя Боб говорит:« Не делай TDD для UI »», позвольте мне сказать это. Тот факт, что трудно сделать чистый TDD для пользовательского интерфейса, не означает, что вы не можете сделать чистый TDD почти для всего остального. Большая часть игр связана с алгоритмом, и вы можете использовать TDD с этими алгоритмами на свое усмотрение. Это правда, особенно в играх, что некоторые из этих алгоритмов - это тот код, с которым вам нужно работать, как и в пользовательском интерфейсе, и поэтому они, вероятно, не поддаются тестированию вначале . Но есть много другого алгоритмического кода, который можно и нужно сначала написать для проверки.

Хитрость заключается в том, чтобы следовать принципу единой ответственности (SRP) и отделить те виды кода, с которыми вам придется поиграться, от тех видов, которые являются детерминированными. Не используйте в своем интерфейсе простые для тестирования алгоритмы. Не смешивайте ваш спекулятивный код с вашим не спекулятивным кодом. Храните вещи, которые меняются по причине А, отдельно от вещей, которые меняются по причине Б .

Кроме того, имейте это в виду: тот факт, что какой-то код трудно тестировать первым , не означает, что этот код трудно тестировать второго . После того, как вы поиграли, настроили код и заставили его работать так, как вам нравится, , затем вы можете написать тесты, демонстрирующие, что код работает так, как вы думаете. (Вы будете удивлены тем, сколько раз вы находите ошибки при этом.)

Проблема с написанием тестов «по факту» состоит в том, что часто код настолько связан, что трудно писать виды хирургических тестов, которые являются наиболее полезными. Поэтому, если вы пишете код, который сначала сложно протестировать , , вам следует соблюдать принцип инверсии зависимостей (DIP) и открывать / закрывать принцип (OCP) для того, чтобы код оставался достаточно разъединенным для проверки после факта.

9
задан Jon Seigel 22 May 2010 в 22:35
поделиться

5 ответов

взгляните на Преобразование Хафа . что вы делаете: вы преобразуете свое изображение в «круговое» пространство, а затем вам нужно только найти светлые пиксели.

найти светлые пиксели в изображении довольно просто, просто примените отсечение.

количество световых пикселей регионов - это количество кружков. вы можете восстановить их исходное положение на вашем изображении, применив обратную функцию.

9
ответ дан 4 December 2019 в 13:49
поделиться

Классический распознаватель - это нейронная сеть. Нейронные сети работают «нормально» и требуют некоторого обучения.

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

3
ответ дан 4 December 2019 в 13:49
поделиться

Пока вы ограничиваете ее базовыми формами, вы можете вычислить усредненное «направление» текущего штриха и создайте из них последовательность «штрихов».

Вероятно, легче распознать форму на основе этой информации:

  • круг имеет довольно постоянную вторую производную
  • «семь» имеет штрих вправо с последующим штрихом в нижнем левом углу
  • ...
1
ответ дан 4 December 2019 в 13:49
поделиться

Я смотрю на расстояние от некоторой точки P до каждой из других точек, чем если P является центром круга, вы получите некоторые очень отчетливые статистические эффекты.

Вы можете изменить это и найти точки, которые обладают этими свойствами. В качестве первого прохода может сработать что-то вроде стандартного отклонения расстояний, и для определения местоположения вы можете взять производную от этого по местоположению и попытаться минимизировать его. Как только вы найдете минимум, попробуйте найти набор из> 3 точек, равноудаленных от него.

Я полагаю, вам понадобится что-то другое, кроме стандартного отклонения, что-то, что меньше интересует выбросы и больше интересует группирование.

Также , это не принесет вам много пользы для строк.

1
ответ дан 4 December 2019 в 13:49
поделиться

Поскольку вы получаете пиксели, и они идут по порядку, вы можете начать с проверки наклона, скажем, между каждым нарисованным 10-м пикселем и посмотреть, как изменяется наклон. Разрывы дают вам некоторую информацию.

1
ответ дан 4 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: