Страница 1 из 1
Нужна процедура по формированию кармана.
Добавлено: 23 авг 2012, 01:38
mycnc
Добрый день.
В свой софт (управление ЧПУ) хотим добавить функцию генерации кармана для замкнутого контура, заданного
линейными отрезками и дугами. Рассмотрим варианты от бесплатных советов до выполнения оплачиваемых работ.
PS Написал сюда, так как вроде бы данная функция реализована в gcodetools и здесь есть люди, которые могу направить на верный путь.
Re: Нужна процедура по формированию кармана.
Добавлено: 23 авг 2012, 09:15
Nick
Давай разберемся в постановке задачи.
В итоге ты хочешь получить что-то типа компенсации радиуса инструмента от LinuxCNC, или что-то круче?
Re: Нужна процедура по формированию кармана.
Добавлено: 23 авг 2012, 09:35
mycnc
Nick писал(а):Давай разберемся в постановке задачи.
В итоге ты хочешь получить что-то типа компенсации радиуса инструмента от LinuxCNC, или что-то круче?
Компенсация радиуса инструмента у меня есть (см. картинку, на ней оригинальная трасса и скомпенсированная).
А надо сделать трассу для фрезеровки поверхности внутри контура. Фактически рекурсивно повторить компенсацию радиуса.
Но будет круче, так как какое-то количество элементов упрощается, а также (в случае, как на картинке) произойдет размножение
контуров. Как это все обсчитывать- алгоритмов пока нет.
Re: Нужна процедура по формированию кармана.
Добавлено: 23 авг 2012, 10:23
Nick
Понятно. Самое трудное - это клипинг оффсета, т.е. отрезание лишних частей.
Как это делается в Gcodetools на данный момент:
Предположим есть контур p = {s1,s2,...,sn} - упорядоченное множество элементов (s - дуги или отрезки).
p - замкнутый контур, иначе смысл оффсета теряется.
r - радиус оффсета
- Вычисляем оффсет:
p' = {s1',s2', ..., sn'} - т.е. оффсетим каждый элемент.
- Соединяем элементы, тут кстати есть два способа - соединять дугами или продлевать элементы за свои края. Это в принципе тоже просто.
- Клиппинг:
- Находим самопересечения нового контура. Т.е. ищем все пересечения sk' c sm' для m,k из [1,n] и m!=k , при этом надо исключить тривиальные пересечения соседних элементов.
- Разбиваем p' на p1'...pn' точками пересечений (при этом, p1'...pn' - могут быть не замкнутыми).
- Удаляем не нужные контуры. Есть несколько критериев удаления контура.
- самый тривиальный, но самый долгий - находим расстояние от каждой части sl' контура pk' до начального контура p, если оно меньше r - контур в помойку. Остается маленький ньюанс, мы работаем с не точными вычислениями, значит надо делать допуск, но в некоторых случаях это может приводить к появлению маленьких артефактов.
- можно упростить и искать расстояние от средней точки контура. Дальше тоже самое.
- можно смотреть угол с которым контур pk' пересекает контур pm' в точке разбиения, если он положительный оставляем контур, если нет - в топку. Опять же проблема с точностью вычислений.
Основная проблема - точность вычислений + граничные случаи, когда контуры совпадают.
- После удаления ненужных частей имеем набор контуров {p1',...,pk'}, их нужно попарно соединить по совпадению конечной и начальной точек двух контуров, в случае если клипинг проведен верно все контуры должны объединиться в множество замкнутых контуров.
Вот еще есть статейка по такому оффсету, но как-то странно она написана, и как мне кажется имеет неточности:
И статья по полигонам и их оффсету:
Re: Нужна процедура по формированию кармана.
Добавлено: 27 авг 2012, 12:49
mycnc
Прошу прощения за молчание (был в отпуске, интернет там с перебоями).
Спасибо за алгоритм и статьи. Будем читать, разбираться.
Появятся вопросы, отпишусь.