Перейти к содержимому

Как нарисовать закрашенный круг в c

  • автор:

Как нарисовать закрашенный круг на GLSL #version 120

Может у кого-нибудь есть вершинный и фрагментные шейдеры, которые рисуют закрашенный круг в (x, y) с радиусом r ?

В инете есть туториалы, но они для более новых шейдеров и конкретно для glsl #120 я не нашел 🙁

Буду очень признателен, если у кого-нить что-нибудь завалялось.
Заранее спасибо!

Glaciuse
03.10.15 20:40:03 MSK

Что конкретно не получается с glsl 120?

andreyu ★★★★★
( 05.10.15 09:43:16 MSK )

sadlinuxoid

anonymous
( 05.10.15 09:45:05 MSK )

Логика там одна и та же должна быть. Рисуется quad на экране. В шейдеры передаются радиус и координаты центра. Далее во фрагментном шейдере определяется дистанция от текущего пикселя до центра окружности и если она больше радиуса, то делается discard, иначе пишется цвет в gl_FragColor.

Amp ★★★
( 05.10.15 11:47:19 MSK )
Ответ на: комментарий от Amp 05.10.15 11:47:19 MSK

Все, спасибо! Все получилось и как причешу код, выложу сюда для тех, кому понадобиться в будущем.
Всем спасибо!

Glaciuse
( 05.10.15 19:34:04 MSK ) автор топика

нарисовать закрашенный круг на GLSL

Eddy_Em

anonymous
( 05.10.15 19:39:32 MSK )
Ответ на: комментарий от Amp 05.10.15 11:47:19 MSK

#pragma once #include #include #include #include #include #include using std::vector; using std::string; using std::cout; using std::endl; static const char* vertex_shared_src = "\n" "attribute vec2 tex_coords;\n" "varying vec2 _disc_tex_coords;\n" "void main()\n" "\n"; static const char* fragment_shader_src = "\n" "uniform vec4 disc_color;\n" "varying vec2 _disc_tex_coords;\n" "float disc_radius = 1.0f;\n" "\n" "void main()\n" "\n"; class Cell < public: Cell() < load_shaders(); _disc_color = glGetUniformLocation(_program, "disc_color"); >; void draw() < glClearColor(0.2, 0.2, 0.2, 1.0); glUseProgram(_program); glUniform4f(_disc_color, 0.2f, 0.9f, 0.4f, 1.0f); glBindVertexArray(_vao); glDrawArrays(GL_QUADS, 0, 4 * (GLsizei)_cells.size()); glUseProgram(0); >void add_cell(unsigned int x, unsigned int y, unsigned int r) < _CellData cd; cd.x1 = x - r; cd.y1 = y - r; cd.tex_x1 = -1.0f; cd.tex_y1 = -1.0f; cd.x2 = x - r; cd.y2 = y + r; cd.tex_x2 = -1.0f; cd.tex_y2 = 1.0f; cd.x3 = x + r; cd.y3 = y + r; cd.tex_x3 = 1.0f; cd.tex_y3 = 1.0f; cd.x4 = x + r; cd.y4 = y - r; cd.tex_x4 = 1.0f; cd.tex_y4 = -1.0f; _cells.push_back(cd); _bind_buffers(); >private: struct _CellData < GLfloat x1, y1, tex_x1, tex_y1; GLfloat x2, y2, tex_x2, tex_y2; GLfloat x3, y3, tex_x3, tex_y3; GLfloat x4, y4, tex_x4, tex_y4; >; vector _cells; GLuint _program; GLint _disc_color; GLuint _vbo, _vao; void _bind_buffers() < GLchar* pointer = 0; glGenBuffers(1, &_vbo); glGenVertexArrays(1, &_vao); glBindBuffer(GL_ARRAY_BUFFER, _vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(_CellData) * _cells.size() * sizeof(GLfloat), &_cells[0], GL_STATIC_DRAW); glBindVertexArray(_vao); glBindBuffer(GL_ARRAY_BUFFER, _vbo); // 0 - вершины glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 16, pointer); // 16 - размер одной записи x + y + tex_x1 + tex_y1 // 1 - кординаты текстуры glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 16, pointer + 8); // Включаем массив атрибутов для вершин и координат текстур glEnableVertexAttribArray(0); glEnableVertexAttribArrayARB(1); >void load_shaders() < auto vertex_shader_object = glCreateShader(GL_VERTEX_SHADER); auto fragment_shader_object = glCreateShader(GL_FRAGMENT_SHADER); glShaderSourceARB(vertex_shader_object, 1, &vertex_shared_src, NULL); glShaderSourceARB(fragment_shader_object, 1, &fragment_shader_src, NULL); glCompileShader(vertex_shader_object); _check_shader_compilation(vertex_shader_object, "vertex"); glCompileShader(fragment_shader_object); _check_shader_compilation(fragment_shader_object, "fragment"); _program = glCreateProgram(); glAttachShader(_program, vertex_shader_object); glAttachShader(_program, fragment_shader_object); glBindAttribLocation(_program, 0, "gl_Vertex"); glBindAttribLocation(_program, 1, "tex_coords"); glLinkProgram(_program); _check_program_link(_program); _get_active_vertex_shader_inputs(_program); >void _check_shader_compilation(GLuint shader_object, string shader_name) < GLint compiled, blen, slen; glGetObjectParameterivARB(shader_object, GL_COMPILE_STATUS, &compiled); if(!compiled) < cout 1) < GLchar* compiler_log = new GLchar[blen]; glGetInfoLogARB(shader_object, blen, &slen, compiler_log); cout exit(1); > > void _check_program_link(GLuint program) < GLint linked; GLint blen, slen; glGetProgramiv(program, GL_LINK_STATUS, &linked); if(!linked) < cout 1) < GLchar* link_log = new GLchar[blen]; glGetInfoLogARB(program, blen, &slen, link_log); cout > > void _get_active_vertex_shader_inputs(GLuint program) < char* name; GLint active_attribs, max_length; glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &active_attribs); glGetProgramiv(program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_length); name = new char[max_length + 1]; for(unsigned int i = 0 ; i < active_attribs ; i++) < GLint size; GLenum type; glGetActiveAttrib(program, i, max_length + 1, NULL, &size, &type, name); cout delete [] name; > >; 

