Я рассматриваю некоторый код MATLAB, который общедоступен в следующем месте: https://github.com/mattools/matGeom/blob/master/matGeom/geom2d/orientedBox.m
Это реализация алгоритма вращающихся штангенциркулей на выпуклой оболочке набора точки для вычисления ориентированной ограничительной рамки. Мой обзор состоял в том, чтобы понять интуитивно, как работает алгоритм, однако я ищу разъяснения по определенным строкам в файле, в которых я запутался.
В строке 44: hull = bsxfun(@minus, hull, center);
. По-видимому, это переводит все точки в наборе выпуклой оболочки, поэтому вычисленный центроид находится в (0,0). Есть ли какая-то конкретная причина, почему это выполняется? Мое единственное предположение состоит в том, что позднее в коде допускается прямое вращательное преобразование, поскольку вращение вокруг реального источника вызовет значительные проблемы.
В строках 71 и 74: indA2 = mod(indA, nV) + 1;
, indB2 = mod(indB, nV) + 1;
. Это трюк, чтобы предотвратить выход индекса доступа за пределы? Мое предположение состоит в том, чтобы запретить доступ через границы, он перевернет индекс при достижении конца.
В строке 125: y2 = - x * sit + y * cot;
. Это правильное преобразование, так как код ведет себя правильно, но я не уверен, почему это на самом деле используется и отличается от других вращательных преобразований, выполненных позже, а также ранее (с вызовами rotateVector). Мое лучшее предположение, что я просто не представляю, что вращение нужно сделать в моей голове правильно.
Примечание: внешняя функция вызывает vectorAngle
, rotateVector
, createLine
и distancePointLine
все можно найти в одном и том же хранилище, в файлах, названных по имени функции (согласно стандарту MATLAB). Они относительно неинтересны и делают то, что вы ожидаете, за исключением того факта, что происходит нормализация векторных углов.