C言語でグラフ作成(2次元)

グラフをJPEGなどの画像データで出力

以上のことを行いたいと思っています。
簡単にできる方法をご存知の方がいましたら教えていただけないでしょうか?
また参考サイトやわかりやすい本などがあれば教えていただけないでしょうか?

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

グラフを書く、といっても



1) 数値上での座標を求める
2) 1)を画面上(画像上)の座標に変換する
3) 2)を使って、線や点や他の図形を書く
4) 3)を画面に表示したり、ファイルに保存したりする

ざっと見てもこれくらいの処理があって、元の質問だと、これを全部Cでやりたい、と読めます。
で、Cでやろうとすると、純粋な演算だけの1),2)はともかく、3)や4)には「標準」の方法はありません。WindowsだったらWin32 APIで可能だが、Linuxでは使えない、等の「環境依存」の度合いが大きくなりますから。


これが、Gnuplotを使うとなると、Cでやる必要があるのは1)だけです。2以降はGnuplotの仕事になります。
Cのプログラムは 1)の座標(と、グラフ表示のためのいくつかの設定)をprintfで出力するだけの単純なものになります。どんな内容を出力するか、は、CではなくてGnuplotのマニュアルを参考に決めます。繰り返しになりますが、Cではそれをprintf(他の関数でもいいですが)するだけです。

そもそも、Cでやるべきものなのかも疑問です。データによっては、Gnuplotだけで済みます。
    • good
    • 1
この回答へのお礼

すみません。ありがとうございます。

お礼日時:2011/04/23 16:46

> いえ、gunplotを使ってグラフを書こうと考えています。



それを先に書かないと...

gnuplotを使うことが決まっているのであれば、そのドキュメントを読んでください。
    • good
    • 0
この回答へのお礼

すみません。ありがとうございます。

お礼日時:2011/04/23 16:48

ごめん, 「C言語でグラフ作成」と「gunplotを使ってグラフを書こうと考えています」の関係がまったくわからん.



「gnuplot を使ってグラフを描く」のが, なんで「C言語」と関係するんだ?
    • good
    • 0
この回答へのお礼

すみません。知識不足でした。

お礼日時:2011/04/23 16:47

> これを折れ線グラフにしたいと思っています。



では、Bresenhamのアルゴリズムで調べてみてください。

というか、本当にスクラッチで実装したいのでしょうか?

この回答への補足

いえ、gunplotを使ってグラフを書こうと考えています。

補足日時:2011/04/22 16:15
    • good
    • 0
この回答へのお礼

すみません。ありがとうございます。

お礼日時:2011/04/23 16:48

処理系不明の状況では、スクラッチで実装するしかありません。


JPEGだと大変ですので、まずはBMPから始めたほうがよいでしょうね。

あとはどんなグラフかによります。
棒グラフとかだと簡単ですが、文字を描画するのが一番大変かもしれません。
まあ、数字だけならフォントを自作してもしれていますが...。

この回答への補足

さっそくのご回答ありがとうございます。処理するデータはCSV形式の2列データです。行数は30行程度です。

これを折れ線グラフにしたいと思っています。

アドバイズいただけないでしょうか?

補足日時:2011/04/22 15:27
    • good
    • 0
この回答へのお礼

すみません。ありがとうございます。

お礼日時:2011/04/23 16:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【C言語教えてください】sin波について

【C言語教えてください】sin波について

角度を0度から360度の範囲におけるsin(x)のグラフを'*'を使って表示するプログラムを書きたいのですがどなたか教えてください。

角度は10度刻み、正弦波の振幅は10でお願いします。

Aベストアンサー

#include <stdio.h>
#include <memory.h>
#include <math.h>
#define PI 3.1415

void main()
{
int x, y;
int ival;
double dval;
char graph[21][38];

memset(graph, ' ', sizeof(graph));
for (x=0; x<=36; x++) {
dval = 10.0 * sin(((double)x * 10.0 * PI) / 180.0);
if (dval < 0)
ival = (int)(dval - 0.5);
else
ival = (int)(dval + 0.5);
graph[ival+10][x] = '*';
}
for (y=20; y>=0; y--) {
graph[y][37]='\0';
puts(graph[y]);
}
}

QC言語でグラフ作成

Σ[ {(-1)^n } * { cos (2nπx / L) } / n ]
(Lは定数で、Σのnの範囲は0~20です)
という関数をグラフ化したいのですが、C言語で可能なのでしょうか?? もともとC言語でグラフが描けるのかどうかも分かりません。もし描けるのであれば、教えてください。お願いします。

Aベストアンサー

