- PR -

2次元配列をプロパティに使用したい

投稿者投稿内容
お だ
会議室デビュー日: 2008/04/02
投稿数: 14
投稿日時: 2009-04-08 15:20
引用:

KT工房さんの書き込み (2009-04-08 13:29) より:

>お ださん
指摘の「DesignerSerializationVisibilityAttribute」試してみましたが、
結果は残念ながら同じでした。



的を外した答えですいませんでした。

参考迄に VS2008 C# ですが、下記のコードではおっしゃられているエラーが発生しましたが、
System.ComponentModel.DesignerSerializationVisibility 属性指定箇所のコメントアウトを外すとエラーが出ませんでした。

コード:
public partial class CustomControl1 : Panel
{
  public CustomControl1()
  {
    InitializeComponent();
    // 初期値を設定していないとそもそもエラーにならない
    test = new int[,] { {1,2}, {2, 3} };
  }

  private int[,] test;

  // コメントアウトを外すとエラーが出ない!
  //[System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
  public int[,] Test
  {
    set { this.test = value; }
    get { return this.test; }
  }
}

KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2009-04-08 15:44
>お ださん
「DesignerSerializationVisibility.Hidden」でエラーは出なくなりました。
コード ジェネレータがオブジェクトのコードを生成しないと言うのは、
まさしく私の求めていた方法です。

先ほど私が試してダメだったのは、シリアル化して保存しようとしていたためです。

じゃんぬねっとさん、お ださん、アドバイスありがとうございます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-04-09 22:19
引用:

KT工房さんの書き込み (2009-04-08 13:29) より:
等高線を描くようなコントロールを作ろうとしていまして・・・。
そのため、ListやCollectionだと使い勝手が良くないのです(泣)


引用:

KT工房さんの書き込み (2009-04-08 15:06) より:
単純に点ではなく、X,Yの位置にある値を確保したいということになります。
なおかつ複数点の値を同時に取得したいので、
Listだと該当のポジションを探さなくてはならなくなり面倒だと思いまして。
当初の設計では
・Xの値
・Yの値
・該当座標の値
の構造で持っていたのですが、どうにも使い勝手が良くなくて2次元配列にしました。
(X,Y)から値を取得できるメソッドを持たせればいいんですけど、
毎回ループするのもよろしくないのかと。


ん。。。ごめんなさい、両方の投稿をあわせてみても、はやり、なぜ2次元配列なのか、解らないです。

 今必要なのは、「高度というキーから、座標という複数の値が取り出せること」ではないでしょうか?つまり、座標に対する高度ではなく、高度に対する座標群が、求められなければならないのではないでしょうか。もちろん座標から高度を求めることが必要なときもありますが、その時は、その座標に近い複数の観測されている座標の高度から、計算によって高度を求めることになるのではないでしょうか。
 KT工房さんの考えでいくと、1km×1km の地域を、1m 単位で値を持とうとすると、1000×1000個の容器が必要になります。はたして、等高線を引くのに、それだけの容器が必要でしょうか?そして、その配列から等高線を引くためにある値を持った“一連の座標値”を求めるのは、まず不可能です。

 なぜ不可能なのか。凸型の土地なら、辺が交差しないようにソートすることで線を描くことができます。では、凸凸、つまりこぶがふたつあったらどうしましょう?同じ高さの地域がふたつあるわけです。このふたつの地域が切れていることを、座標値という情報だけから、どうやって導き出すのでしょう?あるいは、こう言うこともできるでしょう。KT工房さんがなさろうとしているのは、ビットマップを作る方法です。でも本当に必要なのは、ベクトル図を作る方法ではないでしょうか。

 ということを考えると、ここで必要な情報は、標高と、座標のリストではないでしょうか。
[code]
class PositionList {
PositionList NextPosition;
double X;
double Y;
}

class ContourLine {
double Altitude;
PositionList Positions;
// Position[] Positions;
// List<Position> Positions;
}

ContourLine の1次元配列をプロパティに

または
Dictionary<double, List<Position>> contourLine;
[code]
KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2009-04-10 18:18
>Jittaさん
確かにJittaさんのおっしゃられている通り、
等高線を引くのであれば値から座標位置を求めなければダメです。
ですが、ある点から全方位(360度)のどの方向へ線を引くかを求める方法が
私には難しくてできませんでした。

仕様的には分布図?のようなものが見えればOKとのことでしたので、
簡潔にするため網目を細かく切って、間の値を線形補完で埋めてビットマップの原理で表現することにしました。

私の技術ではここまでが限界でした・・・(泣)
もしできるならば教えて欲しいぐらいです、すみません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-04-15 22:04
済みません、返答したつもりでいました。

引用:

KT工房さんの書き込み (2009-04-10 18:18) より:
ですが、ある点から全方位(360度)のどの方向へ線を引くかを求める方法が
私には難しくてできませんでした。


 教えられることは、お教えしますよ。でも、この文は、ちょっと意味がわかりません。
 「どの方向へ線を引く」とは、どういうことをイメージされているのでしょう?「何処と何処が同じ高さ」ということは、わかっていますよね。それはつまり、「何処と何処を線で結べ」であって、「どの方向へ線を引く」ではないと思います。

 例えば、標高100メートルの座標として、次の座標列が与えられたとします。
(100, 200)
(150, 220)
(160, 240)
(140, 240)
(120, 220)

これは、線が重ならないように並んでいます。この場合、上から1番目と2番目、2番目と3番目、・・・5番目と1番目を結べば、5角形になります。滑らかにするには、補間方法はいろいろあるのですが、単純には用意されている補間曲線を描くメソッドを使えばいいです(方法 : フォームに曲線を描画する<microsoft.com>にある、最後の Bezier spline か、canonical spline を使う)。

 与えられた座標列が、重ならないように並んでいるかどうかわからないときは、重ならないように並べます。順番に並んでいると仮定し、1点目から2点目を固定、線1-2と線1-3の間の角、線1-2と線1-4の間の角・・・を求め、それぞれ大きくなっていけば、重ならないように並んでいるのではないでしょうか(図を描いてみるとわかると思います)。角度が180度を超えたら、固定していると決めた点が間違っていることになります。角度の求め方は、ここに書いてある式<casio.jp>が、分かり易いと思います。

 私が最初に配属された部署での上司は、私によく「漫画を描け」と言いました。これは、「頭だけでなく、手も使って考えろ」ということです。手を動かすことで頭を刺激しますから、画面を眺めているだけでなく、図を描いてみることを勧めます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-04-16 07:45

ダメだ
凹型の場合を考慮してない

スキルアップ/キャリアアップ(JOB@IT)