Если вы смотрите на массив пикселей, или в 0,1,2,3, или даже в N измерениях, легко определить, попадает ли определенный пиксель в квадратную или прямоугольную сеткулинии внутри него с помощью функции индикатора, например, так (я буду использовать императивный псевдокод, чтобы прояснить то, о чем я говорю, но меня действительно интересуют только ограничения и условия в функциях индикатора для более общих типов сеток):
/* define the array of pixels in however many dimensions you want */
//define the dimensions of the array
int x-dimension-length = <some positive integer>;
int y-dimension-length = <some positive integer>;
int z-dimension-length = <some positive integer>;
[...] //you could keep gong for even higher dimensions
/* define CONSTRAINTS (for the square or rectangular case) */
//define the height and width of the grid boxes within the grid (contstraints on a square/rectangular grid)
int horizontalSpacingBetweenGridlines = <non-negative integer>;
int verticalSpacingBetweenGridlines = <non-negative integer>;
/* end definition of CONSTRAINTS */
/* define the arrays to draw the grids on */
// -- assumes that the arrays here are intialised to contain all zeros:
//0-dimensional (degenerate) example:
int point = 0;
//1d example:
int [] OneDimensionalArray = int[x-dimension-length];
//(2d example)
int [] TwoDimensionalArray = int[x-dimension-length][y-dimension-length];
//(3d example)
int [] ThreeDimensionalArray = int[x-dimension-length][y-dimension-length][z-dimension-length];
/* Indicator functions */
/* zero-dimensional (degenerate) case */
//if a point falls on a gridline, degenerate example
boolean doesAPointFallOnAGridLine0D() {
if (point % horizontalSpacingBetweenGridlines == 0) {
return true;
}
/* one-dimensional case */
//decide if a point in the 1D array at index <x-coordinateFrom1DArray> falls on a gridline
boolean doesAPointFallOnAGridLine1D(int x-coordinateFrom1DArray) {
if (x-coordinate % horizontalSpacingBetweenGridlines == 0) {
return true;
}
}
/* two-dimensional case */
//decide if a point in the 2D array at index <x-coordinateFrom2DArray>,<y-coordinateFrom2DArray> falls on a gridline
boolean doesAPointFallOnAGridLine2D(int x-coordinateFrom2DArray, int y-coordinateFrom2DArray) {
if((x-coordinateFrom2DArray % horizontalSpacingBetweenGridlines == 0) && (y-coordinateFrom2DArray % verticalSpacingBetweenGridlines == 0)) {
return true;
}
}
/* [and so on for higher-and-higher-dimensional spaces...] */
Мой вопрос в общем как выглядят функция индикатора и ограничения для различных типов неквадратных и непрямоугольных сеток (например, треугольная, гексагональной, восьмиугольной и т. д.) и существует ли каноническая справочная работа , в которой говорится о построении такого рода индикаторной функции и об ограничениях, которые требуются для различных форм сетки?
Кнут кажется на этом.
Это очень общая математическая проблема, поэтому она, вероятно, имеет имя / каноническое решение.
КакКроме того, меня больше всего интересуют гексагональные сетки в n-измерениях, но я не хочу писать хитрую одноразовую реализацию, которая работает только для тех , использующих линейную алгебру вместо правильной логической функции индикатораи хотел бы знать, как правильно решить эти проблемы.