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

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #11  
Старый 14.03.2012, 19:35
Аватар для Vertex
Новичок

Отправить личное сообщение для Vertex Посмотреть профиль Найти все сообщения от Vertex
 
Регистрация: 22.06.2008
Адрес: Узбекистан, Ташкент
Сообщений: 22

Построение окружности и дуги
Вот, собственно, алгоритм построения окружности
Код:
void	Circle(HDC hdc, long xc, long yc, long r) {
	long	s = r * r;		// Квадрат радиуса
	long	x = r;			// Текущий x
	long	y = 0;			// Текущий y
	long	xx = s;			// Квадрат x
	long	yy = 0;			// Квадрат y
	do {
		SetPixel(hdc, xc + x, yc + y, 0x000000);
		SetPixel(hdc, xc + x, yc - y, 0x000000);
		SetPixel(hdc, xc - x, yc - y, 0x000000);
		SetPixel(hdc, xc - x, yc + y, 0x000000);
		SetPixel(hdc, xc + y, yc + x, 0x000000);
		SetPixel(hdc, xc + y, yc - x, 0x000000);
		SetPixel(hdc, xc - y, yc - x, 0x000000);
		SetPixel(hdc, xc - y, yc + x, 0x000000);
		++ y,				// Делаем шаг вперёд
		yy += y * 2 - 1;	// Корректируем квадрат y
		if(xx + yy > s)		// Сумма квадратов x и y больше квадрата радиуса?
			-- x,			// Делаем шаг в сторону
			xx -= x * 2 - 1;// Корректируем квадрат x
	} while(y < x);			// Продолжаем, пока не нарисовали 1/8 окружности
}
а также глючный алгоритм с рисованием от начального к конечному углам
Код:
void	CircleFromTo(HDC hdc, long xc, long yc, long r, long b, long e, long c) {
	long	s = r * r;		// Квадрат радиуса
	long	x = r;			// Текущий x
	long	y = 0;			// Текущий y
	long	xx = s;			// Квадрат x
	long	yy = 0;			// Квадрат y
	long	xb = (r * cos(PI / 180 * b));
	long	yb = (r * sin(PI / 180 * b));
	long	xe = (r * cos(PI / 180 * e));
	long	ye = (r * sin(PI / 180 * e));
	if(b > e)
		b -= 360;
	do {
		if((b <= 0 && e >= 45) || (b <= 45 && y >= yb && (e >= 45 || (e <= 45 && y <= ye))))
			SetPixel(hdc, xc + x, yc - y, c);	// 1-st sector of 8
		if((b <= 45 && e >= 90) || (b <= 90 && y <= xb && (e >= 90 || (e <= 90 && y >= xe))))
			SetPixel(hdc, xc + y, yc - x, c);	// 2-nd secfof of 8
		if((b <= 90 && e >= 135) || (b <= 135 && -y <= xb && (e >= 135 || (e <= 135 && -y >= xe))))
			SetPixel(hdc, xc - y, yc - x, c);	// 3-rd secfof of 8
		if((b <= 135 && e >= 180) || (b <= 180 && y <= yb && (e >= 180 || (e <= 180 && y >= ye))))
			SetPixel(hdc, xc - x, yc - y, c);	// 4-th secfof of 8
		if((b <= 180 && e >= 225) || (b <= 225 && -y <= yb && (e >= 225 || (e <= 225 && -y >= ye))))
			SetPixel(hdc, xc - x, yc + y, c);	// 5-th secfof of 8
		if((b <= 225 && e >= 270) || (b <= 270 && -y >= xb && (e >= 270 || (e <= 270 && -y <= xe))))
			SetPixel(hdc, xc - y, yc + x, c);	// 6-th secfof of 8
		if((b <= 270 && e >= 315) || (b <= 315 && y >= xb && (e >= 315 || (e <= 315 && y <= xe))))
			SetPixel(hdc, xc + y, yc + x, c);	// 7-th secfof of 8
		if((b <= 315 && e >= 360) || (b <= 360 && -y >= yb && (e >= 360 || (e <= 360 && -y <= ye))))
			SetPixel(hdc, xc + x, yc + y, c);	// 8-th secfof of 8
		++ y,				// Делаем шаг вперёд
		yy += y * 2 - 1;	// Корректируем квадрат y
		if(xx + yy > s)		// Сумма квадратов x и y больше квадрата радиуса?
			-- x,			// Делаем шаг в сторону
			xx -= x * 2 - 1;// Корректируем квадрат x
	} while(y < x);			// Продолжаем, пока не нарисовали 1/8 окружности
}
P.S.: Странно, но это оказывается не алгоритм Брезенхэма! Когда однажды приспичило, а под рукой не было описания его алгоритма, я его с потолка стянул, как очевидный.
Теперь думаю, если это - не Брезенхэма, то чей же?

Последний раз редактировалось Vertex, 15.03.2012 в 04:25. Причина: Non-Bresenham
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление факториала ;) _persicum_ Математические алгоритмы 14 11.11.2010 01:55
вычисление с точностью Shtolz Математические алгоритмы 4 27.03.2010 19:34
Головоломка с линейной алгеброй midi Задачи 3 13.02.2010 18:08
Вычисление exp гость Математические алгоритмы 3 26.01.2010 17:54
Вычисление выражений Andrew Математические алгоритмы 1 27.08.2007 00:45