【问题标题】:Graph drawing algorithm绘图算法
【发布时间】:2012-04-06 00:37:01
【问题描述】:

我有一个像这样的顶点邻接关系在矩阵上的无向图;

    /*    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}};

我想在坐标系上绘制这张图。通过任何方法(力导向,弹簧与)给出每个顶点位置(x,y)的算法是什么?我只问伪代码,而不是任何要绘制的库或软件。 谢谢。

【问题讨论】:

  • 还有其他要求吗?把它们围成一个圈怎么样?
  • @cato:不,谢谢。我只是对职位感兴趣。我正在使用 allegro5 画圆或线。
  • 我的意思是,让位置围绕一个圆圈。例如,如果有四个顶点,则顶部、左侧、底部和右侧各有一个。
  • 位置和整个图形形状不是必需的。顺便说一下,有100多个顶点。
  • 为什么关于图形绘制的每一个问题都没有答案或没有解决?

标签: c graph graph-drawing


【解决方案1】:

这是描述良好的 as3 算法。我解决了我的问题。谢谢。 http://blog.ivank.net/force-based-graph-drawing-in-as3.html

【讨论】:

    【解决方案2】:

    这是从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);
            }
        }
    }
    

    如果需要,您也可以将其更改为使用浮点数或双精度数。

    【讨论】:

    • 你能解释一下什么是行、列、坐标、最大尺寸吗?
    • @miqbal rows:图表中的行数。 cols:图表中的列数。坐标:点的二维数组,行 x 列的大小,放置结束坐标。 maxSize:图形边界的最大大小(x,y,宽度,高度)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多