Windowsなら、(x,y)の組み合わせを計算してファイルに書き出しておき、これをエクセルで呼び出してグラフ化するテがあります。
具体的にはyの値をコンマ区切りで"goo_kotae.csv"というテキストファイルに書き込みます。
"goo_kotae"の部分は適宜お考えください。

なおTcl/Tkという世界的なGUIプログラミングプラットホームがあって、無償配布しています。これはUNIX生まれですが、Windows版もMac版もLinux版もOS2版も用意されています。しかもC言語との親和性が非常に良いです。
グラフィック部分はTcl/Tkで記述し、計算部分をC言語で記述すると、Windows並みのきれいなグラフが描けます。
グラフ描画部分にはライブラリが揃っているので、データ列さえ与えれば、短期間で表示できると思います。
Tcl/Tkに関する質問は、OKWebへ提起すれば回答者はいますよ。実際に質問して確認しました。

QC++で縦の棒グラフ

#include<iostream>
#include<ctime>
using namespace std;

int main()
{
inta[7];
int k;
int j;

srand(time(NULL));
for(k = 0; k < 7; k++)
a[k] = rand() % 10 + 1;

for(k = 0; k < 7; k++){
cout << "a[" << k << "] = ";
for(j = 0; j < a[k]; j++) cout << "*";
cout << "\n";
}


cout << "-------------\n";
cout << "0 1 2 3 4 5 6\n";
return 0;
}
グラフを作ってみようと挑戦したんですけど
横の棒グラフは作ることはできたんですけど
縦の棒グラフを作ろうして、下の部分はできたんですけど
その上に*をランダムの数だけ表示さす方法がわかりません。
どうしてらよいでしょうか?

Aベストアンサー

No.2はソースが見やすいように全角空白でインデントしていますので、コピー&ペーストする場合は、半角空白かTABに変換して下さい。

