Получение кривых деталей из точек - PullRequest
2 голосов
/ 29 марта 2011

У меня есть List 2D точек.Как эффективен способ итерации по точкам, чтобы определить, является ли список точек прямым или изогнутым (и в какой степени).Я хотел бы избежать просто получения уклонов между меньшими подмножествами.Как мне поступить так?

Спасибо за любую помощь

Редактировать: Спасибо за ответ.Чтобы уточнить, мне не нужно, чтобы он был точным в числовом отношении, но я бы хотел определить, создал ли пользователь изогнутую форму с помощью мыши и, если да, насколько резкой является кривая.Значения не слишком важны, если возможно определить разницу между острой кривой и чуть более мягкой кривой.

Ответы [ 4 ]

1 голос
/ 29 марта 2011

Вот метод для вычисления угла: Рассчитайте угол между двумя точками, используя C #

Просто вычислите угол между каждой точкой в ​​вашем списке и создайте список углов, затем сравните, еслиЗначения списка углов разные.Если они не отличаются, это означает, что это прямая линия, в противном случае это кривая ...

Если это прямая линия, то угол между всеми точками должен быть одинаковым.

1 голос
/ 29 марта 2011

Чтобы проверить, является ли это прямой линией, вычислите коэффициент корреляции.Я уверен, что это покрыто википедии.

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

1 голос
/ 29 марта 2011

Если вы просто хотите узнать , если все ваши точки в большей или меньшей степени соответствуют кривой степени d, просто примените интерполяцию Лагранжа к конечным точкам и d-2 в равной степени разнесенные точки внутри вашего массива. Это даст вам полином степени d.

Как только у вас есть ваша кривая, просто итерируйте по массиву и посмотрите, как далеко от кривой находится каждая точка. Если они превышают пороговое значение, ваши данные не соответствуют вашему полиному степени d.

Редактировать: я должен отметить, что итерация значений d - это конечный процесс. Как только d достигнет нужного вам количества баллов, вы получите идеальное соответствие из-за того, как работает интерполяция Лагранжа.

0 голосов
/ 29 марта 2011

Здесь вопрос действительно туманный: «Я бы хотел избежать простого наклона между меньшими подсистемами»

Возможно, вы хотите интерполяцию а-ля B-сплайны. Они используют две точки и две дополнительные контрольные точки, если мне не изменяет память. Реализации повсеместны с давних времен (по крайней мере, в 1980-х). Это должно дать вам ход

Помните, что вам, вероятно, потребуется добавить контрольные точки, чтобы кривая соответствовала конечным точкам. Чтобы убедиться, что они достигнуты, нужно просто продублировать конечные точки в качестве дополнительных контрольных точек.

Приветствия

Обновление Добавлена ​​ссылка на codeproject может показаться, что то, что я помню в 80-х годах, могло быть кривыми Безье - своего рода предшественником.

...