2016-09-14 4 views
1

Я пытался представить 2d-массив изображений в виде изометрической сетки в обработке, однако, похоже, я не могу правильно их разместить.Рисование 2d изометрической сетки изображения

Изображения не помещаются рядом друг с другом (как и в случае с плитами, не касаются), хотя точки x и y, по-видимому, указывают, что они должны быть (по мере того, как декартовы представления работают, и уравнения изометрического преобразования кажутся чтобы быть верным).

Вот что я имею в виду:

Isometric grid

Я думаю, что можно обрабатывать мои переводы и ротацию неправильно, но после нескольких часов прибегая к помощи я не могу найти, как.

Мой полный код для этой реализации можно увидеть here. Это полный код обработки и сложный, но более простую версию можно увидеть ниже.

color grass = color(20, 255, 20); //Grass tiles lay within wall tiles. These are usually images, but here they are colours for simplicity 
color wall = color(150, 150, 150); 

void setup() { 
size(600, 600); 
noLoop(); 
} 

void draw() { 
int rectWidth = 30; 
float scale = 2; //Used to grow the shapes larger 
float gap = rectWidth * scale; //The gap between each "tile", to allow tile s to fit next to each other 
int rows = 4, cols = 4; //How many rows and columns there are in the grid 

translate(300, 200); 

for (int row = 0; row < rows; row++) { 
    for (int col = 0; col < cols; col++) { 
    /* x and y calculations */ 
    float cartesianX = col * gap; //The standard cartesian x and y points. These place the tiles next to each other on the cartesian plane 
    float cartesianY = row * gap; 

    float isometricX = (cartesianX - cartesianY); //The isometric x and y points. The equations calculate it from the cartesian ones 
    float isometricY = (cartesianX + cartesianY)/2; 

    /* transformations and placement */ 
    pushMatrix(); //Pushes the transform and rotate matrix onto a stack, allowing it to be reset after each loop 

    translate(isometricX, isometricY); //Translate to the point that the tile needs to be placed. 
    scale(scale, scale/2); //Scale the tile, making it twice as wide as it is high 
    rotate(radians(45)); //Rotate the tile into place 

    //Work out what colour to set the box to 
    if (row == 0 || col == 0 || row == rows -1 || col == cols - 1) fill(wall); 
    else fill(grass); 

    rect(0, 0, rectWidth, rectWidth); 

    popMatrix(); 
    } 
} 
} 

ответ

0

Давайте посмотрим поближе на то, как вы используете два значения:

int rectWidth = 30; 

Это размер прямоугольников. Имеет смысл.

float gap = rectWidth * scale; 

Это расстояние между левыми сторонами прямоугольника. Другими словами, вы используете их для размещения прямоугольников. Когда это больше размера прямоугольников, у вас будет пространство между прямоугольниками. И так как вы умножаете rectWidth на scale (это 2), это будет больше, чем rectWidth.

Другими словами, если вы сделаете ваш gaprectWidth равно, вы не получаете никаких пробелов:

float gap = rectWidth; 

isometric grid without gaps

Конечно, это означает, что вы можете, вероятно, избавиться от вашей gap переменная целиком, но она может пригодиться, если вы хотите разместить прямоугольники, чтобы сделать их границы толще или что-то еще.

+0

Ваше исправление приносит плитки вместе, однако я замечаю, что они перекрываются сейчас, а не касаются друг друга. Я предполагаю, что для правильного изометрического представления они должны быть непосредственно рядом друг с другом, а не перекрываться. Вот пример того, что я имею в виду: [Изометрическое перекрытие] (http://i.imgur.com/ULA21Kx.png). Есть ли исправление для этого? Кроме того, есть ли способ сделать код, чтобы я мог изменить масштаб и объединить плитки, чтобы я мог поэкспериментировать с тем, как я хочу, чтобы он выглядел? Кроме того, я просто хочу поблагодарить вас за редактирование моего сообщения, это очень ценно :) –

+0

@AlexHockley Нет проблем. Если 'gap = rectWidth' слишком близко друг к другу, вы можете попробовать добавить буфер:' gap = rectWidth + 12', похоже, работает очень хорошо. Не знаю, откуда это магическое число, но я так и не видел изометрического вида. Не говоря, что вы делаете это неправильно! Что касается шкалы, я предполагаю, что вам нужно будет основывать свой магический номер на шкале. Может быть, '12 * scale' станет первой тупой попыткой попробовать.Я хотел бы помочь, если у вас есть больше вопросов, но может быть проще, если вы разместите их как новые вопросы, так как комментарии Stack Overflow (намеренно) ужасны. –

+0

Это исправление работает очень хорошо, даже если оно немного более ручное, чем я планировал. Большое вам спасибо, я последую вашим советам и задаю новый вопрос, если снова застрянет. –

Смежные вопросы