>  } else if (i<=a[j]) {
> の部分で iはそのうえのfor文のiが入っているんですか?
> a[j]の部分はいちばん上で入れたランダムの数が入っているんですか?

その通りですね。

Q縦の棒グラフ

こんにちは。30代のプログラム初心者です。
C言語で一日毎の平均気温に合わせて、「*」印を下図のようなイメージで表示する棒グラフを作成したい(5℃なら*を5つ表示)のですが、丸1日試行錯誤してもうまくいきませんでした。
ちなみに配列kionには、一日毎の気温を格納しています。

int kion{5,4,3,・・・};
(℃)
10|
9|
8|
7|
6|
5| *
4| * *
3| * * *
2| * * * (以下省略)
1|_*_* *_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
0 1 2 3 4 5 6 7 8 9 10 11 12 ~(以下省略)

横のメモリの
_ _ _ _ _ _ _ _ _ _ _ _ _
0 1 2 3 4 5 6 7 ・・・

は、普通にprintfで表示させているのですが、
縦の
10|
9|
8|
7|
6|
5|
の表示がうまくいきません。
二次元配列を使っているのですが、やりかたが悪いんだと思います。
アドバイスを頂ければありがたいです。よろしくお願い致します。

こんにちは。30代のプログラム初心者です。
C言語で一日毎の平均気温に合わせて、「*」印を下図のようなイメージで表示する棒グラフを作成したい(5℃なら*を5つ表示)のですが、丸1日試行錯誤してもうまくいきませんでした。
ちなみに配列kionには、一日毎の気温を格納しています。

int kion{5,4,3,・・・};
(℃)
10|
9|
8|
7|
6|
5| *
4| * *
3| * * *
2| * * * (以下省略)
1|_*_* *_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
0 1 2 3 4 5 6 7 8 9 10 11 12 ~(以下省略)...続きを読む

Aベストアンサー

こんな感じでどうでしょう?

for (i = 10; i > 0; i--){
 // 気温iのメモリ表示
 printf("%dl", i);

 // グラフ表示
 for (j = 0; j < 10; j++){
  if (kion[j] >= i){
   printf("*");
  }
  else{
   printf(" ");
  }
 }

 // 改行
 printf("\n");
}

一応、グラフまで表示できるようにしました。
ただし、このままでは、気温や日数の桁数が変わるとグラフががたがたになると思います。
質問者様がプログラミングの自己学習されているという判断でよいのでしょうか?
後は自力できれいな表示ができるようにがんばってください。

Qエクセルでグラフが書きたいです。

プログラミングC言語初心者です。
6000回ほど計算する、あるプログラミングを作りました。そしてその結果をresult.txtというファイルに出力したのですが、このデータを使ってエクセルでグラフを描く方法が分からず困っています。ちなみにX:時間でY:温度です。単純な2次曲線になると思うのですが。どのようにしたら良いのか教えてください、お願いいたします。

Aベストアンサー

result.txtが作成できるのでしたらそれを少し加工してresult.csvというCSVファイルを作るように変更しましょう。そうすればエクセルデータとして扱いやすいです。
CSVファイルとはなんぞ? という場合は、エクセルで適当に作ったファイルを「ファイルの種類にCSVを選んで」別名保存し、そのファイルをメモ帳で開いてみれば分かるかと思います。

もちろん現状のresult.txtそのままでも不可能ではないですが、result.txtがどのようなデータフォーマットなのかによってやり方が変わるので一概に答えはいえません。

QC言語を用いて、GNUPLOTでリアルタイムにグラフ化方法について。

C言語を使用して、GNUPLOTを呼び出し、時間とともに更新されていくデータをリアルタイムでグラフ化しようと思っていますが、なかなかうまくいきません。
私が考えていた簡単なプログラムのシーケンスとして、(OSはLinuxです。)

~データの作成~
 fopen;データファイルの作成
 fprintf;/データの作成
 fclose;/データの保存
~グラフ化~
 popen;/GNUPLOTの呼出
 fprintf(---,”plot \”[作成したデータファイル]\”\n”);/グラフ化
~データの更新~
 fopen;
 fprintf;
 fclose;/データの上書き
~グラフの更新~
 fprintf(---,”reread\n”);/データの再読み込み
 fprintf(---,”replot\n”);/グラフの更新
~データの更新~
~グラフの更新~
・・・/ループ
 pclose;/GNUPLOTの終了

と、データを更新したら、グラフ化をしていく予定でした(汗)。
テスト的に10回だけデータの更新をするプログラムを動作させると、
データの更新を先に全部行ってしまい、グラフ化されるのが、最後の更新データのみでした。
どのようにしたら、リアルタイムにデータをプロットできるでしょうか??
よろしくお願い致します。

C言語を使用して、GNUPLOTを呼び出し、時間とともに更新されていくデータをリアルタイムでグラフ化しようと思っていますが、なかなかうまくいきません。
私が考えていた簡単なプログラムのシーケンスとして、(OSはLinuxです。)

~データの作成~
 fopen;データファイルの作成
 fprintf;/データの作成
 fclose;/データの保存
~グラフ化~
 popen;/GNUPLOTの呼出
 fprintf(---,”plot \”[作成したデータファイル]\”\n”);/グラフ化
~データの更新~
 fopen;
 fprintf;
 fclose;/データの上書...続きを読む

Aベストアンサー

このサイトにヒントになりそうなことが載ってそうですね。
http://fenrir.naruoka.org/archives/000444.html
一度ご覧になってみて下さい。

Q三角関数の記述の仕方

タイトルそのまんまなんですが、三角関数はC言語ではどのように記述すればいいでしょうか?
角度にラジアン表記でπ(パイ)を使いたいんですが、その表記方法もわかりません。
僕の持っている本に載ってなかったので質問させていただきました。
よろしくお願いします。

Aベストアンサー

C言語で三角関数を使うためには、math.h をインクルードする必要があります。使い方は例えば、こんな感じです。

#define M_PI 3.14159265358979 /* 円周率 */

double x, y, theta;

theta = M_PI / 4.0;
x = cos(theta); /* sin,cos,tanの引数は弧度法の角度です。*/
y = sin(theta);

πは上記の例のように自分で定義して使ってください。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

Qcでなぜguiアプリが作成出来るのか。

cでなぜguiアプリが作成出来るのか。

現在cについて学習中です。
テキストエディタで書きターミナルで実行しています。
cではアプリが作れるようになるといいますが
現在のままではcuiのソフトしかできる気がしません。

一般的に言われるアプリケーションというものを
作成するにはまた別の手段が必要なのでしょうか。

Aベストアンサー

C言語の標準関数では出来ませんね。
Windowsであれば、WindowsAPIと言う関数群を使ってウィンドウを作成したり、ウィンドウをコントールする事が出来ます。
昔のMS-DOS時代であれば、直接VRAM(画像メモリ)をポインタで操作出来ましたので、VRAMに直接書いていました。

WindowsAPIについて紹介しておきます。
「Win32 API入門」Win32は、WindowsAPIの32bit版と言う意味です。
http://wisdom.sakura.ne.jp/system/winapi/index.html
C言語の知識としては、ポインタから構造体まで使いますので初心者にはムチャクチャ難しいです。CUIが自在に組める人でも挫折者がいますからね。

そうそう、CUIでもこのぐらいは出来るよと言う例も書いときますね。
http://hp.vector.co.jp/authors/VA016117/cprog/index.html
参考にしてください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング