Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2013, 17:43   #1
Grand_Daddy
Пользователь
 
Регистрация: 01.05.2012
Сообщений: 14
По умолчанию "diamond square" алгоритм (Cи)

Здравствуйте, уважаемые программисты. Помогите, пожалуйста, с алгоритмом "diamond square". Реализовать то реализовал, а вот досадный баг найти не могу. Все дело в том, что в углах двумерной сетки значения сильно отличаются от остальных. Почему так происходит я так и не понял, хотя ломал голову сегодня почти 4 часа.
Скидываю код и 2 скриншота: первый -числовое отображение сетки, второй - визуальное отображение.
<spoiler></spoiler>
Код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <conio.h>

const int DIFFUSE=10;
const int HEIGHTMAP_SIZE=33;
int HeightMap[HEIGHTMAP_SIZE][HEIGHTMAP_SIZE];
const int MAX_HEIGHT=50;
const int SEED=10;

int RandomFromSeed(int x)			 
{
	x = (x<<13) ^ x;
    return floor((double)( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0)*100000.0);    
}

void print_mas()
{
	system("cls");
	int i,j;
	for (i=0;i<HEIGHTMAP_SIZE;i++)
	{
		for (j=0;j<HEIGHTMAP_SIZE;j++)
		{
			if (HeightMap[i][j]!=228777) 
			{
				if (HeightMap[i][j]>9) printf("%d ",HeightMap[i][j]);
				else if (HeightMap[i][j]<=9) printf("%d  ",HeightMap[i][j]);
			}
			else printf(" ");
		}
		printf("\n");
	}
	_getch();
}


void main()
{
		int i,j,k;
		for (i=0;i<HEIGHTMAP_SIZE;i++)
			for (j=0;j<HEIGHTMAP_SIZE;j++)
				HeightMap[i][j]=228777;


		//=====================================================< Create World >====================================================
		srand((unsigned)time(NULL));
		HeightMap[0][0]                              =RandomFromSeed(1*SEED)%MAX_HEIGHT;
		HeightMap[0][HEIGHTMAP_SIZE-1]               =RandomFromSeed(2*SEED)%MAX_HEIGHT;
		HeightMap[HEIGHTMAP_SIZE-1][0]               =RandomFromSeed(3*SEED)%MAX_HEIGHT;
		HeightMap[HEIGHTMAP_SIZE-1][HEIGHTMAP_SIZE-1]=RandomFromSeed(4*SEED)%MAX_HEIGHT;
		
		int h=(HEIGHTMAP_SIZE-1)/DIFFUSE;
		for(int sideLength = HEIGHTMAP_SIZE-1; sideLength >= 2; sideLength /=2, h/= 2)
		{
			//SQUARE STEP
			int halfSide = sideLength/2;
			for(int x=0;x<HEIGHTMAP_SIZE-1;x+=sideLength)
				for(int y=0;y<HEIGHTMAP_SIZE-1;y+=sideLength)
					HeightMap[x+halfSide][y+halfSide] =(HeightMap[x][y]+
														HeightMap[x+sideLength][y]+
														HeightMap[x][y+sideLength]+
														HeightMap[x+sideLength][y+sideLength])/4 + RandomFromSeed(x*SEED+y*SEED +SEED)%(h*2+1)-h;

			//DIAMOND STEP
			for(int x=0;x<HEIGHTMAP_SIZE-1;x+=halfSide)
				for(int y=(x+halfSide)%sideLength;y<HEIGHTMAP_SIZE-1;y+=sideLength)
				{
					HeightMap[x][y] =  (HeightMap[(x-halfSide+HEIGHTMAP_SIZE-1)%(HEIGHTMAP_SIZE-1)][y]+ // left
										HeightMap[(x+halfSide)%(HEIGHTMAP_SIZE-1)][y]+ // right
										HeightMap[x][(y+halfSide)%(HEIGHTMAP_SIZE-1)]+ // down
										HeightMap[x][(y-halfSide+HEIGHTMAP_SIZE-1)%(HEIGHTMAP_SIZE-1)])/4+ // up
										RandomFromSeed(x*SEED+y*SEED +SEED)%(h*2+1)-h;
					if(x == 0)  HeightMap[HEIGHTMAP_SIZE-1][y] = HeightMap[x][y];
					if(y == 0)  HeightMap[x][HEIGHTMAP_SIZE-1] = HeightMap[x][y];
				}
		}
		print_mas();
}
Картинки:

Grand_Daddy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Diamond Square. Grand_Daddy Общие вопросы C/C++ 0 23.01.2013 18:08
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04