@parkito

Как нарисовать круг на с++?

Здравствуйте. Нужно нарисовать круг в простом консольном проекте под ubuntu. Использую gcc. Погуглил, для решения такой задачи везде используют то windows.h то graphics.h, а вот gcc на это ругается. Подскажите пожалуйста как возможно решить эту проблему.
  • Вопрос задан
  • 18992 просмотра
Пригласить эксперта
Ответы на вопрос 6
@Eddy_Em
Вот - простой способ:
#include <GL/glut.h>
#include <math.h>
// compile:
// gcc -Wall -Wextra -Werror -lglut -lGL -lm -std=gnu99 -D_GNU_SOURCE opengl.c -o openglcircle

#define _U_    __attribute__((__unused__))
// exit by ctrl+q or escape
void keyPressed(unsigned char key, _U_ int x, _U_ int y){
	int mod = glutGetModifiers(); // window = glutGetWindow()
	if(mod == GLUT_ACTIVE_CTRL && key == 'q') exit(0);
	else if(key == 27) exit(0);
}

void DrawCircle(float cx, float cy, float r, int num_segments){
	float theta = 2. * M_PI / (float)num_segments;
	float c, s, t, x = r, y = 0.;
	sincosf(theta, &s, &c);
	glBegin(GL_LINE_LOOP);
	for(int ii = 0; ii < num_segments; ii++){
		glVertex2f(x + cx, y + cy);
		t = x;
		x = c * x - s * y;
		y = s * t + c * y;
	}
	glEnd();
}

void display(){
	glClear(GL_COLOR_BUFFER_BIT);
	DrawCircle(0.,0.,0.5,100);
	glFlush();
}

int main(int argc, char** argv){
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutCreateWindow("A Simple Circle");
	glutDisplayFunc(display);
	glutKeyboardFunc(keyPressed);
	glutMainLoop();
}


А, извиняюсь, про С++ не заметил. Ну да ладно, все равно я С++ не знаю и знать не хочу!

P.S. А вот - чистая консолька:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *drawCircle(int R, int geom){
	if(R > 200 || R < 1) return NULL;
	int S, i, Y = 2 * R + 2;
	if(geom)
		S = Y * (R + 1);
	else
		S = Y * (Y - 1);
	char *buf = malloc(S+1);
	if(!buf) return NULL;
	memset(buf, ' ', S);
	buf[S] = 0;
	for(i = Y-1; i < S; i+=Y) buf[i] = '\n';
	inline void DrawPixel(int x, int y){
		if(geom){
			if(y%2==0) buf[Y * y/2 + x] = '*';
		}else{
			buf[Y * y + x] = '*';
		}
	}
	// Bresenham's circle algorithm
	int x = R;
	int y = 0;
	int radiusError = 1-x;
	while(x >= y){
		DrawPixel(x + R,   y + R);
		DrawPixel(y + R,   x + R);
		DrawPixel(-x + R,  y + R);
		DrawPixel(-y + R,  x + R);
		DrawPixel(-x + R, -y + R);
		DrawPixel(-y + R, -x + R);
		DrawPixel(x + R,  -y + R);
		DrawPixel(y + R,  -x + R);
		y++;
		if (radiusError < 0){
			radiusError += 2 * y + 1;
		}else{
			x--;
			radiusError += 2 * (y - x) + 1;
		}
	}
	return buf;
}

int main(int argc, char **argv){
	int i, R;
	char *buf;
	for(i = 1; i < argc; i++){
		if(!(buf = drawCircle(R = atoi(argv[i]), 1))){
			printf("Wrong parameter %s\n", argv[i]);
			continue;
		}
		printf("\nCircle with R = %d:\n%s\n", R, buf);
		free(buf); buf = NULL;
	}
	return 0;
}

Алгоритм Брезенхэма, второй аргумент функции drawCircle задает поправку на геометрию терминала: если у вас вдруг в терминале высота буквы равна ширине, то пишите 0, если же высота в 2 раза больше ширины, пишите 1.
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
В консольном? А в никсах консоль вообще графику поддерживает?
Ответ написан
@hardwellZero
Для лаб в универе приходилось использовать Code::Blocks под Wine + graphics.h
Ответ написан
@AVKor
Кошмар какой.

Это вообще откуда и зачем?
Ответ написан
Комментировать
AxisPod
@AxisPod
В консольном псевдографикой если только, ручками рисуйте.
Ответ написан
Комментировать
@sitev_ru
sitev.ru - мой блог ...
Алгоритм отрисовки круга примерно такой:
//Цикл от 0 до 360 градусов
for (int i = 0; i < 360; i++) {

	//Перевод из градусов в радианы
	double a = i * M_PI / 180;
	
	//Задаём нужный радиус
	double r = 1; 
	
	//Вычисляем координаты
	double x = r * cos(a);
	double y = r * sin(a);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы