rrowcol.c
来自「支持各种栅格图像和矢量图像读取的库」· C语言 代码 · 共 143 行
C
143 行
/* * rrowcol.c */#include "csf.h"#include "csfimpl.h"#include <math.h> /* floor *//* compute (fractional) row, column index from true world co-ordinate. * RasterCoords2RowCol computes row, column index from true world co-ordinate. * The row and column co-ordinate are returned as fractions (See parameters * section). * The x,y co-ordinate * don't have to be on the map. They are just relative to upper left position. * * returns * 0 if the co-ordinate is outside the map, * 1 if inside, * -1 in case of an error * * Merrno * ILL_CELLSIZE */void RasterCoords2RowCol( const CSF_RASTER_LOCATION_ATTRIBUTES *m, double x, /* x of true co-ordinate */ double y, /* y of true co-ordinate */ double *row, /* write-only. Row index (y-pos). floor(row) is row number, * if (row >= 0) then fmod(row, 1) is in-pixel displacement from pixel-top, * if (row <0) then fmod(row, 1) is in-pixel displacement from pixel-bottom. */ double *col) /* write-only. Column index (x-pos). floor(col) is column number, * if (col >= 0) then fmod(col, 1) is in-pixel displacement from pixel-left, * if (col <0) then fmod(col, 1) is in-pixel displacement from pixel-right. */{ double cs = m->cellSize; double xCol = (x - m->xUL) / cs; double yRow = (((m->projection == PT_YINCT2B) ? (y - m->yUL) : (m->yUL - y)) / cs); /* rotate clockwise: */ double c = m->angleCos; /* cos(t) == cos(-t) */ double s = -(m->angleSin); /* -sin(t) == sin(-t) */ *col = xCol * c - yRow * s; *row = xCol * s + yRow * c;}int RasterCoords2RowColChecked( const CSF_RASTER_LOCATION_ATTRIBUTES *m, double x, /* x of true co-ordinate */ double y, /* y of true co-ordinate */ double *row, double *col) { double row_,col_; /* use copies, func( , , ,&dummy, &dummy) will fail */ RasterCoords2RowCol(m,x,y,&row_,&col_); *row = row_; *col = col_; return( row_ >= 0 && col_ >= 0 && (m->nrRows > row_) && (m->nrCols > col_) );}/* compute (fractional) row, column index from true world co-ordinate. * Rcoord2RowCol computes row, column index from true world co-ordinate. * The row and column co-ordinate are returned as fractions (See parameters * section). * The x,y co-ordinate * don't have to be on the map. They are just relative to upper left position. * * returns * 0 if the co-ordinate is outside the map, * 1 if inside, * -1 in case of an error * * Merrno * ILL_CELLSIZE */int Rcoords2RowCol( const MAP *m, /* map handle */ double x, /* x of true co-ordinate */ double y, /* y of true co-ordinate */ double *row, /* write-only. Row index (y-pos). floor(row) is row number, * if (row >= 0) then fmod(row, 1) is in-pixel displacement from pixel-top, * if (row <0) then fmod(row, 1) is in-pixel displacement from pixel-bottom. */ double *col) /* write-only. Column index (x-pos). floor(col) is column number, * if (col >= 0) then fmod(col, 1) is in-pixel displacement from pixel-left, * if (col <0) then fmod(col, 1) is in-pixel displacement from pixel-right. */{ double row_,col_; /* use copies, func( , , ,&dummy, &dummy) will fail * otherwise */ if (m->raster.cellSize <= 0 || (m->raster.cellSize != m->raster.cellSizeDupl ) ) { /* CW we should put this in Mopen */ M_ERROR(ILL_CELLSIZE); goto error; } RasterCoords2RowCol(&(m->raster),x,y,&row_,&col_); *row = row_; *col = col_; return( row_ >= 0 && col_ >= 0 && (m->raster.nrRows > row_) && (m->raster.nrCols > col_) );error: return(-1);}/* compute row, column number of true world co-ordinate * RgetRowCol computes row, column number of true world co-ordinate. * * returns * 0 if the co-ordinate is outside the map, * 1 if inside, * -1 in case of an error * * Merrno * ILL_CELLSIZE */int RgetRowCol( const MAP *m, /* map handle */ double x, /* x of true co-ordinate */ double y, /* y of true co-ordinate */ size_t *row, /* write-only. Row number (y-pos). * Undefined if (x,y) is outside of map */ size_t *col) /* write-only. Column number (x-pos). * Undefined if (x,y) is outside of map */{ double row_d,col_d; int result; result = Rcoords2RowCol(m,x,y,&row_d,&col_d); if (result > 0) { *row = (size_t)floor(row_d); *col = (size_t)floor(col_d); } return(result);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?