如何在MATLAB中定义圆形边界

时间:2014-12-17 02:45:54

标签: matlab

我正在使用MATLAB代码,我想定义边界条件 我有存储在第3列的闪电纬度数据和存储在第4列的经度数据 此外,我有一个热带气旋眼睛坐标 现在我有3个区域需要分开,即:

  1. eyewall(0 - 60 km)
  2. 内部雨带(60-180公里)和
  3. 外雨带(180 - 500 km)。从旋风的眼睛。
  4. 我已经用度数纬度转换了距离,以便更容易处理 我想做的是在眼睛处于给定纬度和经度的瞬间,在旋风器的这3个区域中分别计算闪电发生次数。时间存储在第2栏中 我试图使用数学等效的圆形中心(a,b),对应旋风中心,r与中心距离:
    (xa) 2 +(yb) 2 = r 2 ,x代表经度列4,y代表纬度列3。登记/> 我已经为特定情况提出了以下代码,但它似乎无法工作或编译:

    M = A20121228;
    lat = -10.6;
    lon = 161.5;
    hr = 0;
    
    if  ((M(:, 4) - lon)^2 + (M(:, 3) - lat)^2) <= 0.541^2
    row_idx1 = (hr == M(:, 2) & lat == M(:, 3) & lon == M(:, 4));
    filtered_M1 = M(row_idx1, :);
    eyewall = filtered_M1;
    end      
    
    if  ((M(:, 4) - lon)^2 + (M(:, 3) - lat)^2) > 0.541^2 && ((M(:, 4) - lon)^2 + (M(:, 3) - lat)^2) <= 1.622^2
    row_idx2 = (hr == M(:, 2) & lat == M(:, 3) & lon == M(:, 4));
    filtered_M2 = M(row_idx2, :);
    inner = filtered_M2;
    end
    
    if  ((M(:, 4) - lon)^2 + (M(:, 3) - lat)^2) > 1.622^2 && ((M(:, 4) - lon)^2 + (M(:, 3) - lat)^2) <= 4.505^2
    row_idx3 = (hr == M(:, 2) & lat == M(:, 3) & lon == M(:, 4));
    filtered_M3 = M(row_idx3, :);
    outer = filtered_M3;
    end
    

1 个答案:

答案 0 :(得分:1)

你应该用'公里'来形成你的大地测量数据,而不是用度数来转换范围(0,60,180,500),因为在你的情况下,在'公里'单位上工作会更方便。您可以使用geodetic2ned()函数将大地测量数据转换为本地笛卡尔NED(Nort - East - Down - &gt;它们是Navigation Frame的轴)。在使用geodetic2ned()时,如果您输入lat = -10.6lon = 161.5(我将其命名为lat0lon0)作为参考参考,那么它们将成为导航框架。因此,NE(是geodetic2ned()函数的输出,请检查下面的代码)将与latlon一起评估(在其他情况下)单词lat0lon0)。通过这种方式,您可以直接写sqrt( N.^2 + E.^2 )而不是sqrt( M(:, 4) - lon)^2 + (M(:, 3) - lat)^2 )(顺便说一下,您应该使用Element-Wise Power

现在检查以下代码:

SPHEROID   = referenceEllipsoid('wgs84', 'km');  % // SPHEROID Reference
hr         = 0; 
lat0       = -10.6;
lon0       = 161.5;
[N, E, D]  = geodetic2ned(M(:, 3), M(:, 4), -M(:, 2), lat0, lon0, hr, SPHEROID);
range      = sqrt( N.^2 + E.^2 ); 
indEyewall = find( hr == D & range >= 0 & range < 60);
indInner   = find( hr == D & range >= 60 & range < 180);
indOuter   = find( hr == D & range >= 180 & range < 500);
eyewall    = M(indEyewall, :);
inner      = M(indInner, :);
outer      = M(indOuter, :);

关键是,我将hr == D部分包含在find()函数中,因为您在代码中写了它,但我不确定是否包含它。您可能会从find()函数中获得逻辑错误,因此,如果我是您,我会确保包含它。

我希望这会有用。祝你好运..