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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.10.2013, 01:29   #1
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
Смех Делитесь кодом!

Дело было вечером, делать было нечего, ради поддержания моего и вашего творческого интереса или самоутверждения в чужих глазах, короче по весу своих комплексов - Делитесь работоспособными полезными функциями, с принципом работы - "дал параметры - получил результат."
do not use your brain
Кащей вне форума
Старый 06.10.2013, 01:30   #2
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

С меня пример как ето делать:
Код:
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*
 * Magic wand(Волшебная палочка)
 * Рекурсивное выделение совместных областей
 */
//Сравнение пикселей
float mb_sim_pack(	unsigned char* buf,//Одномерный буфер с изображением
					int a,//Позиция первого сравниваемого пикселя
					int n,//Позиция второго сравниваемого пикселя
					int *s){//Количество байт в пикселе
	int i;
	float cmp = 0.0;
	for(i = 0; i < *s; i++)
		cmp += (buf[a + i] > buf[n + i]) ? buf[n + i] / (buf[a + i] / 255.0) : buf[a + i] / (buf[n + i] / 255.0);
	return cmp / *s;
}
//Сравнение пикселей по алгоритму волшебной палочки
void mb_magic_sim(	unsigned char* in,//Буфер с изображением
					unsigned char* out,//Буфер для бинарного изображения
					int *w,//Ширина изображения
					int *h,//Высота изображения
					int x,//Координата пикселя
					int y,//Координата пикселя
					int *s,//Размер пикселя в байтах
					unsigned char* z){//процентное сходство(1-254)
	
	if(	x - 1 >= 0 &&
		x + 1 < *w &&
		y - 1 >= 0 &&
		y + 1 < *h){
			
		out[(y - 1) * *w + x] = (out[(y - 1) * *w + x] == 0) ?
			((mb_sim_pack(in, (y * *w + x) * *s, ((y - 1) * *w + x) * *s, s) > *z) ?(1) : (0)) : 0;
		mb_magic_sim(in, out, w, h, x, y - 1, s, z);
		
		out[(y + 1) * *w + x] = (out[(y + 1) * *w + x] == 0) ?
			((mb_sim_pack(in, (y * *w + x) * *s, ((y + 1) * *w + x) * *s, s) > *z) ? (1) : (0)) : 0;
		mb_magic_sim(in, out, w, h, x, y + 1, s, z);
		
		out[y * *w + x + 1] = (out[y * *w + x + 1] == 0) ?
			((mb_sim_pack(in, (y * *w + x) * *s, (y * *w + x + 1) * *s, s) > *z) ? (1) : (0)) : 0;
		mb_magic_sim(in, out, w, h, x + 1, y, s, z);
		
		out[y * *w + x - 1] = (out[y * *w + x - 1] == 0) ?
			((mb_sim_pack(in, (y * *w + x) * *s, (y * *w + x - 1) * *s, s) > *z) ? (1) : (0)) : 0;
		mb_magic_sim(in, out, w, h, x - 1, y, s, z);
	}
}
//Волшебная палочка, стартовая функция
unsigned char* mb_magic_wand(	unsigned char* in,//Изображение в любом формате(RGB, RGBA или ещё чего)
								int x,//Координата пикселя
								int y,//Координата пикселя
								int w,//Ширина изображения в пиксеоях
								int h,//Высота изображения в пикселях 
								int s,//Размер пикселя в байтах
								unsigned char z){//процентное сходство(1-254)
	unsigned char* out = malloc(w * h);//Это результат, бинаризированное изображение.
	if(out != NULL){
		if(z == 0) z++;
		else if(z == 255) z--;
		memset(out, 0, w * h);
		mb_magic_sim(in, out, &w, &h, x, y, &s, &z);
	}
	return out;
}

/*
 * Деление на ноль 
 */
#define division(a, b) ((b == 0) ? a : a / b)
/*
//end
do not use your brain

Последний раз редактировалось Кащей; 06.10.2013 в 01:32.
Кащей вне форума
Старый 06.10.2013, 01:30   #3
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Код:
/*
 * Magic Beetle (Алгоритм жука - волшебный)
 * Обход бинарного изображения по контуру.
 * Вычисление суммы углов между элементарными
 * векторами заданного шагом размера,
 * из которых состоит контур.
 * (Выражение контура одним числом, не являющимся скаляром)
 */
