Я хочу знать точный метод, чтобы найти центр произвольной формы в 3D.
На рисунке я объяснил 3 случая.
В первом случае, как мы можем вычислить центр произвольных точек? Одной из идей является суммирование всех баллов, деленное на общее количество баллов. Это единственный метод и является ли он точным?
2-й, как вычислить приблизительный центр неправильной произвольной формы в 3D? Это тот же случай 1?
Как мы можем вычислить центральную линию изогнутой / изогнутой трубы, которая состоит из произвольных вершин? По этой проблеме мы должны решить первые два случая, я так думаю?
Решение действительно зависит от того, что вы на самом деле ищете.
Если вы ищете среднее положение всех точек в форме, то усреднение их действительно даст вам это. Но это может быть далеко от того, что вы интуитивно скажете, «в середине». Например, рассмотрим прямоугольник, в котором одна сторона имеет в два раза больше вершин, чем противоположная. Средняя позиция будет на половине этой стороны, а не в середине поля.
Скорее всего, я бы сказал, что вы ищете точку, определенную путем вычисления максимальных и минимальных границ в каждом измерении, а затем усреднения двух. Поскольку вы пометили это с помощью C ++, вот пример кода:
// Define max and min
double max[DIMENSIONALITY];
double min[DIMENSIONALITY];
// Init max and min to max and min acceptable values here. (see numeric_limits)
// Find max and min bounds
for(size_t v_i = 0; v_i < num_vertices; ++v_i)
{
for(int dim = 0; dim < DIMENSIONALITY; ++dim)
{
if(shape[v_i][dim] < min[dim]) min[dim] = shape[v_i][dim];
if(shape[v_i][dim] > max[dim]) max[dim] = shape[v_i][dim];
}
}
// Calculate middle
double middle[DIMENSIONALITY];
for(int dim = 0; dim < DIMENSIONALITY; ++dim)
middle[dim] = 0.5 * (max[dim] + min[dim]);
Для любого решения размерность проблемы не имеет значения.
Редактировать:
Как указано в комментарии ниже, это может привести к средней точке, которая находится за пределами самой фигуры. Если вам нужна точка, которая лежит внутри форма, альтернативный подход должен быть использован. Простым решением может быть использование лучевого марширования по каждой оси.
Других решений пока нет …