Большой Воронежский Форум
Страница 2 из 2
< 12
» Программирование>Математика в программировании
maximk 11:38 12.01.2004
zss_vrn
Вот собственно подумалось:
математика она же не ради самой себя развивалась, так? А вроде как для решения насущных задач.

Только вот задачи в основном такие, что в полном объеме она не нужна. Нужна далеко не в полном. Но то, что ее можно и порой нужно использовать для решения самых разнообразных задач это факт. [Ответ]
zss_vrn 12:02 12.01.2004
maximk
Ну да, она - инструмент. Собственно, прежде чем ченть напрограммировать, надо формализовать задачу - по большому счету, описать ее на мат. языке. Щас UML очень полезен.

Интересно, UML - это математика или нет? [Ответ]
LSL 13:16 12.01.2004
Математикой описывается почти всё стороны нашего существования, о программировании и говорить не приходиться, а говорить можно бесконечно.

Лучше приведите конкретные случаи, из вашей практики, где вам понадобилась математика. [Ответ]
Sandy 13:21 12.01.2004
написание алгоритмов три де графики
тогда еще openGL не было.
[Ответ]
mikе 20:00 12.01.2004
обработка растровой и векторной графики (без 3д) [Ответ]
LSL 20:44 12.01.2004
mike_s
обработка растровой

Какие алгоритмы ? [Ответ]
mikе 20:52 12.01.2004
всяко разно. размытие, наложение, повороты, векторизация(это правда так и не закончил), фильтры по цветам и т.д., яркости/контрасты. Короче, чего только не я там не делал. Скучно. [Ответ]
LSL 22:30 12.01.2004
mike_s
всяко разно. размытие, наложение, повороты, векторизация(это правда так и не закончил), фильтры по цветам и т.д., яркости/контрасты. Короче, чего только не я там не делал. Скучно.

Манипулировать составляющими цвет байтами это не матиматика. Чтобы размыть картинку даже в школу ходить не надо, достаточно знать что такое среднее арифмитическое Впрочем матрицы заюзать полезно..

векторизация

Это я так понимаю преобразование растровой картинки в набор вершин описывающих векторный рисунок ?
[Ответ]
Grossmeister 23:35 12.01.2004
LSL Большинство таких эффектов используют довольно сложную математику (интегральные преобразования, матричные операции, квантование и прочее). Все цветовые фильтры используют довльно сложную математику.
Еще недавно столкнулся с теорией вероятности в решении банальной задачи поиска в подстроке. [Ответ]
LSL 00:32 13.01.2004
Grossmeister
Выложить для примера алгоритмы фотошоповских эффектов на C# ?

Кое где есть математика но она не "довольно сложная".. она простая даже я пойму если пол часика посижу [Ответ]
zic 07:28 13.01.2004
LSL
Некоторые ты за полчаса просто прочитать не успеешь .
Кроме того одно дело понять и совсем другое написать .

Grossmeister
Еще недавно столкнулся с теорией вероятности в решении банальной задачи поиска в подстроке.

Угу . знаем , .5 на .5 либо найдеш либо нет.
[Ответ]
maximk 08:14 13.01.2004

Сообщение от :
Чтобы размыть картинку даже в школу ходить не надо, достаточно знать что такое среднее арифмитическое

для обывателя это так. Но там действительно достаточно серьезная математика. У нас был курс.

Кстати, среднее арифметическое - это не настоящее размытие. А про матрицы... а как ты думаешь, откуда коэфф. этой матрицы беруться? Оооо! Чтобы строго доказать откуда они, нужно много чего знать... [Ответ]
LSL 16:37 13.01.2004
maximk Да ты прав... если глубоко копать, то можно глубоко уйти в землю.

И не вернутся

zic
Некоторые ты за полчаса просто прочитать не успеешь .

Это на C++


Вот код:

Размытие, и гауссовское размытие

Код:
public static bool Smooth(Bitmap b, int nWeight)
{
	ConvMatrix m = new ConvMatrix();
	m.SetAll(1);
	m.Pixel = nWeight;
	m.Factor = nWeight + 8;

	return  BitmapFilter.Conv3x3(b, m);
}


public static bool GaussianBlur(Bitmap b, int nWeight)
{
	ConvMatrix m = new ConvMatrix();
	m.SetAll(1);
	m.Pixel = nWeight;
	m.TopMid = m.MidLeft = m.MidRight = m.BottomMid = 2;
	m.Factor = nWeight + 12;

	return  BitmapFilter.Conv3x3(b, m);
}



public class ConvMatrix
{
	public int TopLeft = 0, TopMid = 0, TopRight = 0;
	public int MidLeft = 0, Pixel = 1, MidRight = 0;
	public int BottomLeft = 0, BottomMid = 0, BottomRight = 0;
	public int Factor = 1;
	public int Offset = 0;

