igraph/ext/cIGraph_layout3d.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);
}