Алгоритм рисования графиков - PullRequest
0 голосов
/ 21 марта 2012

У меня есть неориентированный граф на матрисе с такими отношениями смежности вершин;

    /*    a  b  c  d
     * a -1  0  1  1
     * b  0 -1  1  1
     * c  1  1 -1  1
     * d  1  1  1 -1 
     *
     */

    int G[4][4] = {{-1, 0, 1, 1},
                   { 0,-1, 1, 1},
                   { 1, 1,-1, 1},
                   { 1, 1, 1,-1}};

Я хочу нарисовать этот график в системе Cininate. Каков алгоритм, который дает каждую позицию вершины (x, y) любым методом (направленный по силе, против пружины)? Я просто прошу псевдокод, а не какую-либо библиотеку или программное обеспечение для рисования. Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 марта 2012

Вот хорошо описанный алгоритм с as3.Я решил свою проблему.Благодарю.http://blog.ivank.net/force-based-graph-drawing-in-as3.html

0 голосов
/ 21 марта 2012

Вот макет кругового графика, модифицированный из библиотеки prefuse :

void layoutPoints(int rows, int cols, Point **coordinates, Rectangle maxSize)
{
    int nn = rows * cols;
    int width = maxSize.width;
    int height = maxSize.height;
    int centerX = maxSize.x + (width / 2);
    int centerX = maxSize.y + (width / 2);

    int radius = 0.45 * (height < width ? height : width);

    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < width; j++)
        {
             double angle = (2 * M_PI * i) / nn;
             double x = cos(angle) * radius + centerX;
             double y = sin(angle) * radius + centerY;
             coordinates[i][j].x = round(x);
             coordinates[i][j].y = round(y);
        }
    }
}

Вы можете изменить это, чтобы использовать числа с плавающей запятой или двойные, если вам это необходимо.

...