//Сравнение двух чисел в поцентах(0-255%)
float mb_sim/*ilarity*/(	unsigned char *a,
							unsigned char *b){
	return (*a > *b) ? *b / (*a / 255.0) : *a / (*b / 255.0);
}
//Вычисление косинуса угла между двумя векторами имеющими общую точку
double mb_angle_cos(	int Ax,//Координата Х начала первого вектора
						int Ay,//Координата У начала первого вектора
						int Bx,//Координата Х общей точки
						int By,//Координата У общей точки
						int Cx,//Координата Х начала второго вектора
						int Cy){//Координата У начала второго вектора
	int	ABx = Bx - Ax, ABy = By - Ay,
		BCx = Cx - Bx, BCy = Cy - By;
	return (ABx * BCx + ABy * BCy) / (sqrt(pow(ABx, 2) + pow(ABy, 2)) * sqrt(pow(BCx, 2) + pow(BCy, 2)));
}
//Волшебный жук, стартовая функция
int magic_beetle(	unsigned char* in,//Буфер содержащий бинарное изображение
					int w,//Ширина изображения
					int h,//Высота изображения
					int step,//Шаг жука
					int *ID){//Число
	#define N 0
	#define E 1
	#define S 2
	#define W 3
	int i, n = 0,
	counter[2] = { 0, 0 },
	X[2] = { 0, 0 },
	Y[2] = { 0, 0 };
	while(in[i] == 0) i++;
	if(i < w * h - 1){
		
		int y = in[i] / h,
		x = w - (w - y),
		startX = x,
		startY = y;
		
		while(x != startX || y != startY){
		
			switch(n){
				
				case N:	y -= (y - 1 > 0) ? 1 : 0;
						if(y - 1 < 0 || in[y - 1 * h + x] == 0){
							if(n++ > 3) n = 0;
						}
						else if(n-- < 0) n = 3;
						break;
						
				case E:	x += (x + 1 < w - 1) ? 1 : 0;
						if(x + 1 > w - 1 || in[y * h + x + 1] == 0){
							if(n++ > 3) n = 0;
						}
						else if(n-- < 0) n = 3;
						break;
						
				case S:	y += (y + 1 < h - 1) ? 1 : 0;
						if(y + 1 > h - 1 || in[y + 1 * h + x] == 0){
							if(n++ > 3) n = 0;
						}
						else if(n-- < 0) n = 3;
						break;
						
				case W:	x -= (x - 1 > 0) ? 1 : 0;
						if(x - 1 < 0 || in[y * h + x - 1] == 0){
							if(n++ > 3) n = 0;
						}
						else if(n-- < 0) n = 3;
						break;
			
			}
			
			counter[0]++;
			if(counter[0] == step){
				counter[1]++;
				counter[0] = 0;
				if(step > 1 && counter[1] > 2){
					*ID += mb_angle_cos(X[0], Y[0], X[1], Y[1], x, y);
					X[0] = X[1];
					X[1] = x;
					Y[0] = Y[1];
					Y[1] = y;
				}
			}
		}
		if(step > 1 && counter[1] > 2){
			*ID += mb_angle_cos(X[0], Y[0], X[1], Y[1], startX, startY);
		}
		
	}
	
	#undef N
	#undef E
	#undef S
	#undef W
	
	return counter[1];//возвращает вроде как количество элементарных векторов(пройденных жуком шагов)
}
do not use your brain

Последний раз редактировалось Кащей; 06.10.2013 в 01:33.
Кащей вне форума
Старый 06.10.2013, 05:20   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Аттракцион неслыханной щедрости ?
У меня на C/C++ ничего нет, я все как-то на Паскале.
type_Oleg вне форума
Старый 06.10.2013, 09:23   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я предлагаю, раз уж такая пьянка пошла, дополнять эту тему: http://www.programmersforum.ru/showthread.php?t=70310
Она собсно для подобных случаев и создавалась. Если нужно открою ее.
I'm learning to live...
Stilet вне форума
Старый 06.10.2013, 14:18   #6
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

хорошая идея!
Igor95 вне форума
Старый 06.10.2013, 16:09   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В общем пишите сюда - кому нужно открыть ту копилку.
I'm learning to live...
Stilet вне форума
Старый 06.10.2013, 16:24   #8
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Аттракцион неслыханной щедрости ?
Непонял .
do not use your brain
Кащей вне форума
Старый 06.10.2013, 16:26   #9
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
В общем пишите сюда - кому нужно открыть ту копилку.
Яб на твоём месте держал бы на главной странице постоянно открытую копилку.
do not use your brain
Кащей вне форума
Старый 06.10.2013, 17:20   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Яб на твоём месте держал бы на главной странице постоянно открытую копилку.
Угу, а потом кто будет ее зачищать от вопросов новичков, лезущих в чужие темы? Пушкин?
I'm learning to live...
Stilet вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск кодом Keshunya Microsoft Office Excel 6 29.06.2011 13:18
Проблема с кодом. scottie Паскаль, Turbo Pascal, PascalABC.NET 3 11.04.2010 15:44
Помощь с кодом. -=Virus=- Помощь студентам 7 24.12.2009 07:38
Помогите с кодом judge_arm Microsoft Office Excel 2 01.07.2009 11:48