Рисование круга внутри прямоугольника

232
08 января 2018, 10:43

Здравствуйте! Такая проблема, в дочернем классе неправильно подсчитывает площадь между прямоугольником и кругом. `

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
class Rect 
{
public:
    double x0, y0, x1, y1, x2, y2;
        double a();
        double b();
        double Area();
        void Input() 
        {
            cout << "Coordinates x1 = ";
            cin >> x1;
            cout << "Coordinates y1 = ";
            cin >> y1;
            cout << "Coordinates x2 = ";
            cin >> x2;
            cout << "Coordinates y2 = ";
            cin >> y2;
            cout << "\n";
        }
};
double Rect::a()
{
    double a=(x2 - x1);
    return a;
}
double Rect::b()
{
    double b =(y2 - y1);
    return b;
}
double Rect::Area()
{
    double S = a() * b();
    return S;
}
class Circle : public Rect
{
public:
    double r;
    double Area()
    {
        double s = 3.14 * r;
        return s;
    }
    double MidPoint()
    {
        double x0 = a() / 2;
        double y0 = b() / 2;
        if (a() <= b())
            double r = a() / 2;
        else double r = b() / 2;
        return r;
    }

    double Information()
    {
        double S = (x2 - x1) * (y2 - y1);;
        double s = 3.14 * r;
        s = S - s;
        cout << "Area: \n  Area s: " << s << endl;
        return s;
    }
};

void main()
{
HWND handle = FindWindow("ConsoleWindowClass", NULL);
HWND hDC = (HWND)GetDC(handle);
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
Rect A;
A.Input();
if ((A.a() < 0) || (A.b() < 0))
    cout << "The side of the rectangle is entered incorrectly." << "\n";
else
{
    system("cls");
    HWND hWnd = GetConsoleWindow(); 
    HDC hDC = GetDC(hWnd);  
    SelectObject(hDC, GetStockObject(WHITE_PEN)); 
    Circle B;
    B.x0 = A.a()/2;
    B.y0 = A.b()/2;
    B.Information();
    Rectangle(hDC, A.x1, A.y1, A.x2, A.y2);
    SelectObject(hDC, GetStockObject(BLACK_PEN));
    if (A.a() < A.b())
        Ellipse(hDC, A.x1 , A.y1+ (A.x2-A.x1)/2, A.x2 , A.y1+A.x2-A.x1+(A.x2 - A.x1)/ 2);
    else Ellipse(hDC, A.x1+(A.y2 - A.y1)/2, A.y1, A.x1 + A.y2-A.y1+(A.y2 - A.y1)/2, A.y2);
    _getch();
    system("cls");  
    cout << "Click to exit." << "\n";
}
_getch();
}

` Рисует правильно, а подсчет площади нет. Не знаю как исправить. Ищу площадь между кругом и прямоугольником.

Answer 1

В дополнение к формуле площади круга.

Уберите double перед r в MidPoint. Вы декларируете локальную переменную, которая перекрывает член класса.

double MidPoint()
{
    double x0 = a() / 2;
    double y0 = b() / 2;
    if (a() <= b())
      r = a() / 2;
    else 
      r = b() / 2;
    return r;
}

Наследование круга от прямоугольника - это чистый дзэн.

Answer 2

В классе Circle в методах

double Area()
{
    double s = 3.14 * r;
    return s;
}

и

double Information()
{
    double S = (x2 - x1) * (y2 - y1);;
    double s = 3.14 * r;
    s = S - s;
    cout << "Area: \n  Area s: " << s << endl;
    return s;
}

ошибка - в обоих нужно изменить

    double s = 3.14 * r;

на

    double s = 3.14 * r * r;

Между прочим, метод

double MidPoint()
{
    double x0 = a() / 2;
    double y0 = b() / 2;
    if (a() <= b())
        double r = a() / 2;
    else double r = b() / 2;
    return r;
}

нужно перенести до класса Rect, и методы

double Rect::a()
{
    double a=(x2 - x1);
    return a;
}

и

double Rect::b()
{
    double b =(y2 - y1);
    return b;
}

исправить, чтобы они возвращали абсолютные величины - например так:

double Rect::a()
{
    return (x2 - x1) > 0 ? (x2 - x1) : (x1 - x2);
}
double Rect::b()
{
    return (y2 - y1) > 0 ? (y2 - y1) : (y1 - y2);
}
READ ALSO
Пролаги при старте программы из-за сети (qt)

Пролаги при старте программы из-за сети (qt)

При старте приложения в 80% случаев происходит лаг на 5-10 секунд если в приложении используется сеть (QNetworkAccessManager)

201
Нужен ли delete[] при использовании new c умным указателем типа auto

Нужен ли delete[] при использовании new c умным указателем типа auto

Вопрос касается C++11, использования auto в подобной структуре:

219
Класс однонаправленное кольцо - C++

Класс однонаправленное кольцо - C++

Разработать класс реализующий список (однонаправленное кольцо)Элемент списка содержит информацию о товаре на складе фирмы

279
Как сделать перегрузку операторов

Как сделать перегрузку операторов

Реально ли для объектов этого класса использовать перегрузку оператора + (суммы?) и как это сделать? и имеет ли смысл?

223