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

Найти отрезок, лежащий целиком в наибольшем количестве окружностей - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Выяснить есть ли одинаковые числа в двумерном массиве http://www.cyberforum.ru/cpp-beginners/thread1776797.html
Выясните есть ли одинаковые числа в двумерном массиве или же массив содержит только разные. Заранее спасибо.
C++ Сформировать из BMP файла новый, больший в 4 раза Пожалуйста, объясните что и как тут нужно сделать. Использовать только стандартные библиотеки Написать программу, формирующую по исходному BMP файлу новый BMP файл, который в 4 раза больше исходного в результате линейной интерполяции новых внутренних точек. http://www.cyberforum.ru/cpp-beginners/thread1776790.html
C++ Возникает ошибка в программе при вводе нуля
Нажимаю 0 возникает ошибка в программе , хотя компилятор молчит. #include <iostream> using namespace std; struct d; d* head = nullptr; struct d { d * next; double date; void add(double k) { d* newObj = new d;
Дайте задания для тренировки C++
День добрый. Учу C++. Я уверен, что тут есть люди которые с ним отлично знаком и работают. Можете ли вы накидать заданий, возможно из своего опыта, с которыми сами сталкивались, сложность не столь важна, попробую сделать всё ! Сейчас придумываю задания сам себе, но возможно задания от посторонних, опытных людей будут более интересными ! Заранее спасибо за помощь.
C++ Проверить,верно ли, что рекуррентный процесс заданных вычислений завершится http://www.cyberforum.ru/cpp-beginners/thread1776751.html
Рассмотрим некоторое натуральное число n (n>1).Если оно четно , то разделим его на 2, иначе умножим на 3 и прибавим 1.Если полученное число не равно 1, то повторяется то же действие и т.д.пока не получится 1. До настоящего времени неизвестно,завершится ли этот процесс для любого n>1. Даны натуральные числа k,L,m (1<k<=L).Проверить,верно ли , что для любого натурального n из диапазона от k до L...
C++ Конструктор инициализации Как передать параметры конструктору, если объект класса определен как указатель? #include <iostream> using namespace std; class CL подробнее

Показать сообщение отдельно
ura_111
13 / 15 / 5
Регистрация: 21.05.2016
Сообщений: 48
07.07.2016, 02:26     Найти отрезок, лежащий целиком в наибольшем количестве окружностей
Прежде чем анализировать мою программу познакомится с теорией пересечения прямой и окружности (ведь тебе придется тестировать и в случае необходимости поправлять программу):

Окружность и прямая

Перебор прямых вот так осуществляется:



Результат работа программы:






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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <math.h>
#include <ctime>    // Для случайно генерирования чисел
#include <iomanip>  // Для случайно генерирования чисел
using namespace std;
 
bool PERESECHENIE(int x1, int y1, int x2, int y2, int x0, int y0, double r);
 
struct POINT
{
    int x;
    int y;
};
 
struct OKR
{
    int x;
    int y;
    double r;
};
 
int main()
{
    int N_okr, N_T;
    int S, max = 0;
 
    cout << "Vvetite kol-vo okruchnostei: ";
    cin >> N_okr;
    cout << "Vvetite kol-vo elementov T: ";
    cin >> N_T;
 
    OKR *okr = new OKR[N_okr];  // Выделение памяти под массив окружностей
    POINT *T = new POINT[N_T];  // Выделение памяти под массив точек Т
 
    srand(time(0));
 
    cout << "\nOkruchnosti:";
    cout << "\n  X   Y   R\n";
    for (int i = 0; i < N_okr; i++)  // Заполнение случайно массив окружностей (у нас поле 100*100)
    {
        okr[i].x = rand() % 100;
        okr[i].y = rand() % 100;
        okr[i].r = rand() % 100;    
        cout << setw(3) << okr[i].x << setw(4) << okr[i].y << setw(4) << okr[i].r << endl;
    }
 
    cout << "\nMassiv T:";
    cout << "\n  X   Y\n";
    for (int i = 0; i < N_T; i++)  // Заполнение случайно массив Т (у нас поле 100*100)
    {
        T[i].x = rand() % 100;
        T[i].y = rand() % 100;
        cout << setw(3) << T[i].x << setw(4) << T[i].y << endl;
    }
    
    cout << "\nKol-vo peresechenui:";
    cout << "\n Tochka1   Tochka2  Kol peresech\n";
    for (int i = 0; i < N_T; i++)          // Индекс массива T[i] для 1-й точки 
    {
        for (int j = i + 1; j < N_T; j++)  // Индекс массива T[i] для 2-й точки 
        {
            S = 0;
            for (int k = 0; k < N_okr; k++) // Перебор всех окружностей 
            {
                if (PERESECHENIE(T[i].x, T[i].y, T[j].x, T[j].x, okr[k].x, okr[k].y, okr[k].r) == true)
                {
                    S = S + 1;
                }               
            }
            cout << setw(2) << "(" << setw(2) << T[i].x << "," << setw(2) << T[i].y << ")" << setw(4) << "(" << setw(2) << T[j].x << "," << setw(2) << T[j].y << ") " << setw(7) << S << endl;
            if (max < S)
            {
                max = S;
            }
        }
    }
    
    cout << "\nMax peresechenui: " << max << endl;
    
    cout << "\n Tochka1   Tochka2  Kol peresech\n";
    for (int i = 0; i < N_T; i++)          // Индекс массива T[i] для 1-й точки 
    {
        for (int j = i + 1; j < N_T; j++)  // Индекс массива T[i] для 2-й точки 
        {
            S = 0;
            for (int k = 0; k < N_okr; k++) // Перебор всех окружностей 
            {
                if (PERESECHENIE(T[i].x, T[i].y, T[j].x, T[j].x, okr[k].x, okr[k].y, okr[k].r) == true)
                {
                    S = S + 1;
                }
            }
            if (S == max)
            {
                cout << setw(2) << "(" << setw(2) << T[i].x << "," << setw(2) << T[i].y << ")" << setw(4) << "(" << setw(2) << T[j].x << "," << setw(2) << T[j].y << ") " << setw(7) << S << endl;
            }
        }
    }
 
    cout << "\n";
    delete[] okr;
    delete[] T;
    system("pause");
    return 0;
}
 
bool PERESECHENIE(int x1, int y1, int x2, int y2, int x0, int y0, double r)
{
    double k = (y2 - y1) / (x2 - x1);
    double b = (y2*x1 - y1*x2) / (x1 - x2);
    b += (k*x0 - y0);
    double D = pow(2 * b*k, 2) + 4 * (1 + pow(k, 2))*(pow(r, 2) - pow(b, 2));
    if (0 <= D) // Если дискременант положителен, то прямая пересекается с окружностью
    {
        return true;
    }
    return false;
}

Протестируй программу, "сравни с расчетом в ручную".

Добавлено через 25 минут
А и ещё. Посмотри на текст программы и скажи, что Вы учили, что нет. Может нужно упростить или наоборот усложнить программу.
 
Текущее время: 21:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru