PLPLOTライブラリを使ったプログラム例

ランダムネットワークを作成し,画面上に表示するプログラム例

plplotのマニュアルはhttp://cosmos.js.yamanashi.ac.jp/man4local/plplot/にある.

#include "plConfig.h"
#include "plplot.h"
#include "plevent.h"
#include <unistd.h>
#include <math.h>
#include <stdlib.h>

#define AGENT_NUM 100
#define LINK_NUM 300
typedef struct agent_type {
  int attri; /* 協力的(C): 1 利己的(D): 0 */
  int payoff;
  int linkto[AGENT_NUM];
  int c_max;
} AGENT;

int main() {

  int i,n,m;
  AGENT a[AGENT_NUM];

  /* 初期設定 */
  for(i=0; i<AGENT_NUM; i++){
    a[i].c_max=-1; /* リンク先は0から付番 0個の場合は c_max=-1 */
    a[i].attri = (int) ( 0.5 + (double)random()/RAND_MAX); /* CかDの初期値 */
  }

  /*ランダムにリンクを張る */
  for(i=0; i<LINK_NUM; i++){
    n = (double) random()/RAND_MAX * AGENT_NUM; /*リンク元の選定 */
    m = n;
    while(m==n) m = (double) random()/RAND_MAX * AGENT_NUM; /* リンク先の選定 */
    a[n].c_max++;
    a[n].linkto[a[n].c_max] = m;
    a[m].c_max++;
    a[m].linkto[a[m].c_max] = n;

  }

  /* 描画 */
  drawGraph(a);
  exit(0);
}

/* PLPLOTを用いた描画関数 */
int drawGraph(AGENT a[]) {
  int i,j;
  double xmax, ymax;
  double x[AGENT_NUM][1], y[AGENT_NUM][1];
  int col[2] = {1,9}; /* マークの色 */

  xmax=5.0; ymax=5.0;

  plsdev("xwin");
  plsetopt("geometry","600x600"); /* ウィンドウサイズの設定 */
  plsetopt("bg","FFFFFF");
  plinit();

  plcol0(1);
  plenv(0,xmax,0,ymax,1,-2);  /* 5,6引数は軸と枠を書くかどうか */

  /* positions (coodinate) of agent */
  for(i=0;i<AGENT_NUM; i++) {
    x[i][0] = (double) random()/RAND_MAX * xmax;
    y[i][0] = (double) random()/RAND_MAX * ymax;

    plcol0(col[a[i].attri]);
    plpoin(1,x[i],y[i],a[i].attri+16);
  }
  plcol0(5);
  for(i=0;i<AGENT_NUM; i++) {
    j=0;
    while(j < =a[i].c_max) {
      pljoin(x[i][0],y[i][0],x[a[i].linkto[j]][0],y[a[i].linkto[j]][0]);
      j++;
    }
  }
  plend();
  return(0);
}

コンパイルを簡単に行う方法

Makefileというファイルを,Cプログラムソースと同じところにつくる.下記のようなものをつくれば,

   make randomNet
とするだけでコンパイルできる.

Makefileの例

CC = /usr/bin/gcc
LIB_TAG = d
PKG_CONFIG_ENV = PKG_CONFIG_PATH=/usr/lib/pkgconfig

# 基本書式
#
# ターゲット名:  依存コンポーネント(ソースファイル)
# (tab) 命令
#
# 2行目の先頭は空白ではなくタブであること

randomNet: randomNet.c
        $(CC) $< -o randomNet `$(PKG_CONFIG_ENV) pkg-config --cflags --libs plplot$(LIB_TAG)`