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

Описать переменную круг, в которой содержатся все дан* ные для построения круга в декартовой системе координат - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дан массив A(N). Сформулировать массив B(M), элементами которого являются большие из двух рядом стоящих в массиве A чисел http://www.cyberforum.ru/cpp-beginners/thread993595.html
Нужен код программы. Помогите даме пожалуйста.
C++ Информационная система учета рабочего времени Информационная система учета рабочего времени. Система учета рабочего времени позволяет руководителям выдавать задания и отслеживать ход их выполнения, а исполнителям вести учет рабочего времени,... http://www.cyberforum.ru/cpp-beginners/thread993588.html
C++ Иерархия классов для будущей игры
Здравствуйте. До этого писал простенькие игрушки вроде карточных игр, но захотелось написать что то более сложное: аркаду типу марио или рпгшку. Ну для этого уже нужно более продуманую архитектуру....
C++ Структуры. Решение кода программы
Пожалуйста, помогите написать код к программе. -Задача- В столовой предлагаются N комплексных обедов из Q блюд. Известна стоимость и калорийность каждого блюда. Сколько стоит самый дешевый и самый...
C++ На что программа?точнее какие у нее условия? http://www.cyberforum.ru/cpp-beginners/thread993561.html
#include <iostream> #include <cmath> using namespace std; float fun (float x) {return sqrt(x)+x;} int main () { setlocale (LC_ALL,"Russian"); float a,b=13, c=21,d;cout<<"a="; cin>>a;
C++ Задача коммивояжёра Написать программу для решения задачи коммивояжёра с помощью алгоритма Литтла. Интерфейс должен позволять вводить количество городов (вершин графа) и значения элементов матрицы расстояний между... подробнее

Показать сообщение отдельно
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
31.10.2013, 16:48
Полное решение. Изучайте.
Кликните здесь для просмотра всего текста
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include<iostream>
#include<cmath>
/**
 *  /Структура вектор
 */
struct vect
{
    double x0;
    double y0;
    vect(): x0(0), y0(0)
    {}
    vect(double x, double y): x0(x), y0(y)
    {}
};
 
/**
 *  /Структура круг
 */
struct krise
{
    vect center;
    double Radius;
    krise(): center(), Radius(0)
    {}
    krise(double x, double y, double R): center(x , y), Radius(R)
    {}
};
 
/**
 *  /Перегрузим операции, что бы легче было работать (аля ООП)
 */
vect operator+ (vect v1, vect v2)
{
    return vect(v1.x0 + v2.x0, v1.y0 + v2.y0);
}
vect operator- (vect v1, vect v2)
{
    return vect(v1.x0 - v2.x0, v1.y0 - v2.y0);
}
vect operator/ (vect v1, int number)
{
    return vect(v1.x0 / number, v1.y0 / number);
}
vect operator* (vect v1, double number)
{
    return vect(v1.x0 * number, v1.y0 * number);
}
 
/**
 *  /Вычисление модуля вектора
 */
float AbsVector(const vect& v);
 
/**
 *  /Функция возвращает огибающий круг
 */
krise Find(const krise&, const krise&);
 
/**
 *  /Функция возвращает верхнюю точку пересечения окружностей
 */
vect PointOne(const krise&, const krise&);
 
/**
 *  /Функция возвращает нижнюю точку пересечения окружностей
 */
vect PointTwo(const krise&, const krise&);
 
int main(int argc, char* argv[])
{
    system("chcp 1251>0");
 
    krise kris1(0, 0, 2);
    krise kris2(1, 0, 2);
    krise kr;
    /**
     *  /Выводим огибающий круг
     */
    kr = Find (kris1, kris2);
    std::cout << "Огибающий круг:";
    std::cout << "(" << kr.center.x0 << ", " << kr.center.y0 << ", " << kr.Radius << ")" << std::endl;
 
    vect peres;
 
    /**
     *  /Выводим точки пересечения
     */
    peres = PointOne(kris1, kris2);
    std::cout << "Первая точка пересечения:";
    std::cout << "(" << peres.x0 << ", " << peres.y0 << ")" << std::endl;
 
    peres = PointTwo(kris1, kris2);
    std::cout << "Вторая точка пересечения:";
    std::cout << "(" << peres.x0 << ", " << peres.y0 << ")" << std::endl;
 
    return 0;
}
krise Find(const krise& kr1, const krise& kr2)
{
    /**
    *  /Если один круг лежит внутри другого возвращаем внешний круг
    */
    if((kr1.Radius + AbsVector(kr1.center - kr2.center)) < kr2.Radius)
        return kr2;
    else if ((kr2.Radius + AbsVector(kr1.center - kr2.center)) < kr1.Radius)
        return kr1;
    /**
    *  /Ищем огибающий круг. Знание линейной алгебры поможет вам понять код
    */
    krise temp;
    temp.Radius = (kr1.Radius + kr2.Radius + AbsVector(kr1.center - kr2.center)) / 2;
    temp.center = (kr1.center + kr2.center) / 2 + vect((kr1.center.x0 - kr2.center.x0) / AbsVector(kr1.center - kr2.center), (kr1.center.y0 - kr2.center.y0) / AbsVector(kr1.center - kr2.center)) * (kr2.Radius - kr1.Radius);
    return temp;
}
float AbsVector(const vect& v)
{
    return sqrt(pow(v.x0, 2) + pow(v.y0, 2));
}
 
vect PointOne(const krise& kr1, const krise& kr2)
{
    double angle1, angle2;
    angle1 = acos((-pow(kr2.Radius, 2.0) + pow(kr1.Radius, 2.0) + pow(AbsVector(kr1.center - kr2.center), 2.0)) / ( 2 * kr1.Radius * AbsVector(kr1.center - kr2.center)));
    angle2 = atan( abs(kr2.Radius - kr1.Radius) / AbsVector(kr1.center - kr2.center));
    vect temp;
    temp.x0 = kr1.center.x0 + kr1.Radius * cos(angle1 + angle2);
    temp.y0 = kr1.center.y0 + kr1.Radius * sin(angle1 + angle2);
    return temp;
}
 
vect PointTwo(const krise& kr1, const krise& kr2)
{
    double angle1, angle2;
    angle1 = acos((-pow(kr2.Radius, 2.0) + pow(kr1.Radius, 2.0) + pow(AbsVector(kr1.center - kr2.center), 2.0)) / ( 2 * kr1.Radius * AbsVector(kr1.center - kr2.center)));
    angle2 = atan( abs(kr2.Radius - kr1.Radius) / AbsVector(kr1.center - kr2.center));
    vect temp;
    temp.x0 = kr1.center.x0 + kr1.Radius * cos(angle2 - angle1);
    temp.y0 = kr1.center.y0 + kr1.Radius * sin(angle2 - angle1);
    return temp;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru