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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2012, 18:27   #1
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
Сообщение Окружность

Функция рисования окружности выглядит следующим образом:
Код:
void circle(SDL_Renderer *tmp,int x,int y,int radius)
{
    int i;
    for(i=0; i<360; i++)
        SDL_RenderDrawPoint(tmp,x-cos(i)*radius,y+sin(i)*radius);
}
если кто не знает SDL, то эта функция ставит точку по заданным координат во 2 и 3 аргументе.
Вся задача в том, что 360 мало для этого цикла. как определить кол-во точек? есть какая-нибудь формула? думаю тут замешан радиус
если окружность радиусом 20, то норм ещё

а вот если например радиус задать 150, то видны пропуски.


особенно это видно если вызов функции зациклить от 0 до radius и вместо радиуса посылать в функцию i

а должна быть закрашенная область... помогите пожалуйста
Murashov вне форума Ответить с цитированием
Старый 31.10.2012, 19:12   #2
DRFRIMEN
Пользователь
 
Регистрация: 09.10.2012
Сообщений: 15
По умолчанию

ну можно к примеру не так рисовать, а по формуле окружности (Wiki).

вырази одну координату и рисуй, смещаясь по другой. Как то так.
DRFRIMEN вне форума Ответить с цитированием
Старый 31.10.2012, 19:38   #3
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

2*M_PI*radius - длина окружности
теперь круг получается ровный, а если зациклить опять что-то не то

Murashov вне форума Ответить с цитированием
Старый 31.10.2012, 19:44   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Murashov
1. sin и cos принимают значения в радианах.
2. рисуй не точки, а полигон.


пс. зачем ты вообще пытаешься "залить" окружность, рисуя кучу более мелких окружностей?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 31.10.2012 в 19:47.
pproger вне форума Ответить с цитированием
Старый 31.10.2012, 20:38   #5
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

Как рисовать полигонами?
Murashov вне форума Ответить с цитированием
Старый 31.10.2012, 20:52   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот так:
Код:
// Полигоны.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "Полигоны.h"
#include <math.h>
#define MAX_LOADSTRING 100

// Глобальные переменные:
....

void poly(int n,HDC dc){
	double ang=0,x,y,r=200,cx=400,cy=400;
	POINT *p=new POINT[n];
	for(int i=0;i<n;i++){
		p[i].x=cos(ang)*r+cx;
		p[i].y=sin(ang)*r+cy;
		ang+=2*3.1415926/n;
	}
	Polygon(dc,p,n);
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
...
	return (int) msg.wParam;
}



//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_MY);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND	- обработка меню приложения
//  WM_PAINT	-Закрасить главное окно
//  WM_DESTROY	 - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Разобрать выбор в меню:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		poly(6,hdc);
		// TODO: добавьте любой код отрисовки...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}
Здесь в poly передавай кол-во сторон и получишь полигон.


Упс, а это не тема про OpenGL или типа нее нестандартные библы?
I'm learning to live...

Последний раз редактировалось Stilet; 31.10.2012 в 20:54.
Stilet вне форума Ответить с цитированием
Старый 31.10.2012, 21:19   #7
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

нет, это не опенджель) и кстати мне нужно будет сохранять координаты каждой точки в массив, чтобы потом можно было вычитания, складывания и всякие универсумы делать с двумя окружностями
Murashov вне форума Ответить с цитированием
Старый 31.10.2012, 21:51   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну сохраняй, в чем проблема?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.11.2012, 10:23   #9
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Это WinAPI, а не OpenGL
вот только библиотеки "windows.h" не хватает
Axrik вне форума Ответить с цитированием
Старый 01.11.2012, 11:25   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1. Если можно использовать линии, а не точки, то пропусков не будет, а вместо окружности просто получится многоугольник
2. Если всё же нужно рисовать точками, тогда нужно подходить к задаче с другой стороны. В рисовании используется два типа координат мировые и экранные. Сейчас рисование идёт от мировых координат и проецируется на экранные. Получаем, что разрешение экрана выше предусмотренного и имеем такую фигню. Нужно брать экранные координаты по оси x, например, и на основании их высчитывать точку по оси y. Смещать координату х на 1 пиксель и таким образом получим подстраивание детализации картинки под разрешение экрана.
ЗЫ.
Мировые координаты тут: cos(i)*radius и sin(i)*radius
Экранные: x-cos(i)*radius и y+sin(i)*radius
Если нужно залить окружность, тогда можно написать функцию определения входит ли пиксель в окружность и обходить так попиксельно прямоугольную область, в которую вписана нужная нам окружность
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Окружность Ins1De Общие вопросы C/C++ 2 29.11.2011 12:15
окружность кольца tcjkjl Помощь студентам 3 05.11.2011 10:36
окружность MetR Помощь студентам 1 08.01.2011 13:05
Пунктирная окружность Гамбит Помощь студентам 3 13.03.2010 14:39
Окружность.. surovii Помощь студентам 28 29.03.2009 18:00