C#で複数折れ線描画の際の違う色の塗布、各番号表示

このQ&Aのポイント
  • C#で複数の折れ線を描画し、各折れ線に違う色をつけ、各折れ線に番号をつけて表示する方法について教えてください。
  • 折れ線を描画する場所はpictureBoxで、折れ線の個数と各折れ線を描く点の個数は任意の入力値です。
  • どのようにすると、折れ線ごとに異なる色を設定し、番号を表示することができるのか、具体的な方法を教えてください。
回答を見る
  • ベストアンサー

C#で複数折れ線描画の際の違う色の塗布、各番号表示

C#で複数折れ線描画の際の違う色の塗布、各番号表示 前に解答下さった方ありがとうございました。 前の折れ線描画ですが分かりづらかったので再度投稿します。 C#で折れ線の描画を行っているのですが 複数の折れ線を描画した際に ・各折れ線ごとに違う色をつける ・各折れ線ごとに番号をつけて表示する ということは可能なのでしょうか? 折れ線を描画する場所はpictureBoxです。 ちなみに任意の何個の折れ線を描くかという折れ線の個数と 1つの折れ線を何個の点で書くかという情報は任意の入力値となります。 そのため折れ線の描画はfor文制御による自動描画となっております。 そのため以下ソースのPens.BlackのBlackを"Red"と指定するということはできません。 ちなみに下記の kosu_iが何個の折れ線を描画したいか sampTが1つの折れ線を何個の点で描画したいか を表わしていて、 sampT=zigen_i/2となっております。 zigen_iも任意の入力値です。 途中、y座標を数学座標への変換も行っています。 data_dからの折れ線描画イメージとしては kosu_i =1, zigen_1=10 data_d[1, 10] = 0 1 2 3 4 5 6 7 8 9 の場合、 折れ線1を(0,1)(2.3)(4,5)(6,7)(8,9) として5(10/2=5)点で描きますということです。 このようにして任意の個数分だけ折れ線を描画するのですが 「この際に違う色をつける、折れ線ごとに番号をつける」 にはどうすればいいのか知りたいのです。 宜しくお願いいします。 以下ソース private void pictureBox1_Click(object sender, EventArgs e) { Point[] pt = new Point[100]; // 座標を格納する変数 double[,] data_d_axi = new double[100, 100]; int sampT; int x_axi = 0; int y_axi = 1; //描画準備 pictureBox1.Refresh(); // 念の為、描画した点を消去する //Graphicsオブジェクトの作成 Graphics g = pictureBox1.CreateGraphics(); //描画**データ毎に違う色を;; sampT = zigen_i / 2; Point[] po = new Point[sampT]; //x,yは整数 for (int i = 0; i < kosu_i; i++) { for (int j = 0; j < sampT; j++) { //y座標を数学座標系に変換 data_d_axi[i, y_axi] = pictureBox1.Height - data_d[i, y_axi]; pt[j].X = (int)data_d[i, x_axi]; pt[j].Y = (int)data_d_axi[i, y_axi]; po[j] = new Point(pt[j].X, pt[j].Y); x_axi = x_axi + 2; y_axi = y_axi + 2; } g.DrawLines(Pens.Black, po); x_axi = 0; y_axi = 1; } //brs.Dispose(); //brushオブジェクトの解放 //リソースを開放する g.Dispose(); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

