はじめに:平面上の点 (x, y) のセットと関数 F(x, y) を double で返します。ポイントは、ユーザー定義の長方形でランダムに生成されます (変数に対する制約を意味します)。生成された点の数を N としましょう。このセットは三角形分割 (ドロネー三角形分割) されています。この三角形分割が関数 F(x, y) の曲面の近似を設定すると想像してください。エッジの値は直線的に変化します (つまり、ポイント (x, y, z = F(x, y)) 間の範囲にすぎません)。頂点は補間の頂点です。したがって、補間平面として三角形自体があります。
標準に三角形分割を描きます。 PictureBox
. エッジは を使用して描画されますLinearGradientBrush
- 色は値 F(x, y) のレベルを反映します (茶色 - 最大値、水色 - 最小値、緑 - 中間)。N >= M を設定するまではすべて機能します。ここで、M は時々 ~30k から 50k まで変化します。これらの場合、メモリ不足の例外が発生します。また、タスク マネージャーで動作メモリの不足は見られませんが、ビデオ メモリを指していると思いますね。
色のグラデーションを使用せずに N = 100k で三角形分割を描画できるため (単純な単色の単色エッジのみ)、問題はLinearGradientBrush
GDI オブジェクトの使用または作成、Pen
およびLinearGradientBrush
すべての反復にあると思います。
いくつかのコード:
private void pboxTriangulation_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
if (null != dt)
PaintWithGradient(e.Graphics);
}
private void PaintWithGradient(Graphics g)
{
//here I erased code block
//where I find min, max and middle values of F(x, y) on a set
foreach (Triangle t in dt.triangles)
{
System.Drawing.PointF[] ps = new System.Drawing.PointF[3];
Color[] colors = new Color[3];
for (int i = 0; i < 3; i++)
{
//here for every i-th point I find its display coordinates - ps[i]
//and color of vertex - colors[i]
}
for (int i = 0; i < 3; i++)
{
using (LinearGradientBrush b = new LinearGradientBrush(ps[i], ps[(i + 1) % 3], colors[i], colors[(i + 1) % 3]))
{
using (Pen pen = new Pen(b))
{
g.DrawLine(pen, ps[i], ps[(i + 1) % 3]);
}
}
}
}
}
例: n = 10k , n = 100k (x86 としてビルド) , n = 200k (x86 としてビルド)
質問:問題は何ですか?どうすれば解決できますか?
解決策として別の描画ツール (OpenGL やその他の強力なツールなど) を提案しないでください。ただし、質問への解説として書きたいだけの場合は、覚えておきます。将来役立つかもしれません。この質問は、広い意味でグラデーション エッジを使用して三角形分割を描画する方法に関するものではなく、私の場合の例外のルートは何ですか。
UPD : プログラムは x64 でビルドされました。x86 では 200k を描画し (より高い N は試していません)、問題ないようです。しばらくして 300k が減少し、約 1.8 GB が割り当てられました。