0

Имея общее m-мерное пространство Мне нужно рассчитать m + 1 координаты, которые все равноудаленные между ними.Вычислить координаты всех равноудаленных среди них

Допустим, что 2D пространство может обрабатывать максимум 3 равноудаленных точек (равносторонний треугольник, созданный 3 вершинами все равноудаленных среди них) и так далее .. в общем говоря, мы можем представить м равноудаленных вершин в пространстве м-1.

Расстояние между вершинами является единичное расстояние (1), для простого 2D случае расстояние между 3 вершины равна 1.

Я читал об этом Equidistant points across a cube, но мой запрос отличается и имеет только один (большой) вместо двух.

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

Спасибо всем.

Редактировать ----------- Решение состоит в следующем (п являются размеры):

static double[] simplex_coordinates2 (int n) 
{ 
    double a; 
    double c; 
    int i; 
    int j; 
    double s; 
    double[] x; 

    x = r8mat_zero_new (n, n + 1); 

    for (i = 0; i < n; i++) 
    { 
    x[i+i*n] = 1.0; 
    } 

    a = (1.0 - Math.sqrt (1.0 + (double) (n)))/(double) (n); 

    for (i = 0; i < n; i++) 
    { 
    x[i+n*n] = a; 
    } 
// 
// Now adjust coordinates so the centroid is at zero. 
// 
    for (i = 0; i < n; i++) 
    { 
    c = 0.0; 
    for (j = 0; j < n + 1; j++) 
    { 
     c = c + x[i+j*n]; 
    } 
    c = c/(double) (n + 1); 
    for (j = 0; j < n + 1; j++) 
    { 
     x[i+j*n] = x[i+j*n] - c; 
    } 
    } 
// 
// Now scale so each column has norm 1. 
// 
    s = 0.0; 
    for (i = 0; i < n; i++) 
    { 
    s = s + x[i+0*n] * x[i+0*n]; 
    } 
    s = Math.sqrt (s); 

    for (j = 0; j < n + 1; j++) 
    { 
    for (i = 0; i < n; i++) 
    { 
     x[i+j*n] = x[i+j*n]/s; 
    } 
    } 
    return x; 
} 

static double[] r8mat_zero_new (int m, int n) 
{ 
    double[] a; 
    int i; 
    int j; 

    a = new double[m*n]; 

    for (j = 0; j < n; j++) 
    { 
    for (i = 0; i < m; i++) 
    { 
     a[i+j*m] = 0.0; 
    } 
    } 
    return a; 
} 
+1

Единичные векторы (1,0,0 ... 0), (0,1,0, ..., 0) и т. Д. В пространстве m + 1 образуют такую ​​конфигурацию m + 1 эквидистантных точек. Все они лежат в плоскости x [1] + x [2] + ... + x [m + 1] = 1. Таким образом, нужно только поворачивать или Householder-отражать нормаль этой плоскости в последнем единичном векторе, чтобы получить эту конфигурацию в m-пространстве. – LutzL

ответ

0

Вам необходимо регулярный симплекс.
Wiki page содержит информацию о координатах правильных вершин.

Основной трюк основан на том факте, что угол между любой парой векторов из симплексного центра к вершинам является arrcos (-1/г), где d представляет размерность пространства (2d, 3d, 4d и т.д.)

Пример для 2D-фрейма:
Первую координату вершины V2 = (x1,y1) = (0,1)
Точный продукт (x2, y2) и (x3, y3) с V1 должен быть -1/2, поэтому оба x2 и x3 равны -1/2
y2 и y3 являются Sqrt(3)/2 и -Sqrt(3)/2 - от расстояния = 1 до координат начала координат

Последний шаг - нормализуют координат, чтобы получить расстояние 1 между вершинами - просто умножить все координаты по коэффициенту C=Sqrt(d/(2*(d+1)))
(из теоремы косинусов c^2+c^2+2*c*c/d=1)

Для 2d-случае C=Sqrt(3)/3, так симплекс вершины

(Sqrt(3)/3, 0) 
(-Sqrt(3)/6, 1/2) 
(-Sqrt(3)/6, -1/2) 
+0

Я нашел это https://people.sc.fsu.edu/~jburkardt/m_src/simplex_coordinates/simplex_coordinates.html, возможно, это то, что я ищу с кодом. Как вы думаете? Будет ли он генерировать m + 1 эквидистантных (среди них) точек? – vincenzodentamaro

+0

Способ 1 равен описанному. Кажется, что метод 2 тоже работает. Это действительно очень просто для реализации. – MBo