Каковы функции индикатора и ограничения для сложных задач рисования сетки? - PullRequest
2 голосов
/ 09 августа 2009

Если вы смотрите на массив пикселей, или в 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-измерениях, но я не хочу писать хитрую одноразовую реализацию, которая работает только для тех , использующих линейную алгебру вместо правильной логической функции индикатораи хотел бы знать, как правильно решить эти проблемы.

...