120 lines
3.0 KiB
C
120 lines
3.0 KiB
C
#include "igraph.h"
|
|
#include "ruby.h"
|
|
#include "cIGraph.h"
|
|
|
|
/* call-seq:
|
|
* graph.layout_random -> IGraphMatrix
|
|
*
|
|
* Returns a random layout in 3D.
|
|
*/
|
|
VALUE cIGraph_layout_random_3d(VALUE self){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_random_3d(graph,res);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_sphere -> IGraphMatrix
|
|
*
|
|
* Places vertices (more or less) uniformly on a sphere.
|
|
*
|
|
* The algorithm was described in the following paper: Distributing many
|
|
* points on a sphere by E.B. Saff and A.B.J. Kuijlaars, Mathematical
|
|
* Intelligencer 19.1 (1997) 5--11.
|
|
*/
|
|
VALUE cIGraph_layout_sphere(VALUE self){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_sphere(graph,res);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_fruchterman_reingold_3d(niter,maxdelta,volume,coolexp,repulserad) -> IGraphMatrix
|
|
*
|
|
* This is the 3D version of the force based Fruchterman-Reingold layout.
|
|
*
|
|
* niter: The number of iterations to do.
|
|
*
|
|
* maxdelta: The maximum distance to move a vertex in an iteration.
|
|
*
|
|
* volume: The volume parameter of the algorithm.
|
|
*
|
|
* coolexp: The cooling exponent of the simulated annealing.
|
|
*
|
|
* repulserad: Determines the radius at which vertex-vertex repulsion
|
|
* cancels out attraction of adjacent vertices.
|
|
*/
|
|
VALUE cIGraph_layout_fruchterman_reingold_3d(VALUE self,
|
|
VALUE niter,
|
|
VALUE maxdelta,
|
|
VALUE volume,
|
|
VALUE coolexp,
|
|
VALUE repulserad){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_fruchterman_reingold_3d(graph,res,
|
|
NUM2INT(niter),
|
|
NUM2DBL(maxdelta),
|
|
NUM2DBL(volume),
|
|
NUM2DBL(coolexp),
|
|
NUM2DBL(repulserad),
|
|
1, NULL);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_kamada_kawai_3d -> IGraphMatrix
|
|
*
|
|
* Places the vertices on a plane according the Kamada-Kawai algorithm.
|
|
*
|
|
* This is a force directed layout, see Kamada, T. and Kawai, S.: An
|
|
* Algorithm for Drawing General Undirected Graphs. Information Processing
|
|
* Letters, 31/1, 7--15, 1989.
|
|
*/
|
|
VALUE cIGraph_layout_kamada_kawai_3d(VALUE self,
|
|
VALUE niter,
|
|
VALUE sigma,
|
|
VALUE initemp,
|
|
VALUE coolexp,
|
|
VALUE kkconst){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_kamada_kawai_3d(graph,res,
|
|
NUM2INT(niter),
|
|
NUM2DBL(sigma),
|
|
NUM2DBL(initemp),
|
|
NUM2DBL(coolexp),
|
|
NUM2DBL(kkconst),0);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|