Форум программистов, компьютерный форум CyberForum.ru

Окружность - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
09.03.2013, 21:52     Окружность #1
Господа!

Как нарисовать систему координат (две оси Ох и Оу) круг с центром в начале координат, если известен максимум по одной из осей? Т.е. центр круга всегда начало коорд. (0) и известна одна точка на оси.
Спасибо за внимание!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 21:52     Окружность
Посмотрите здесь:

C++ Окружность Фейербаха
Окружность по 3-ём точкам C++
Прямая и окружность C++
Нарисовать окружность C++
C++ Нарисовать окружность
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
09.03.2013, 22:20     Окружность #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Windows.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
 
int main()
{
    float x;
    float r;
    cout<<"input radius"<<endl;
    cin>>r;
    system("cls");
    HDC hDC = GetDC( GetConsoleWindow( ) );
    HPEN Pen = CreatePen( PS_SOLID, 2, RGB(255, 255, 255));
    SelectObject( hDC, Pen );
    MoveToEx( hDC, 0, 100, NULL );
    LineTo( hDC, 200, 100 );
    MoveToEx( hDC, 100, 0, NULL );
    LineTo( hDC, 100, 170 );
    for ( x = -r; x <= r; x += 0.01f ) // O(100,100) - center
    {
        MoveToEx( hDC, r*sin(x)+100,r*cos(x)+100, NULL );
        LineTo( hDC, r*sin(x)+100,r*cos(x)+100 );
     }
     system("pause");
 
}
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
09.03.2013, 22:50  [ТС]     Окружность #3
Спасибо! Только начал работать с графикой, до этого только с консольниками. Скажите, пожалуйста, тип приложения для этого кода какой необходимо применить?

Всё, разобрался!!! Mercy!

Добавлено через 6 минут
Интересно, как можно добавить ноль в перекрестии линий? Х и У по осям. И в точке пересения окружности, например, с Ох значение радиуса?
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
09.03.2013, 22:57     Окружность #4
это и был консольник. на всякий случай тогда добавлю круг на OpenGL (необходимые библиотеки glut.h и glut.dll)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
 
 
GLint Width = 512, Height = 512;
 
 
 
void Display(void)
{
float x=250.0, y=250.0;
float r=50.0; //радиус
int t=50;  //на сколько частей делить круг (сколько треугольников рисовать)
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3ub(255,0,0);
glBegin( GL_TRIANGLE_FAN );
               glVertex2f( x, y );  //центр окружности
               for(int i = 0; i <= t; i++ ) {
                   float a = (float)i / (float)t * 3.1415f * 2.0f;
                   glVertex2f( x-cos( a ) * r, y-sin( a ) * r );
               }
    glEnd();
glFinish();
}
 
void Reshape(GLint w, GLint h)
{
Width = w; Height = h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, w, 0, h, -1.0, 1.0); 
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 
} 
 
void Keyboard( unsigned char key, int x, int y )
{
#define ESCAPE '\033'
if( key == ESCAPE ) exit(0);
}
 
 
main(int argc, char *argv[]) 
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(Width, Height);
glutCreateWindow("Red circle example");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Keyboard);
glutMainLoop();
}
Добавлено через 5 минут
и для окружности функция Display() будет выглядеть так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Display(void)
{
float x=250.0, y=250.0;
float r=50.0; //Г°Г*äèóñ
int t=500;  //
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3ub(255,0,0);
glBegin( GL_POINTS);
 
               for(int i = 0; i <= t; i++ ) {
                   float a = (float)i / (float)t * 3.1415f * 2.0f;
                   glVertex2f( x-cos( a ) * r, y-sin( a ) * r );
               }
    glEnd();
glFinish();
}
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
09.03.2013, 22:58  [ТС]     Окружность #5
Мда.... учиться учиться... do {учиться учиться} while (TRUE). Совсем завис с этими OpenGL. Где, что и как не понятно вообще. Если взять первый вариант, простой, как можно добавить ноль в перекрестии линий? Х и У по осям. И в точке пересения окружности, например, с Ох значение радиуса?
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
09.03.2013, 23:21     Окружность #6
для консоли 0 в начало координат можно добавить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <Windows.h>
#include <stdlib.h>
#include <math.h>
#include <iostream.h>
 
#define WIDTH 80
#define HEIGHT 22
 
int main()
{
    float x;
    float r;
    int c=150;
    cout<<"input radius"<<endl;
    cin>>r;
    system("cls");
    HDC hDC = GetDC( GetConsoleWindow( ) );
    HPEN Pen = CreatePen( PS_SOLID, 2, RGB(255, 255, 255));
    SelectObject( hDC, Pen );
    MoveToEx( hDC, 0, c, NULL );
    LineTo( hDC, c+200, c );
    MoveToEx( hDC, c, 0, NULL );
    LineTo( hDC, c, c+200 );
    for ( x = -r; x <= r; x += 0.01f ) // O(100,100) - center
    {
        MoveToEx( hDC, r*sin(x)+c,r*cos(x)+c, NULL );
        LineTo( hDC, r*sin(x)+c,r*cos(x)+c );
     }
 
    HANDLE hCon;
    COORD cPos;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    cPos.Y = c/12;
    cPos.X = c/8;
    SetConsoleCursorPosition(hCon, cPos);
    cout << "0" <<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n"<< endl; //символы перехода на новую строку не обязательны. убери и увидишь что будет
 
     system("pause");
 
}
подобным образом можно добавить и подписи к осям. но тогда надо еще работать с масштабом. потому как от размера консоли 80х25 никуда не деться все равно
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
09.03.2013, 23:39  [ТС]     Окружность #7
Спасибо еще раз! Можете посоветовать ресурс или книгу, где граммотно изложена эта начальная тематика?

Добавлено через 11 минут
грамотно... )
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
09.03.2013, 23:41     Окружность #8
oleg@tor1, по поводу рисования в консоли не все так просто как кажется на первый взгляд. достаточно доступно можно прочесть о возможностях библиотеки Windows.h на форуме msdn. а более последовательно попробуйте поискать в Литература C++ из спойлера Level Up и STL.
по поводу OpenGL лично от себя могу посоветовать Д. Херн Компьютерная графика и стандарт OpenGL, Ф. Хилл OpenGL программирование компьютерной графики. или еще в интернете есть уроки http://pmg.org.ru/nehe/index.html
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
10.03.2013, 00:40  [ТС]     Окружность #9
Возник вопрос. После отрисовки круга, если изменить размер консоли или, скажем, прокрутить колесом мышки ввех-вниз, рисунок стирается - почему и как можно сделать его статичным?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 01:04     Окружность
Еще ссылки по теме:

C++ Круг, окружность в С++
C++ Закрасить окружность
Класс окружность C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
10.03.2013, 01:04     Окружность #10
oleg@tor1, по большому счету в консоли это никак не сделать (во всяком случае мне способ неизвестен). причина этого кроется в том, что мы по сути в программе указываем какой пиксель в области консоли каким цветом рисовать. поскольку программа уже отработала, а окно изменилось то ему (окну) негде взять информацию какой пиксель каким цветом рисовать. для перерисовки надо снова вызвать программу.
потому для решения этой проблемы и был разработан OpenGL со своим бесконечным циклом.
C++
1
glutMainLoop();
эта строка зацикливает программу в бесконечный цикл. а эта
C++
1
glutReshapeFunc(Reshape);
отвечаает за то, как обрабатывать событие изменения окна или перекрытия его или сворачивания. закомментируй ее и посмотри что получится при изменении размера окна
Yandex
Объявления
10.03.2013, 01:04     Окружность
Ответ Создать тему
Опции темы

Текущее время: 13:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru