質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

0回答

371閲覧

グラフの凡例を表示させたいです

coco_

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2018/12/04 23:22

前提・実現したいこと

現在のソースコードを実行すると以下のように等高線が表示されます。これに凡例をつけて、等高線の目盛りの値を表示させたいです。
表示のさせ方として、等高線の値で一本基準となる線を用意して、この基準の線に等高線が描かれたら合わせて数値(だいたい-1~+1)を表示する という感じをイメージしているのですが、どうコードを書いていいのか分からないので、分かる方教えていただきたいです。お願いします。
なお、描画されている等高線は線ではなく点の集合体です。点が描画されている画像はマンセル色相画像でx軸010Y軸010の座標です。
イメージ説明

現在のソースコード

public partial class Form1 : Form { Dictionary<string, Dictionary<string, Dictionary<string, double>>> keisuu = null; public Form1() { InitializeComponent(); keisuu = new Dictionary<string, Dictionary<string, Dictionary<string, double>>>(); // xxxxx1 = 基本色、全色相、活気、評価値の平均 keisuu["xxx1"] = new Dictionary<string, Dictionary<string, double>>(); keisuu["xxx1"]["a0"] = new Dictionary<string, double>(); keisuu["xxx1"]["a0"]["B"] = -0.138; keisuu["xxx1"]["a0"]["G"] = -0.137; keisuu["xxx1"]["a0"]["P"] = -0.134; keisuu["xxx1"]["a0"]["R"] = -0.135; keisuu["xxx1"]["a0"]["Y"] = -0.137; . . keisuu["xxx1"]["a5"] = new Dictionary<string, double>(); keisuu["xxx1"]["a5"]["B"] = 0.013; keisuu["xxx1"]["a5"]["G"] = 0.008; keisuu["xxx1"]["a5"]["P"] = 0.017; keisuu["xxx1"]["a5"]["R"] = 0.007; keisuu["xxx1"]["a5"]["Y"] = 0.010; //xxx2 = 基本色、全色相、落ち着き、評価値の平均 以下同様 // xxx3 = 強調色、全色相、活気、評価値の平均  以下同様 // xxx4 = 強調色、全色相、落ち着き、評価値の平均 keisuu["xxx4"] = new Dictionary<string, Dictionary<string, double>>(); keisuu["xxx4"]["a0"] = new Dictionary<string, double>(); keisuu["xxx4"]["a0"]["B"] = 0.426; keisuu["xxx4"]["a0"]["G"] = 0.427; keisuu["xxx4"]["a0"]["P"] = 0.415; keisuu["xxx4"]["a0"]["R"] = 0.412; keisuu["xxx4"]["a0"]["Y"] = 0.417; . . keisuu["xxx4"]["a5"] = new Dictionary<string, double>(); keisuu["xxx4"]["a5"]["B"] = 0.001; keisuu["xxx4"]["a5"]["G"] = -0.017; keisuu["xxx4"]["a5"]["P"] = -0.004; keisuu["xxx4"]["a5"]["R"] = -0.004; keisuu["xxx4"]["a5"]["Y"] = -0.014; } string N; double s, W; private void trackBar1_Scroll(object sender, EventArgs e) { trackBar1.Minimum = 0; trackBar1.Maximum = 100; trackBar1.TickFrequency = 10; trackBar1.ValueChanged += new System.EventHandler(trackBar1_ValueChanged); this.Controls.Add(this.trackBar1); } private void trackBar1_ValueChanged(object sender, EventArgs e) { N = trackBar1.Value.ToString(); s = double.Parse(N);        W = s / 100; textBox3.Text = W.ToString(); }     private void button1_Click(object sender, EventArgs e) { // Retrieve the image. Bitmap image1 = new Bitmap(@"\blue.png"); //Bitmap image1 = new Bitmap(MAXLINE + 1, MAXLINE +1); int CELL_CNT_x = 100; // 座標1セル当たり100個必要 int CELL_CNT_y = 100; // 座標1セル当たり100個必要 int BASELINE_x = image1.Width / CELL_CNT_x + 1; int BASELINE_y = image1.Height / CELL_CNT_y; int x, y; string keisuuType1 = "xxx1"; string keisuuType2 = "xxx2"; string tarColor = "B"; string selectedkeisuutype = (comboBoxkeisuuType.SelectedItem.ToString()); string selectedtarColor = (comboBox1.SelectedItem.ToString()); if ("基本色" == selectedkeisuutype) { keisuuType1 = "xxx1"; keisuuType2 = "xxx2"; } else if ("強調色" == selectedkeisuutype) { keisuuType1 = "xxx3"; keisuuType2 = "xxx4"; } if ("青" == selectedtarColor) { tarColor = "B"; } else if ("緑" == selectedtarColor) { tarColor = "G"; } else if ("紫" == selectedtarColor) { tarColor = "P"; } else if ("赤" == selectedtarColor) { tarColor = "R"; } else if ("黄" == selectedtarColor) { tarColor = "Y"; } var graphics = Graphics.FromImage(image1); for (x = 0; x <= CELL_CNT_x; x++) { for (y = 0; y <= CELL_CNT_y; y++) { if (IsDraw(tarColor, keisuuType1, keisuuType2, x, y) == true) { int drawX = x * BASELINE_x; // 400 int drawY = ReviewGuiY(y * BASELINE_y, image1.Height - 1); //image1.SetPixel(drawX, drawY, Color.Red); graphics.FillEllipse(new SolidBrush(Color.Red), drawX, drawY, BASELINE_x, BASELINE_y); } } } pictureBox1.Image = image1; } /// <param name="y">数学的な位置として出力したいY座標</param> private int ReviewGuiY(int y, int maxY) { return maxY - y; } private bool IsDraw(string tarColor, string keisuuType1, string keisuuType2, float y, float x) { double m, n; m = double.Parse(textBox1.Text); x = x / 10; y = y / 10; double h = m; // 刻み値 double j = 0.7; // 余り範囲 // 予測値zを求める // 予測式:z=a0 +a1 x+a2 y+a3 x2+a3 xy+a4 y2+a5 // x :明度 y :彩度 a :係数 z :予測値 // 予測式は着色する部分{基本色、強調色}、色相{Blue、Green、Purple、Red、Yellow}、 // 観点を表す言葉{にぎやかで活気があること、静かで落ち着きがあること}、 // 値の種類{評価値の平均、評価値の標準偏差}ごとに作成する // Wは観点の重視度(Tracberツール) // double zは活気 z1は落ち着き double z = keisuu[keisuuType1]["a0"][tarColor] + (keisuu[keisuuType1]["a1"][tarColor] * x) + (keisuu[keisuuType1]["a2"][tarColor] * y) + (keisuu[keisuuType1]["a3"][tarColor] * x * x) + (keisuu[keisuuType1]["a4"][tarColor] * x * y) + (keisuu[keisuuType1]["a5"][tarColor] * y * y); double z1 = keisuu[keisuuType1]["a0"][tarColor] + (keisuu[keisuuType1]["a1"][tarColor] * x) + (keisuu[keisuuType1]["a2"][tarColor] * (y + 0.1)) + (keisuu[keisuuType1]["a3"][tarColor] * x * x) + (keisuu[keisuuType1]["a4"][tarColor] * x * (y + 0.1)) + (keisuu[keisuuType1]["a5"][tarColor] * (y + 0.1) * (y + 0.1)); double z2 = keisuu[keisuuType1]["a0"][tarColor] + (keisuu[keisuuType1]["a1"][tarColor] * (x + 0.1)) + (keisuu[keisuuType1]["a2"][tarColor] * y) + (keisuu[keisuuType1]["a3"][tarColor] * (x + 0.1) * (x + 0.1)) + (keisuu[keisuuType1]["a4"][tarColor] * (x + 0.1) * y) + (keisuu[keisuuType1]["a5"][tarColor] * y * y); System.Console.WriteLine(keisuu.ContainsKey(keisuuType1)); double z3 = keisuu[keisuuType2]["a0"][tarColor] ・・・ + (keisuu[keisuuType2]["a5"][tarColor] * y * y); double z4 = keisuu[keisuuType2]["a0"][tarColor] ・・・ + (keisuu[keisuuType2]["a5"][tarColor] * (y + 0.1) * (y + 0.1)); double z5 = keisuu[keisuuType2]["a0"][tarColor] ・・・ + (keisuu[keisuuType2]["a5"][tarColor] * y * y); //W = trackbarで選択した値 // 総評価値 = W * z + (1 - W) * z1 double z6 = W * z3 + (1 - W) * z; double z7 = W * z4 + (1 - W) * z1; // y+0.1 double z8 = W * z5 + (1 - W) * z2; // x+0.1 double aAbs = (z6 % h); double bAbs = (z7 % h); double cAbs = (z8 % h); double dAbs = System.Math.Abs(aAbs - bAbs); double iAbs = System.Math.Abs(aAbs - cAbs); if (z6 >= 0 && z6 <= 0.01) { double z9 = z6 - z7; int jSign = System.Math.Sign(z9); int iSign = System.Math.Sign(z6); // Math.Abs(iSign) == Math.Abs(jSign) && iSign != jSign //iSign != jSign if (iSign == jSign && z != z9 || iSign != jSign) { return true; // 計算結果の結果、描画条件を満たした。 } else { return false; } } if (dAbs >= h*j || iAbs >= h*j ) { return true; } else { return false; } } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問