www.pudn.com > BackscatterMap.rar > shadowing.cs, change:2009-07-07,size:5530b

```using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text;
using System.Data.SqlTypes;
using System.IO;
namespace WindowsApplication4
{

{
static public double[,] elevation;
static public int number;
static public int radarX = 1000;               //预设雷达的位置坐标，对规则格网取样间隔归一化
static public int radarZ = 1000;
static public double unit = 30;                //规则格网的取样间隔
static public double interval = 30;            //极坐标取样间隔为30m
static public double maxR = 20000;             //最大作用距离为20Km
static public int colNum = 360;       //以k*unit为半径（k=1、2.....）作一系列同心圆，同心圆的个数为colNum
static public int rowNum = colNum;
static public double theta = 2 * Math.PI / rowNum;     //theta为分割同心圆的角度
{
number = elevation.GetLength(0);
}

//-----------------------------------------------
//建立以雷达位置为中心的极坐标辅助网格
public struct dPoint
{
public double x;
public double z;
}

public dPoint[,] point = new dPoint[rowNum, colNum];      //二维数组，用此数组对象获得每个扇区中心点的X,Z轴坐标值
public double[,] polaCoord()
{

for (int i = 0; i < rowNum; i++)
{
double temp1 = interval * Math.Cos((i + 0.5) * theta);
double temp2 = interval * Math.Sin((i + 0.5) * theta);
double temp3 = interval * 0.5 * Math.Cos((i + 0.5) * theta) + radarX * unit;
double temp4 = interval * 0.5 * Math.Sin((i + 0.5) * theta) + radarZ * unit;
for (int j = 0; j < colNum; j++)
{
point[i, j].x = temp3;
point[i, j].z = temp4;
temp3 = temp3 + temp1;
temp4 = temp4 + temp2;

}
}

double[,] node = new double[rowNum, colNum];

for (int i = 0; i < rowNum; i++)                       //通过插值获得各扇区中心点的高程值
{
for (int j = 0; j < colNum; j++)
{
node[i, j] = myshadowing.interpolate(point[i, j].x, point[i, j].z);
}
}
return node;
}

//-----------此方法用来作插值，从而获得（x，z）坐标的高程值--------------------
public double interpolate(double x, double z)
{
int i = (int)(x / unit);
int j = (int)(z / unit);
double unitX = (x - i * unit) / unit;
double unitZ = (z - j * unit) / unit;
double ele = elevation[i, j] + (elevation[i + 1, j] - elevation[i, j]) * unitX + (elevation[i, j + 1] - elevation[i, j]) * unitZ + (elevation[i, j] - elevation[i, j + 1] + elevation[i + 1, j + 1] - elevation[i + 1, j]) * unitX * unitZ;
return ele;
}

//-------------此方法用来判断扇区的遮蔽情况,如被遮蔽返回True，未被遮蔽返回False---------------
{
bool[,] sign = new bool[rowNum, colNum];

double[] temp = new double[colNum];
bool[] tempSign = new bool[colNum];
for (int i = 0; i < rowNum; i++)
{

for (int j = 0; j < colNum; j++)
{
temp[j] = centerPoint[i, j];
}

for (int k = 0; k < colNum; k++)
{
sign[i, k] = tempSign[k];

}
}
return sign;
}

//--------用增量法判断一个方向的遮蔽情况，返回一个特定方向各个扇区是否被遮蔽，遮蔽返回Ture，否则返回False

public bool[] juge(double[] temp)
{
bool[] sign1 = new bool[colNum];
for (int i = 0; i < colNum; i++)
{
sign1[i] = false;
}
/////////////////////////
int j = 1;
double hv;
double hc;
double temp1;
while (j < colNum)
{
do
{
hv = temp[j - 1];
hc = temp[j];
temp1 = j * (hc - hv) - (hv - radarHeight);  //计算天线到第j个点的向量和天线到最后一个可视点的向量的叉乘
j++;
} while (j < colNum && temp1 > 0);
j = j - 1;
double slope = (hv - radarHeight) / j;

int k = 1;
while ((j < colNum) && (temp[j] < hv + k * slope))
{
sign1[j] = true;
k++;
j++;
}
j++;

}
return sign1;
}
}
}
```