Newer
Older
using System;
using System.Collections.Generic;
namespace WindStressPRM
{
/// <summary>
/// Generic Matrix of type T
/// </summary>
/// <typeparam name="T"></typeparam>
public class Matrix<T>
{
/// <summary>
/// origin coordinates of matrix. This must be top left corner
/// </summary>
public Coordinate Origin { get; set; }
/// <summary>
/// get coordinate of cell at index
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public Coordinate CellToProjection(Index index) {
return new Coordinate(Origin.X + index.Row*Size.Width, Origin.Y - index.Col*Size.Height);
}
/// get index of cell for coordinate
/// </summary>
/// <param name="coordinate"></param>
/// <returns></returns>
public Index ProjectionToCell(Coordinate coordinate)
{
double rwDiff = (coordinate.X - Origin.X) / Size.Width;
double colDiff = (coordinate.Y - Origin.Y) / -Size.Height;
int iRow = (int)Math.Round(rwDiff);
int iCol = (int)Math.Round(colDiff);
if (iRow < 0 || iCol < 0 || iRow >= RowsCount() || iCol >= ColumnCount())
{
throw new Exception("projectionToCell method trying to find uncorrect index");
}
return new Index(iRow, iCol);
}
/// <summary>
/// Size of cell. In meters
/// </summary>
public CellSize Size { get; set; }
/// <summary>
/// Cells Container
/// </summary>
public T[,] Cells { get; set; }
/// <summary>
/// Number of rows in matrix
/// </summary>
/// <returns></returns>
public int RowsCount()
{
return Cells.Rank > 0 ? Cells.GetLength(0) : 0;
}
/// <summary>
/// Number of columns
/// </summary>
/// <returns></returns>
public int ColumnCount()
{
return Cells.Rank > 1 ? Cells.GetLength(1) : 0;
}
}
}