Как по массиву точек линии определить на что похожа фигура

192
29 января 2019, 00:10

Есть прямая из массива точек

List<Point> listP;

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

Любую информацию, которая пришла вам в голову, напишите, пожалуйста.

Типы:

  1. Округлости не замкнуто

  1. Острые углы не замкнуто:

  1. Округлая замкнутость.

  1. Острая замкнутость.

Answer 1

Это как же у вас интересно определяется наличие не замкнутости/замкнутости точек? Даже если вы от второй к первой, от третей ко второй чертите линию - то почему вы в одних случаях то замыкаете последнюю точку на первую, то нет? И вас устраивает, определение замкнутости как "последняя точка совпадает с первой"?

А если устраивает - то не хотите соединять отрезки и определять есть ли пересечения отрезков? (гуглим алгоритм Бентли - Оттмана)

Также насколько я знаю, по набору точек можно пробовать определить, является фигура выпуклой (алгоритм Грехема, построение минимально выпуклых оболочек)

Answer 2

Судя по условию, есть два свойства - замкнутость и скругленность (острость).

Замкнутость определить легко, для этого считаем расстояние между первой и последней точками, и если оно меньше определённого порога, то считаем, что фигура замкнутая (порог можно подбирать по-разному, можно его положить равным чем-то константному, например 1e-4, а можно выбирать исходя и, например, диаметра вашей кривой, то есть брать его, допустим, 0.01 умножить на максимальное попарное расстояние между точками списка).

Со скруглённостью сложнее. Тем более, что могут быть скруглённые участки и угловатые. Тут предлагаю попробовать для каждой точки считать угол между выходящими из неё отрезками (на предыдущую и на следующую точку), если угол меньше определённого порога (допустим, меньше, чем 135 градусов), то угол считается "острием". Далее, смотрите, если "остриёв" у вас больше, чем, например, 30% точек, то, считаете что кривая острая, иначе округлая.

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

READ ALSO
Как задать tab-у длину

Как задать tab-у длину

Всем доброго дня! На форме лежит richtextbox с acceptstab=trueПо умолчанию символ tab \t в нем идентичен 8-ми пробелам

196
Почему GameObject.FindWithTag возвращает null?

Почему GameObject.FindWithTag возвращает null?

На сцене есть 2 камеры: главная и вторая неактивная с тэгом "my tag"Почему при использовании camera_2 = GameObject

187
Передача параметра из кнопки в ListView во ViewModel

Передача параметра из кнопки в ListView во ViewModel

Товарищи, подскажите, как во ViewModel передать параметр кликнутой кнопки? в хамл прописан биндинг на комманду, кнопка во вью модел вызывается,...

213
Отправка данных на сервер с опустевшей формой

Отправка данных на сервер с опустевшей формой

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

167