for (int i = 0; i < kosu_i; i++) {  for (int j = 0; j < sampT; j++)  {   // 省略  }  Brush[] b = {Brushes.Black, Brushes.Green...} // 色の配列  pen p = new Pen(b[i]);  g.DrawLines(p, po);  // 文字列の描画  g.DrawString((i + 1).tostring() ); //  (i + 1).tostringでNoを振る } Drawstringについては調べたらすぐ出てきます。 色の配列については入力できる最大値分用意して下さい。

saclover
質問者

お礼

的確なアドバイスありがとうございました! おかげで表示できました☆ またお願いいたします;;

関連するQ&A

  • C# マップエディタの描画方法

    現在マップエディターを作ろうとして 色々試しているのですが かなり迷走してきたので質問させてください 現在RPGツクールなどでよく見られる マップチップの配置をするところの描画で悩んでいるのですが private void Picture_Main_Paint(object sender, PaintEventArgs e) { float fSize = 1.0f; //float fSize = 0.5f; //float fSize = 0.25f; e.Graphics.ScaleTransform(fSize, fSize); for (int z = 0; z < 4; z++) {   for (int j = 0; j < 100; j++) // ループ回数は適当です   {     for (int i = 0; i < 100; i++)     {       int X = (int)(32 * fSize) * i;       int Y = (int)(32 * fSize) * j;       e.Graphics.DrawImage(bitmapBase[0, 0], new Point(X, Y));     }   } } } といったようにしているのですが 等倍ならまだしも縮小したときは画面分のループを行うので 処理が重すぎて使い物になりません。 マップエディタのような描画で なにかヒントになるようなものがあれば何でもいいので 教えていただけないでしょうか よろしくお願いします。

  • テント写像のプログラムについて質問です

    テント写像のプログラムについて質問です。 下記のプログラムにて 「テント写像の頂点位置を順次変えていき、その頂点のx座標値より大きいなら「1」小さいなら「0」をカウントし、最終的に、各x、yの値に置ける1と0の個数を表示する」 というプログラムを作ったのですが、明らかに計算回数(#define Nの値です)よりも多い値が出力されてしまい困っています。 皆様のお力で解決してもらえないでしょうか? --------以下問題のプログラム---------- #include <stdio.h> #include <math.h> #define x0 0.10 #define N 100 main() { FILE *pt; /* ファイルポインタ */ double i,j; double x,u=0; double data; int k; int data1,data0; data1=0;data0=0; if((pt = fopen("tent_kosu2.dat","wt")) !=NULL){ /* ファイルオープン*/ for(i=0.1;i<=1;i+=0.1){ //xの刻み for(j=0.9;j<=1;j+=0.01){ //yの刻み for(k = 0, x=x0; k <= N; k++){ u = (j/ i); x = 1.0-fabs(1.0-u*x); /* テント写像 */ data=x-i; if(data>0){data1++;} else if(data<0){data0++;} if(k%N==0){/*計算回数が100回1セットなので1セット終了毎の個数を表示させる*/ fprintf(pt,"0は%d個 1は%d個¥t x=%5.2f y=%5.2f¥n",data0,data1,i,j);}/* ファイル書き込み */ } } } } } fclose(pt); /* ファイルクローズ*/ } ---------ここまで------- よろしくお願いします。

  • C#でPictureBoxが二重に表示される

    碁盤を描画し、その上にマウスを合わせたとき付近の交点にPictureBox(サイズは21x21)でカーソルを表示しようと考え、次のように書きました。 int sx = (int)Math.Floor((double)(e.X - 12) / 25) + 1; int sy = (int)Math.Floor((double)(e.Y - 12) / 25) + 1; imgCsObj.Location = new Point(sx*25-21, sy*25); しかし盤上でマウスを動かすと画像のように二重にカーソルが表示される現象が起きました。 おそらく内部的にはカーソルを表示した途端にフォーカスが盤から離れPictureBoxを移動する作業が中断されたせいでは、と思い imgCsObj.Enabled = false; imgCsObj.Location = new Point(sx*25-21, sy*25); imgCsObj.Enabled = true; 一度無効にしてフォーカスがあたらない状態で位置だけ変更しようと思いましたが同じ結果でした。 どうやって以前の位置のカーソルを消せば良いのでしょうか

  • c言語のmalloc()とエラー表示

    .malloc()については以前も質問させて頂きましたが 新たな疑問についてご教示下さい。 ・下記のプログラムでmalloc()とrealloc()は正常に作動していると思いますが、入力表示を有効にすると下記の「エラー表示」が表示されます。 ・「エラー表示」されてもプログラムは最後まで実行される様です。 ・n=400までは表示されます。 ・この理由が分かりません、ご教示下さい。 ・malloc()関係は不安定な関数群でしょうか? ■「エラー表示」について *********************************************************** 問題が発生したため、***.exeを終了します。ご不便をおかけて申し訳ありません。 作業途中・・・・・ この問題を「マイクロソフト」に報告ください。 ************************************************************ ・一部ですが以上の様なエラー表示です。 //malloc_2 #include <stdio.h> #include <stdlib.h> void MylnOut(int ,int ,int *); //************************************************************** // MAIN //************************************************************** int main() { int *map; int X=10,Y=10,n; /* 疑似2次元配列確保と初期表示 */   printf("初期値.... \n");   map=(int *)malloc(sizeof(X*Y)); // MylnOut( X, Y, map); /* 変更数値入力 */ for(n=1;n<401;n++){   X=rand()%50+2;   Y=rand()%50+2;   printf("変更..%3d回目 X=%2d Y=%2d\n",n,X,Y); /* 領域変更と表示 */   map=(int *)realloc(map,sizeof(X*Y)); // MylnOut( X, Y, map); } /* 領域開放 */   free(map);   map=NULL; return 0; //************************************************************** // 入力・表示 //************************************************************** void MylnOut(int X,int Y,int *map) {   int i,j;   for(j=0;j<Y;j++)    for(i=0;i<X;i++) map[j*Y+i]=X;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[j*Y+i]);    printf("\n");   } } ・コンパイルエラーは無く実行時エラーです。 .Borland C++ Compiler 5.5.1,TuboDebugger 5.5を使用しています。

  • 【WinAPI】 四角形の色を選択して描画

    環境:VisualStudio2005、WinXP 目的:閉じた図形の内部の色を指定の色で塗りつぶしたい 現在 // 四角形を描画(Polygonバージョン) int x1 = 0, y1 = 0, x2 = 100, y2 = 100; POINT p[ 4 ]; p[ 0 ].x = x1, p[ 0 ].y = y1; p[ 1 ].x = x2, p[ 1 ].y = y1; p[ 2 ].x = x2, p[ 2 ].y = y2; p[ 3 ].x = x1, p[ 3 ].y = y2; Polygon( hdc, p, 4 ); や // 四角形を描画(Rectangleバージョン) Rectangle( x1, y1, x2, y2 ); などで四角形を描画するプログラムを作っています。 そしてこれに色を指定したいのですが、枠の部分に関しては HPEN hPen = CreatePen( PS_SOLID, 1/*線の厚さ*/, RGB(255,0,0) ); SelectObject( hdc , hPen ); // この後に四角形を描画 を指定することで色が変わりました。 しかし四角形の内側の部分の色に関しての色の指定方法が分かりません。 SelectObject(hdc , GetStockObject( GRAY_BRUSH ) ); でGRAY_BRUSH、BLACK_BLUSHなど数種類の指定ができるというのを調べましたが、 これだと好きな色を指定できません。 閉じた図形の内部の色を好きな色で塗りつぶす方法は無いのでしょうか・・?

  • メソッド

    public class Point{ public int x; public int y; public void swap(int s){ int x = s * y; y = s * x; this.x = x; } public void swap2(int s){ int x = s * y; y = s * this.x; this.x = x; } public static void main(String[] args){ Point pt = new Point(); pt.x = 3; pt.y = 4; pt.swap(2); System.out.println(pt.x + " " + pt.y); pt.swap2(3); System.out.println(pt.x + " " + pt.y); } } このプログラムでswapメソッドとswap2メソッドってどう違うんですか?

    • ベストアンサー
    • Java
  • C *での三角形描画

    課題で*を使って三角形を描画するプログラムを作るんですが、ネットで見たかぎり、 #include<stdio.h> int main() { int n, i, j, k, l; printf("段数を入力してください:"); scanf("%d", &n); for(i = 0; i < n; i ++) { for(j = 0; j < n; j ++) { for(k = 0; k < n*n-i*n-j-1; k ++) printf(" "); for(k = 0; k < i; k ++) { for(l = 0; l < j*2+1; l ++) printf("*"); for(; l < n*2; l ++) printf(" "); } for(k = 0; k < j*2+1; k ++) printf("*"); printf("\n"); } } return 0; } となっているのが、  段数を入力してください:2     *    ***   *   *  *** *** という風に表示されるので、これを  段数を入力してください:2     *    *** という形に表示させられるよう変更すべき箇所を教えてください。

  • 座標をランダムに表示させてx座標順にソートするプログラムを考えています

    座標をランダムに表示させてx座標順にソートするプログラムを考えています とりあえず、以下の様に決まった数の座標でソートすることはできたのですが、ランダムにするとなるとどうすればいいのかわかりません。 ------------------------------------------------- #include <stdio.h> int makepoints(int * pn, double * x, double * y){ double xp,yp; int k; int i,j; int n; n = 7; *pn = n; xp = 1; for(k=0;k<n;k++) { xp = xp/2; yp = xp*xp; x[k] = xp; y[k] = yp; } printf("初期座標列:\n"); for(k=0;k<n;k++) { printf("%f_%f\n",x[k],y[k]); } for(j=1;j<n;j++) { for(i=0;i<j;i++) { if(x[i]>x[j]){ xp=x[i];x[i]=x[j];x[j]=xp; yp=y[i];y[i]=y[j];y[j]=yp; } } } printf("整列後の座標列:\n"); for(k=0;k<n;k++) { printf("%d %f %f\n",k ,x[k],y[k]); } return 0; } ------------------------------------------------- なんとなくrand関数を使えばいいのかな、というのはわかるのですが、プログラミングに弱く困っています。 この後のプログラミング教えてくださる方いればよろしくお願いします。

  • C言語 格子点が多角形の中にあるかどうか?

    こんにちは. 私はプログラミングを勉強しはじめて3ヵ月くらいです. 今、与えられた多角形(例えば、(0,0),(3,7),(5,7),(8,3),(4,1),(1,0)の五点からなる多角形)の内部に格子点が存在するかどうかをチェックする(存在すれば1を返す等)ということをプログラミングを利用して,解決したいと思っています.最終的にはそれを利用して与えられた多角形をビットマップ表示にすることが目的です. 現在ある一つの自分の決めた点に関しては与えられた多角形を打ち込むことによって中か外かを判定する関数はできているのですが、100×100個の計10000個分の格子点に関してすべて中にあるか外にあるかを判定したいのですが、なかなか上手くいきません. 分かる方いらっしゃいましたら、アドバイスやプログラムの方よろしくお願いします. 今できているプログラムをのせておきます. #include <stdio.h> #include <stdlib.h> /* #define JUST_ON 2 */ #define JUST_ON 1 int insidePolygon(int x, int y, int pn, int *px, int *py); int insidePolygon(int x, int y, int pn, int *px, int *py) /* x and y are the vertex I want to know in polygon. pn is the number of vertex of polygon *px and *py are the vertex of polygon */ { int i, j; int inside; double yy; if (pn < 1) return 0; if (pn == 1) return x==px[0] && y==py[0]; /* Point (x,y) just lies on the edge or vertex of polygon */ for (i = 0, j = pn-1; i < pn; j = i++) { if (py[i] == py[j] && y == py[i] && ((px[i]<=x && x<=px[j]) || (px[j]<=x && x<=px[i]))) return JUST_ON; else if (py[i] != py[j] && ((py[i]<=y && y<=py[j]) || (py[j]<=y && y<=py[i])) && x == (double)(px[j]-px[i])*(y-py[i])/(py[j]-py[i])+px[i]) return JUST_ON; } /* Point (x,y) is inside/outside polygon */ inside = 0; yy = y + 0.5; /* shift y to avoid acrossing the poly's edges or vertices */ for (i = 0, j = pn-1; i < pn; j = i++) { if (((py[i]<=y && y<py[j]) || (py[j]<=y && y<py[i])) && x < (double)(px[j]-px[i])*(yy-py[i])/(py[j]-py[i])+px[i]) inside = !inside; } return inside; } int main() { int ii; int xx, yy; int pnpn; int pxpx[100], pypy[100]; int ret; printf("Enter (x,y) of a point -> "); scanf("%d %d", &xx, &yy); printf("Enter the number of vertics of the polygons -> "); scanf("%d", &pnpn); for (ii= 0; ii < pnpn; ii++) { printf("Enter %d-th vertics's (x, y) -> ", ii+1); scanf("%d %d", &pxpx[ii], &pypy[ii]); } ret = insidePolygon(xx, yy, pnpn, pxpx, pypy); if (ret == 0) printf("The point is outside the polygon.\n"); else printf("The point is inside the polygon\n"); }

  • c言語 成績表示のプログラムです。

    c言語初心者です。課題で出た問題で、生徒の人数、その後出席番号と点数を入れ、ソートしてから表示するプログラムなのですが、人数分打ち終わったあとにセグメンテーション違反になります。添削とともになぜそうなるのか教えてもらえると幸いです。 include <stdio.h> #define MAXDATA 10000 main() { int stnum[MAXDATA],point[MAXDATA],mem; int n,j,k,i,tmp,tmps; printf("生徒数を入力してください。"); scanf("%d",&mem); if(mem<=0){ do{ printf("もう一度生徒数を入力してください。"); scanf("%d", &mem); }while(mem<=0); } for(i=0;i<mem;i++){ printf("%d人目の生徒の点数を入力してください。\n",i+1); scanf("%d", &(point[i])); printf("%d人目の出席番号を数字で入力してください。\n",i+1); scanf("%d", &(stnum[i])); } for(i=0;i<mem-1;i++){ j=i; } for(k=i+1;k<mem;k++){ if(point[j]>point[k]){j=k;} } tmp=point[j]; point[j]=point[i]; point[i]=tmp; for(k=i+1;k<mem;k++){ if(stnum[j]>stnum[i]){j=k;} } tmps=stnum[j]; stnum[j]=stnum[i]; stnum[i]=tmps; for(i=0;i<mem;i++){ printf("%d番の点数は%d点です。", stnum[n],point[n]); } }