// ■陰線消去 // @Form1_LoadをForm1のLoadイベントとして指定してください。 // Ausing System.Drawing.Drawing2D; を追加してください。 // B高さ[numX,numY]の値を変更してみましょう。 // using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D; //これをusingとして追加する namespace hidenLine { public partial class Form1 : Form { public double Hidden_dlx; // 表示刻み幅(dl) public double Hidden_alpha; // x軸と水平軸との角度(α) public double Hidden_beta; // y軸と水平軸との角度(β)  public double Hidden_dx; // x軸方向の単位メッシュの長さ(dx) public double Hidden_dy; // y軸方向の単位メッシュの長さ(dy) public double[,] 高さ = new double[51, 51]; // 高さ(z値) public double[] YMax = new double[2000]; // 各X座標に対するY座標値の最大値(上の浮動水平線) public double[] YMin = new double[2000]; // 各X座標に対するY座標値の最小値(下の浮動水平線) public double Hidden_Xlen; // 表示上のX方向長さ=(numX-1)*dx*cos(α) public double Hidden_Ylen; // 表示上のX方向長さ=(numY-1)*dx*cos(β) public int Hidden_NR; // 浮動水平線用配列の長さ public double beforX; // 現在ペン位置X public double beforY; // 現在ペン位置Y public int numX = 51; // x方向メッシュ数 public int numY = 51; // y方向メッシュ数 public double Hidden_dxCosA; // dx*cos(α) public double Hidden_dyCosB; // dy*cos(β) public double Hidden_dxSinA; // dx*sin(α) public double Hidden_dySinB; // dy*sin(β) public double Hidden_dlxTanA; // dl*tan(α) public double Hidden_dlxTanB; // dl*tan(β) public Matrix matrix = new Matrix(); // グローバル座標系への変換マトリックス public Form1() { InitializeComponent(); } public bool Hidden_Draw(PaintEventArgs e, Pen pen, double px, double py, int p, bool Visible, bool Update) { // 陰線かどうかを判断し,陰線でない場合,線を描く。 // // 関数値 : 表示後の可視フラグ // e : 描画用引数 // pen : ペン属性 // px : 補間されたX座標値(平面座標系) // py : 補間されたY座標値(平面座標系) // p : 比較する浮動水平線の位置 // Visible : 現ペン位置が見えているかどうかを示すフラグ(可視フラグ) // Update : 陰線でないとき,浮動水平線を更新するかどうかを示すフラグ // if ((py >= YMax[p]) || (py <= YMin[p])) { if (Update && py >= YMax[p]) YMax[p] = py; if (Update && py <= YMin[p]) YMin[p] = py; if (Visible) { float fx1 = (float)beforX; float fy1 = (float)beforY; float fx2 = (float)px; float fy2 = (float)py; e.Graphics.DrawLine(pen, fx1, fy1, fx2, fy2); } beforX = px; beforY = py; return true; } else { beforX = px; beforY = py; return false; } } protected override void OnPaint(PaintEventArgs e) { bool 可視フラグ; base.OnPaint(e); e.Graphics.Clear(Color.White); Pen pen = new Pen(Color.Black, 0.02F); e.Graphics.Transform = matrix; for (int j = 0; j < Hidden_NR; j++) { YMax[j] = -1E20; YMin[j] = 1E20; } // 浮動水平線の初期化 double X0 = 80; // 表示始点位置  double Y0 = 100; for (int k = 0; k < numY; k++) { 可視フラグ = false; for (int j = 0; j < numX - 1; j++) { // X軸方向描画 int p1 = (int)((0.5 + (Hidden_Ylen + Hidden_GroundX(j, k)) / Hidden_dlx)); int p2 = (int)((0.5 + (Hidden_Ylen + Hidden_GroundX(j + 1, k)) / Hidden_dlx)); for (int p = p1; p <= p2; p++) { // 補間 double PH = (double)(p - p1); double fp = 高さ[j, k] + (高さ[j + 1, k] - 高さ[j, k]) * PH * Hidden_dlx / Hidden_dxCosA; double px = PH * Hidden_dlx + Hidden_GroundX(j, k) + X0; double py = PH * Hidden_dlxTanA + Hidden_GroundY(j, k) + fp + Y0; if ((j < numX - 2 && p < p2) || (j == numX - 2)) 可視フラグ = Hidden_Draw(e, pen, px, py, p, 可視フラグ, true); } } for (int j = 0; j < numX && k < numY - 1; j++) { // Y軸方向描画 可視フラグ = false; int p1 = (int)((0.5 + (Hidden_Ylen + Hidden_GroundX(j, k)) / Hidden_dlx)); int p2 = (int)((0.5 + (Hidden_Ylen + Hidden_GroundX(j, k + 1)) / Hidden_dlx)); for (int p = p1; p >= p2; p--) { // 補間 double PH = (double)(p - p1); double fp = 高さ[j, k] - (高さ[j, k + 1] - 高さ[j, k]) * PH * Hidden_dlx / Hidden_dyCosB; double px = PH * Hidden_dlx + Hidden_GroundX(j, k) + X0; double py = -PH * Hidden_dlxTanB + Hidden_GroundY(j, k) + fp + Y0; 可視フラグ = Hidden_Draw(e, pen, px, py, p, 可視フラグ, p != p2); } } } } private double Hidden_GroundX(int j, int k) { return (double)j * Hidden_dxCosA - (double)k * Hidden_dyCosB; } private double Hidden_GroundY(int j, int k) { return (double)j * Hidden_dxSinA + (double)k * Hidden_dySinB; } private void window(double X1, double Y1, double X2, double Y2) { float W = this.ClientSize.Width; float H = this.ClientSize.Height; float SX = W / ((float)(X2 - X1)); float SY = H / ((float)(Y2 - Y1)); matrix.Scale(SX, SY); matrix.Translate(-(float)X1, -(float)Y1); } private void Form1_Load(object sender, EventArgs e) { // 高さデータの設定(ここで高さ[numX,numY]に高さデータを設定する) double DNX2= ((double)numX)/2; double DNY2= ((double)numY)/2; double X,Y,R,fxy; for(int j=0; j