	public void SetAll(int nVal)
	{
		TopLeft = TopMid = TopRight = MidLeft = Pixel = MidRight = BottomLeft = BottomMid = BottomRight = nVal;
	}
}

public static bool Conv3x3(Bitmap b, ConvMatrix m)
{
	if (0 == m.Factor) return false;

	Bitmap bSrc = (Bitmap)b.Clone(); 

	BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
	BitmapData bmSrc = bSrc.LockBits(new Rectangle(0, 0, bSrc.Width, bSrc.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

	int stride = bmData.Stride;
	int stride2 = stride * 2;
	System.IntPtr Scan0 = bmData.Scan0;
	System.IntPtr SrcScan0 = bmSrc.Scan0;

	unsafe
	{
		byte * p = (byte *)(void *)Scan0;
		byte * pSrc = (byte *)(void *)SrcScan0;

		int nOffset = stride - b.Width*3;
		int nWidth = b.Width - 2;
		int nHeight = b.Height - 2;

		int nPixel;

		for(int y=0;y < nHeight;++y)
		{
			for(int x=0; x < nWidth; ++x )
			{
				nPixel = ( ( ( (pSrc[2] * m.TopLeft) + (pSrc[5] * m.TopMid) + (pSrc[8] * m.TopRight) +
							(pSrc[2 + stride] * m.MidLeft) + (pSrc[5 + stride] * m.Pixel) + (pSrc[8 + stride] * m.MidRight) +
							(pSrc[2 + stride2] * m.BottomLeft) + (pSrc[5 + stride2] * m.BottomMid) + (pSrc[8 + stride2] * m.BottomRight)) / m.Factor) + m.Offset); 

				if (nPixel < 0) nPixel = 0;
				if (nPixel > 255) nPixel = 255;

				p[5 + stride]= (byte)nPixel;

				nPixel = ( ( ( (pSrc[1] * m.TopLeft) + (pSrc[4] * m.TopMid) + (pSrc[7] * m.TopRight) +
							(pSrc[1 + stride] * m.MidLeft) + (pSrc[4 + stride] * m.Pixel) + (pSrc[7 + stride] * m.MidRight) +
							(pSrc[1 + stride2] * m.BottomLeft) + (pSrc[4 + stride2] * m.BottomMid) + (pSrc[7 + stride2] * m.BottomRight)) / m.Factor) + m.Offset); 

				if (nPixel < 0) nPixel = 0;
				if (nPixel > 255) nPixel = 255;
							
				p[4 + stride] = (byte)nPixel;

				nPixel = ( ( ( (pSrc[0] * m.TopLeft) + (pSrc[3] * m.TopMid) + (pSrc[6] * m.TopRight) +
							(pSrc[0 + stride] * m.MidLeft) + (pSrc[3 + stride] * m.Pixel) + (pSrc[6 + stride] * m.MidRight) +
							(pSrc[0 + stride2] * m.BottomLeft) + (pSrc[3 + stride2] * m.BottomMid) + (pSrc[6 + stride2] * m.BottomRight)) / m.Factor) + m.Offset); 

				if (nPixel < 0) nPixel = 0;
				if (nPixel > 255) nPixel = 255;

				p[3 + stride] = (byte)nPixel;

				p += 3;
				pSrc += 3;
			}
			p += nOffset;
			pSrc += nOffset;
		}
	}

	b.UnlockBits(bmData);
	bSrc.UnlockBits(bmSrc);

	return true;
}

Элементарно...
[Ответ]
Grossmeister 21:22 13.01.2004
LSL А ты можешь привести формулы, которые реализует этот алгоритм? [Ответ]
LSL 22:22 13.01.2004
Grossmeister Я в этих алгоритмах не разбирался, но там кажется, простое перемножение матрицы на первый второй и третий байт цвета пиксела, и так с каждым пикселом... [Ответ]
JOHN_PROFF 17:43 15.01.2004
Кроме логики ничего не нужно. [Ответ]
JOHN_PROFF 09:50 16.01.2004
Sheriff

Сообщение от :
Гораздо быстрее и проще пройти подготовку в вузе

Знания, которые преобретаешь сам, в 10 раз ценнее тех знаний, которые тебе дают. Когда сам:
1. Эти знания не забываются.
2. Добывая одно знание, попутно преобретаешь 10 новых. [Ответ]
zic 10:22 16.01.2004
JOHN_PROFF
Согласен . Но ты просто не представляешь себе наверное что такое высшая математика самостоятельно .
Скучно не будет [Ответ]
JOHN_PROFF 11:00 16.01.2004
zic Я с 8 класса самостоятельно учусь и стараюсь все сдавать экстерном.
Не беру в расчет графику (не работал), а остальные отрасли помоему знания высшей математики от меня не требуют. Даже если мне надо написать прогу со сложными расчетами, то заказчик даст формулы, по которым все будет считаться. [Ответ]
Страница 2 из 2
< 12
Вверх