Glaciuse
( 05.10.15 21:16:05 MSK ) автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.

Похожие темы

  • Форум Описание алгоритма генерации 2d теней на GLSL (2018)
  • Форум fabric.js Нарисовать сектор круга (2021)
  • Форум Как нарисовать круг на полях? (2009)
  • Форум glsl (2008)
  • Форум Как нарисовать круг в Haskell на Gtk ? (2022)
  • Форум поддержка glsl 4 (2014)
  • Форум GLSL игра без текстур (2018)
  • Новости Finnix 120 (2020)
  • Новости Firefox 120 (2023)
  • Форум Замыкая круг (2023)

Нарисовать круг в C#

Нарисовать круг в C#

Рисование фигур в C# — обычная задача, а рисование кругов — одна из самых простых фигур. Узнайте, как нарисовать круг на C#. В этом сообщении блога мы также покажем вам, как программно закрасить круг цветом с помощью C#.

В этой статье рассматриваются следующие темы:

  1. Графический API C# для рисования круга
  2. Нарисовать круг в C#
  3. Нарисовать заполненный круг в C#
  4. Круг с рамкой в C#
  5. Бесплатные учебные ресурсы

Графический API C# для рисования круга#

Мы будем использовать Aspose.Drawing for .NET для рисования круга в C#. Это полностью управляемая кроссплатформенная полноценная библиотека 2D-графики для рисования текста, геометрии и изображений. Он предлагает широкий спектр операций по манипулированию изображениями, включая обрезку, изменение размера, вращение, переворачивание и нанесение водяных знаков. Это делает его идеальным выбором для разработчиков, которым необходимо создавать и редактировать изображения в своих приложениях.

Пожалуйста, загрузите DLL API или установите ее с помощью NuGet.

PM> Install-Package Aspose.Drawing 

Нарисовать круг в C##

Мы можем легко нарисовать круг, выполнив следующие действия:

  1. Создайте экземпляр класса Bitmap.
  2. Создайте новый объект Graphics из объекта Bitmap, используя метод FromImage().
  3. Инициализируйте объект класса Pen с указанным цветом и размером.
  4. После этого вызовите метод DrawEllipse(), чтобы нарисовать круг заданного размера.
  5. Наконец, сохраните выходное изображение с помощью метода Save().

В следующем примере кода показано, как нарисовать круг на C#.

// Создать новое растровое изображение Bitmap bitmap = new Bitmap(500, 500, PixelFormat.Format32bppPArgb); Graphics graphics = Graphics.FromImage(bitmap); // Создайте экземпляр класса Pen Pen pen = new Pen(Color.Red, 5); // Нарисуйте круг graphics.DrawEllipse(pen, 1, 1, 490, 490); // Сохранить выходное изображение чертежа bitmap.Save("C:\\Files\\DrawCircle.jpg"); 

Нарисовать круг в C#

Нарисуйте заполненный круг в C##

Точно так же мы можем нарисовать закрашенный круг, выполнив следующие шаги:

  1. Создайте экземпляр класса Bitmap.
  2. Создайте новый объект Graphics из объекта Bitmap, используя метод FromImage().
  3. Инициализируйте объект класса SolidBrush указанным цветом.
  4. После этого вызовите метод FillEllipse(), чтобы нарисовать закрашенный круг.
  5. Наконец, сохраните выходное изображение с помощью метода Save().

В следующем примере кода показано, как нарисовать закрашенный круг в C#.

