web-dev-qa-db-ja.com

Cのグラフィックライブラリ

使いやすいC用の優れた無料のグラフィックライブラリがあるかどうか疑問に思いました。 2Dおよび3Dグラフをプロットし、ファイルに保存するためのものです。 Linuxシステム上にあり、現在システム上にgnuplotはありません。

それとも、別の言語に切り替える方が簡単でしょうか。そうであれば、どちらの言語を習得しやすいでしょうか。

14
user207025

Cで2Dおよび3Dグラフをプロットするには、ライブラリ [〜#〜] dislin [〜#〜] をお勧めします。例を見ることができます ここ または そこ

コードは非常に使いやすく、素晴らしい結果が得られます。

3
Once

カイロライブラリ が好きです。それはCへの素晴らしいインターフェースを持っており、それは多くのフォーマットで出力することができます。

5
user181548

簡単なものが必要なときに、netpbm形式を数回使用しました。

このようにして、qsort()(私の実装および提供されたデータ)がマージソートを実行することがわかりました。

qsort

ソースコード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ARRAY_SIZE 20
#define MAX_VALUE 10

unsigned char arr[ARRAY_SIZE];

void print_array(const void *left, const void *right) {
  static int imgs = 0;
  int k, j;
  FILE *img;
  char fname[100];
  char rgb[100];

  if (++imgs > 9999) return;
  sprintf(fname, "img/img%04d.ppm", imgs);
  /* create image in "img/" directory */
  img = fopen(fname, "w");
  if (img) {
    fprintf(img, "P3\n%d %d\n255\n", ARRAY_SIZE, MAX_VALUE);
    for (j=0; j<MAX_VALUE; j++) {
      for (k=0; k<ARRAY_SIZE; k++) {
        int colour = 0;
        if (left && left == arr+k) colour = 2;
        if (right && right == arr+k) colour = 2;
        if (arr[k] == MAX_VALUE - j - 1) colour = 1;
        switch (colour) {
          default: sprintf(rgb, "%d %d %d", 255, 255, 255); break;
          case 1: sprintf(rgb, "%d %d %d", 0, 0, 0); break;
          case 2: sprintf(rgb, "%d %d %d", 255, 0, 0); break;
        }
        }
        fprintf(img, "%s\n", rgb);
      }
    }
    fclose(img);
  } else {
    perror("img fopen");
  }
}

int cmp(const void *left, const void *right) {
  const unsigned char a = *(const unsigned char*)left;
  const unsigned char b = *(const unsigned char*)right;

  print_array(left, right);
  if (a < b) return -1;
  if (a == b) return 0;
  return 1;
}

int main(void) {
  int k;
  unsigned int seed = 0; /* or time(0) */

  srand(seed);
  for (k=0; k<ARRAY_SIZE; k++) {
    arr[k] = Rand() % MAX_VALUE;
  }
  print_array(NULL, NULL);
  qsort(arr, (size_t)ARRAY_SIZE, sizeof *arr, cmp);
  print_array(NULL, NULL);
  /* use imagemagick to convert group of files to .gif */
  system("convert -delay 0"
         " img/img*.ppm"
         " -loop 1 img/libc-qsort2.gif");
  /* remove .ppm files */
  system("rm img/" "*ppm"); /* ... my editor does not like a
                                   slash and a star together,
                                   even inside quotes */

  return 0;
}
2
pmg

この質問は少し曖昧です、「グラフィックス」は広い分野です。単純な [〜#〜] sdl [〜#〜] を使用してかなり遠くまで行くことができますが、「低レベルすぎる」と見なされることもあります。より多くの要件を提供する必要があります。

2
unwind

クラッター があります。アバウトページの抜粋を次に示します。

「Clutterは、高速で視覚的に豊かな、ポータブルでアニメーション化されたグラフィカルユーザーインターフェイスを作成するためのオープンソースソフトウェアライブラリです。」

「クラッターは非特定を目指しています。特定のユーザーインターフェイススタイルを実装するのではなく、特定のニーズに合わせた高レベルのツールキットをすばやく簡単に作成できる豊富な汎用基盤を提供します。」

「Perl、Python、C#、C++、Vala、Rubyの言語バインディングを使用してCで開発されました。」

「位置、グループ化、透明度、スケーリング、クリッピング、回転を介して3D空間で操作される階層化された2Dインターフェイス要素のシーングラフ。」

自分で試したことはありませんが、遊んでみたいものを探しているなら、かなり柔軟に思えます。

2
waffleman

Qt GUIツールキットとオープンソース QwtPlot および QwtPlot3D を組み合わせることをお勧めします。それはC++で実装されており、使いやすく、拡張可能で、無料です...

1
JimDaniel

PGPLOTを見てください。それは古いですが、うまく機能し、リポジトリにあるはずです。 PLPLOTもオプションです。これは類似していて新しく、リポジトリでもすぐに利用できるはずです。それらは両方とも非常に強力であり、指定したことを実行できます。

0
stevenrjanssens

ほとんどの人はCからのレンダリングに Gdライブラリ を使用しますが、「数学プロット」の部分を実装する必要があります。

0
Aaron Digulla