Помогите написать функцию

Дано задание:«В файле заданы координаты радиусов кругов. Вывести круги на экран. Круги которые пересекаются выделить отдельным цветом. Другим цветом выделить те круги, площадь которых больше средней площади самой большой группы кругов, которые пересекаются.»

Помогите написать функцию которая находит номера групп кругов которые пересекаются.
Программа поделена на:

1). Класс Point

#pragma once

class Point
{
protected:
    int x, y,r;
public:
        void setPoint(int x, int y,int r);
        void setPoint(Point p);
    int getX(void);
int getY(void);
int getR(void);
};

class Circle : public Point
{
public:
void setCoordinates(int x1, int y1, int r1);
void setCoordinates(Point p1);
void drawCircle(CPaintDC &dc);
void drawColorCircle(CPaintDC &dc);
};
`

2). Point.cpp

#include "StdAfx.h"
#include "Point.h"


void Point::setPoint(int x, int y,int r)
{
    this->x = x;
    this->y = y;
    this->r = r;
}

void Point::setPoint(Point p)
{
    x = p.x;
    y = p.y;
    r = p.r;
}

int Point::getX(void)
{
    return x;
}

int Point::getY(void)
{
    return y;
}

int Point::getR(void)
{
    return r;
}

void Circle::setCoordinates(int x1, int y1, int r1)
{
    this->x = x1;
    this->y = y1;
    this->r = r1;
}

void Circle::setCoordinates(Point p1)
{
    x = p1.getX();
    y = p1.getY();
    r = p1.getR();
}

void Circle::drawCircle(CPaintDC &dc)
{
    CPen MyPen(PS_SOLID, 1, RGB(0, 0, 0));
    dc.SelectObject(MyPen);
    dc.Arc((this->x) - (this->r), (this->y) + (this->r), (this->x) + (this->r), (this->y) - (this->r), 0, 0, 0, 0);
}

void Circle::drawColorCircle(CPaintDC &dc)
{
    CPen MyPen(PS_SOLID, 1, RGB(255, 0, 0));
    dc.SelectObject(MyPen);
    dc.Arc((this->x) - (this->r), (this->y) + (this->r), (this->x) + (this->r), (this->y) - (this->r), 0, 0, 0, 0);
}

3). KursovaDlg.cpp

// KursovaDlg.cpp : файл реализации
//

#include "stdafx.h"
#include "MFCApplication5.h"
#include "KursovaDlg.h"
#include "afxdialogex.h"
#include "Point.h"
#include <afxwin.h>
#include <math.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include<conio.h>
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Диалоговое окно CAboutDlg используется для описания сведений о приложении

class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();

// Данные диалогового окна
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV

// Реализация
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// диалоговое окно KursovaDlg



KursovaDlg::KursovaDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(KursovaDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void KursovaDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(KursovaDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_COMMAND(ID_32772, &KursovaDlg::EditFile)
    ON_COMMAND(ID_32771, &KursovaDlg::OpenFile)
    ON_COMMAND(ID_32774, &KursovaDlg::On32774)
    ON_COMMAND(ID_32775, &KursovaDlg::Exit)
    ON_COMMAND(ID_32773, &KursovaDlg::Run)
END_MESSAGE_MAP()


// обработчики сообщений KursovaDlg

BOOL KursovaDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Добавление пункта "О программе..." в системное меню.

    // IDM_ABOUTBOX должен быть в пределах системной команды.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Задает значок для этого диалогового окна.  Среда делает это автоматически,
    //  если главное окно приложения не является диалоговым
    SetIcon(m_hIcon, TRUE);         // Крупный значок
    SetIcon(m_hIcon, FALSE);        // Мелкий значок

    // TODO: добавьте дополнительную инициализацию
    ShowWindow(SW_MAXIMIZE);//на весь экран
    return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

void KursovaDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок.  Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей областью.

//считываем точки
int read_values(int a, int b)
{
    ifstream file("B://Point.dat");
    int mas[100][4] = { 0 };
    int i = 0;
    int j = 0;
    int count = 0;
    if (!file != '\n')
    {
        do
        {
            // пробуем считать число
            if (file >> mas[j][i])
            {
                // если считали число
                cin >> mas[j][i];
                i++;
            }
            else
            {
                // если считали не число, очищаем ошибки
                file.clear();
                // пропускаем символы до следующего пробела
                file.ignore(1, ' ');
            }
        } while (!file.eof());
    }
    else
    {
        j++;
    }
    i = 0;
    j = 0;

    file.close();
    return mas[a][b];
}

//количество кругов
int size_point()
{
    int c;
    int cnt = 0;
    FILE*f;
    fopen_s(&f,"B://Point.dat", "r");
    if (f == NULL) 
    {
        cout << "Sorry file not found";
    }
    while ((c = getc(f)) != EOF)
    if (c == '=')
    {
        cnt++;
    }
    cnt = cnt / 3;
    fclose(f);
    return cnt;
}

//Площадь
float Squar(int k, int l)
{
    float **A = new float*[size_point()]; // строк в массиве
    for (int i = 0; i < size_point(); i++)
        A[i] = new float[4]; // столбцов
    for (int i = 0; i<size_point(); i++)
    {
        A[i][0] = read_values(i, 1);
        A[i][1] = read_values(i, 2);
        A[i][2] = read_values(i, 3);
        A[i][3] = 3.14*(pow(read_values(i, 3),2));
    }

    return A[k][l];
}

//МиниПлощадь
float minSquar(int h)
{
    float mas[3];
    float minS = Squar(0, 3);
    for (int i = 1; i < size_point(); i++)
    {
        if (minS>Squar(i, 3))
        {
            mas[0] = Squar(i, 0);
            mas[1] = Squar(i, 1);
            mas[2] = Squar(i, 2);
        }
        else
        {
            mas[0] = Squar(0, 0);
            mas[1] = Squar(0, 1);
            mas[2] = Squar(0, 2);
            continue;
        }
    }
    return mas[h];
}

//Пересечение кругов
int intersection_circles(int i)
{
    int count = 0;
    for (int j = 0; j<size_point(); j++)
    {
        if (sqrt(pow((read_values(i, 1) - read_values(j, 1)), 2) + pow((read_values(i, 2) - read_values(j, 1)), 2))<(abs(read_values(i, 3) + read_values(j, 3))))
        {
            count++;
        }
    }
    return count - 1;
    count = 0;
}

//Номера кругов которые пересикаються с кругом і
int circles_that_intersect(int i, int j)
{
    int **A = new int*[size_point()]; // строк в массиве
    for (int i = 0; i < size_point(); i++)
    {
        A[i] = new int[size_point()];
    }
    for (int i = 0; i < size_point(); i++)
    {
        for (int j = 0; j<size_point(); j++)
        {
            if (sqrt(pow((read_values(i, 1) - read_values(j, 1)), 2) + pow((read_values(i, 2) - read_values(j, 1)), 2))<(abs(read_values(i, 3) + read_values(j, 3))))
            {
                A[i][j] = j;
            }
        }
    }
    return A[i][j];
}

void KursovaDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // контекст устройства для рисования

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Выравнивание значка по центру клиентского прямоугольника
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Нарисуйте значок
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        Point *p;
        p = new Point[size_point()];
        Circle *C;
        C = new Circle[size_point()];
        CPaintDC dc(this);
        for (int i = 0; i < size_point(); i++)
        {
            int x = read_values(i, 1), y = read_values(i, 2), r = read_values(i, 3);
            p[i].setPoint(x,y,r);
            C[i].setCoordinates(p[i]);
            if (intersection_circles(i)> 0)
            {
                C[i].drawColorCircle(dc);
            }
            else
            {
                C[i].drawCircle(dc);
            }
            CDialogEx::OnPaint();
        }
    }
}

// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR KursovaDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void KursovaDlg::EditFile()
{
    system("notepad.exe C://Point.dat");
}


void KursovaDlg::OpenFile()
{
    system("explorer C:\\");
}


void KursovaDlg::On32774()
{
    MessageBox(L"Ця програма виводить на екран кола,координати яких було задано у файлі. Кола що перетинаються виділяються червоним кольром. Синім кольором виділяються ті кола, площа яких більша середньої площі найбільшої групи кіл що перетинаються.",L"Про програму",0);
}


void KursovaDlg::Exit()
{
    CDialogEx::OnOK();
}



void KursovaDlg::Run()
{

}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.