// Создать новое растровое изображение Bitmap bitmap = new Bitmap(500, 500, PixelFormat.Format32bppPArgb); Graphics graphics = Graphics.FromImage(bitmap); // Создайте экземпляр класса Brush Brush brush = new SolidBrush(Color.Blue); // Нарисуйте заполненный круг graphics.FillEllipse(brush, 1, 1, 490, 490); // Сохранить выходное изображение чертежа bitmap.Save("C:\\Files\\DrawFilledCircle.jpg"); 

Нарисуйте заполненный круг в C#

Нарисуйте круг с рамкой в C##

Мы также можем нарисовать закрашенный круг с помощью Broder, выполнив шаги, упомянутые ранее. Мы создадим два круга: внешний круг для границы и внутренний закрашенный круг.

В следующем примере кода показано, как нарисовать круг с рамкой в C#.

// Инициализация объекта класса Bitmap Bitmap bitmap = new Bitmap(500, 500, PixelFormat.Format32bppPArgb); Graphics graphics = Graphics.FromImage(bitmap); // Нарисуйте заполненный круг Brush brush = new SolidBrush(Color.Blue); // Нарисуйте заполненный внутренний круг graphics.FillEllipse(brush, 5, 5, 490, 490); // Создайте экземпляр класса Pen Pen pen = new Pen(Color.Red, 10); // Нарисуйте внешний круг graphics.DrawEllipse(pen, 5, 5, 490, 490); // Сохранить выходное изображение чертежа bitmap.Save("C:\\Files\\DrawCircleWithBorder.jpg"); 

Нарисуйте круг с рамкой в C#

Получите бесплатную лицензию#

Вы можете получить бесплатную временную лицензию, чтобы оценить API на полную мощность.

C# Draw Circle — бесплатные учебные ресурсы#

Вы можете узнать больше о рисовании основных фигур и изучить различные другие функции библиотеки, используя ресурсы ниже:

  • Руководство разработчика
  • Бесплатные онлайн-приложения
  • Справочник по API
  • Практические руководства и статьи

Заключение#

В этой статье мы узнали, как нарисовать криклий на C#. Мы также увидели, как нарисовать закрашенный круг и установить его границу программно с помощью Aspose.Drawing for .NET. Используя Aspose.Drawing, вы также можете визуализировать векторную графику, такую как линии, кривые и фигуры, а также текст с различными шрифтами, размерами и стилями, на растровых изображениях. В случае возникновения каких-либо неясностей, пожалуйста, свяжитесь с нами на нашем бесплатном форуме поддержки.

Смотрите также#

  • Добавить текст к изображению в C#
  • Создать растровое изображение в C#
  • Альфа-смешение в C#
  • Обрезка изображений в C#
  • Графическое программирование на C#
  • Aspose.Drawing Product Family
  • csharp graphics api
  • csharp draw circle
  • graphic csharp
  • csharp graphics example
  • csharp vector graphics
  • graphics programming in csharp
  • csharp create graphics
  • graphics class csharp
  • csharp graphics framework

Как нарисовать закрашенный круг в c

Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: нет
Всего: 33

Мне нужна такая же функция как и

Код
imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color )

но чтобы не закрашивала этот круг, а делала что-то мое, например, делала этот эллипс черно-белым или негативным — то есть чтоб была возможность пробежаться по пикселя внутри этого круга, делая то, что мне нужно.

В общем, требуется написать эту же функцию (imagefilledellipse), но своими силами.

Мне что-то туго думается, хоть и по геометрии, помнится, было пять

Нарисовать-то круг я смогу — нужно просто пробежаться по радиусу, вычисляя точки синусом и косинусом. А вот чтоб закрасить? Чтоб в двух for циклах пробежаться ТОЛЬКО внутри этих вычисленных точек окружности.

Добавлено @ 00:31
О, кажется нашел что-то тут, что мне поможет:
http://forum.vingrad.ru/index.php?showtopi. st&p=709991
да еще и с размывкой по краям круга! Замечательно!

Цитата(SelenIT @ 14.3.2008, 01:58)
Я ра улез
Тру кря ве бе льчиряршобетспо. В тыкро.

Как нарисовать закрашенный круг в c

если кто не знает SDL, то эта функция ставит точку по заданным координат во 2 и 3 аргументе.
Вся задача в том, что 360 мало для этого цикла. как определить кол-во точек? есть какая-нибудь формула? думаю тут замешан радиус
если окружность радиусом 20, то норм ещё

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

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

а должна быть закрашенная область. помогите пожалуйста

Пользователь
Регистрация: 09.10.2012
Сообщений: 15

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

вырази одну координату и рисуй, смещаясь по другой. Как то так.

Форумчанин
Регистрация: 30.10.2012
Сообщений: 121

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

СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,336

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 .
Форумчанин
Регистрация: 30.10.2012
Сообщений: 121
Как рисовать полигонами?
Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,792

// Полигоны.cpp: определяет точку входа для приложения. // #include "stdafx.h" #include "Полигоны.h" #include #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;iPolygon(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) : 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 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *