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

Класс "окружность" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
Bukich
6 / 6 / 1
Регистрация: 25.04.2012
Сообщений: 42
14.06.2012, 00:14     Класс "окружность" #1
Написать программу работы с окружностями. Окружность является объектом класса. Память под окружность должна выделяться динамически (с помощью new). Должны быть определены деструктор и следующие конструкторы:

· Конструктор по умолчанию создает нулевую окружность;

· Конструктор, задающий окружность по центру и радиусу;

· Копирующий конструктор.

Необходимо написать функцию-член, прорисовывающую окружность и перегрузить оператор присваивания.

Добавлено через 8 часов 54 минуты
Неужто это реально так сложно? Форум перекопал - так про окружности меньше всего отвечают или темы остаются без ответа вовсе. Очень надеюсь что задачка разрешится...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hrundel
25 / 25 / 2
Регистрация: 27.05.2012
Сообщений: 114
14.06.2012, 18:08     Класс "окружность" #2
Уравнение

x^2 + y^2 + ax + by + c = 0

задает либо окружность, либо точку, либо пустое множество.

Чтобы ответить на вопрос, какой именно случай имеет место для данного конкретного уравнения, надо выделить полные квадраты по x и y.

например, уравнение x^2 + y^2 - 4x + 2y = 0 можно преобразовать так:

(x^2 - 4x + 4) + ( y^2 + 2y + 1) - 5 = 0

(x - 2)^2 + (y + 1)^2 = 5.

Значит получаем что-то типа:

(x - a)^2 + (y + b)^2 = с^2.

a и b центр окружности a = x координата b = y координата
с^2 = радиус окружности в квадрате.

x, y координаты точки лежащей на окружности.

C++
1
2
3
4
float xPoint, yPoint, xCenter, yCenter, radius;
 
radius = (xPoint - xCenter)*(xPoint - xCenter) + (yPoint + yCenter)*(yPoint + yCenter);
radius = sqrt(radius);
Добавлено через 17 часов 21 минуту
Это просто набросок. Но все же лучше, чем вообще ничего! (:

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
#include <math.h>
 
class Cycle {
 
private: 
        float xPoint, yPoint, xCenter, yCenter, radius;
 
public:
 
    Cycle()
        {
            PlotCycle(0, 0, 0);
        }
 
    ~Cycle(){}
 
        float PlotCycle(float diametr, float xC, float yC)
        {
            xCenter = xC;
            yCenter = yC;
 
            for(int x = diametr*(-1)+xCenter ; x <= diametr+xCenter; x++) 
                 for(int y = diametr*(-1)+yCenter ; y <= diametr+yCenter; y++)
                       draw((xPoint - xCenter)*(xPoint - xCenter) + (yPoint + yCenter)*(yPoint + yCenter));
                       // функция draw не определена !!! Сам пиши ;)
        }
 
        float GetRadius()
        {
            radius = (xPoint - xCenter)*(xPoint - xCenter) + (yPoint + yCenter)*(yPoint + yCenter);
            return sqrt(radius);
        }
}
Bukich
6 / 6 / 1
Регистрация: 25.04.2012
Сообщений: 42
14.06.2012, 19:14  [ТС]     Класс "окружность" #3
Ну хотя бы это. Уже неплохо! Респект! Буду думать пока... Надеюсь тут тоже не будут забывать...
Hrundel
25 / 25 / 2
Регистрация: 27.05.2012
Сообщений: 114
14.06.2012, 22:53     Класс "окружность" #4
Существует еще алгоритм Брезенхэма для рисования окружностей. По методу построения он похож на рисование линии. В этом алгоритме строится дуга окружности для первого квадранта, а координаты точек окружности для остальных квадрантов получаются симметрично. На каждом шаге алгоритма рассматриваются три пикселя, и из них выбирается наиболее подходящий путём сравнения расстояний от центра до выбранного пикселя с радиусом окружности.

Эта функция полностью работоспособная:

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
void drawCircle(int x0, int y0, int radius) {
 
        int x = 0;
        int y = radius;
        int delta = 2 - 2 * radius;
        int error = 0;
 
        while(y >= 0) 
        {
                setPixel(x0 + x, y0 + y);
                setPixel(x0 + x, y0 - y);
                setPixel(x0 - x, y0 + y);
                setPixel(x0 - x, y0 - y);
                error = 2 * (delta + y) - 1;
 
                if(delta < 0 && error <= 0) 
                {
                        ++x;
                        delta += 2 * x + 1;
                        continue;
                }
 
                error = 2 * (delta - x) - 1;
 
                if(delta > 0 && error > 0) 
                {
                        --y;
                        delta += 1 - 2 * y;
                        continue;
                }
 
                ++x;
 
                delta += 2 * (x - y);
 
                --y;
        }
}
При желании ее можно чуть-чуть упростить. Но лучше не стоит. Алгоритм очень оптимальный.

Добавлено через 2 часа 42 минуты
Кстати, когда класс напишешь, кинь мне потестировать. Можно в личку.
Bukich
6 / 6 / 1
Регистрация: 25.04.2012
Сообщений: 42
14.06.2012, 22:55  [ТС]     Класс "окружность" #5
Хорошо. Думаю завтра на работе будет время позаниматься с классом. Спасибо!
katerinaа
80 / 13 / 0
Регистрация: 19.03.2012
Сообщений: 258
Записей в блоге: 1
08.09.2013, 20:03     Класс "окружность" #6
Bukich, очень нужно решение этой задачки по которой вы общались на сайте по классу "Окружность" у меня тоже 21 вариант)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2013, 12:18     Класс "окружность"
Еще ссылки по теме:

Класс "Матрица". Перегрузка оператора "минус" C++
C++ Создать класс "прямоугольник" и перегрузить операцию отношения "равно"
C++ Структура "Книга", класс "Библиотека"

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

Или воспользуйтесь поиском по форуму:
Zebr00
Сообщений: n/a
20.09.2013, 12:18     Класс "окружность" #7
katerinaа, подскажите у вас в итоге появилось решение этого варианта мне он тоже очень нужен спасибо )
Yandex
Объявления
20.09.2013, 12:18     Класс "окружность"
Ответ Создать тему
Опции темы

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