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

Определить кольцо с центром в начале координат, которое содержит все точки - C++

Восстановить пароль Регистрация
 
Vladok111
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 78
30.11.2012, 21:53     Определить кольцо с центром в начале координат, которое содержит все точки #1
В одномерном массиве с четным количеством элементов (2N) находятся координа-ты N точек плоскости. Они располагаются в следующем порядке: x1, y1, х2, у2, х3, у3, и т.д. Определить кольцо с центром в начале координат, которое содержит все точки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 21:53     Определить кольцо с центром в начале координат, которое содержит все точки
Посмотрите здесь:

C++ Посчитать к-во точек, попавших в круг с радиусом R и с центром в начале координат
C++ Определить номер точки, через которую проходит окружность с центром в начале координат, внутрь которой попадают все оставшиеся точки.
C++ Определить кольцо с центром в начале координат, которое содержит все точки.
Определить, сколько точек с целочисленными координатами попадают в круг заданного радиуса с центром в начале координат C++
Определить минимальный радиус окружности с центром в начале координат...(массив) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
01.12.2012, 11:22     Определить кольцо с центром в начале координат, которое содержит все точки #2
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
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <vector>
 
double getDistance(double x1, double y1, double x2, double y2) {
  return std::sqrt(std::pow(x1 - x2, 2.) + std::pow(y1 - y2, 2.));
}
 
double getRandom() {
  return ((rand() % 20000) - 10000) / 1000.0;
}
 
int main(int argc, char *argv[]) {
  setlocale(LC_ALL,"rus");
  srand(time(0));
  
  int numberOfPoints = 10 + rand() % 5;
  
  std::vector<double> coordinates(numberOfPoints * 2);
  for (int i = 0; i < numberOfPoints; ++i)
    std::cout << "[" << (coordinates[i * 2] = getRandom()) << ":" <<
      (coordinates[i * 2 + 1] = getRandom())  << "], ";
  
  
  double minRadius = getDistance(0, 0, coordinates[0], coordinates[1]);
  double maxRadius = minRadius;
  for(int i = 1; i < numberOfPoints; ++i) {
    double thisDistance = getDistance(0, 0, coordinates[i * 2], coordinates[i * 2 + 1]);
    if (thisDistance > maxRadius)
      maxRadius = thisDistance;
    if (thisDistance < minRadius)
      minRadius = thisDistance;
  }
 
  std::cout << "inner radius: " << minRadius << ", outer radius: " << maxRadius << std::endl;
  
  std::cin.get();
  return EXIT_SUCCESS;
}
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
10.03.2013, 04:23     Определить кольцо с центром в начале координат, которое содержит все точки #3
Можно так:

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
#include <Windows.h>// Необходим для отрисовки. Фукционально включает аналоги graphics.h - C++ Builder.
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <array>
#define WIDTH  80   // Используем макрос для замены показателей на цифровые зн-я.
#define HEIGHT 22
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    double t;
    double r;
    int c=190;  
    const int size = 5; // Константа для размера массива.   
    double    x, y;// Координатные переменные.      
    double    dist;// Буфер для временного значения МАКС и МИН.
    int       jp;  // Переменная для цикла и вычисления Х и У.
    double    MinD, MaxD;// Максимум и минимум для окружности.
 
    srand(static_cast <double>(time(NULL)));  // Генерируем псевдо-случайные числа.
 
    double    XY [2*size]={rand()%70+1.,rand()%65+1.,rand()%80+1.,rand()%77+1.,rand()%20+1.,rand()%40+1.}; // Заполняем массив случайными координатами точек.
 
    x = XY[0];      // Указываем градацию эл-тов массива: х,у, х,у... .
    y = XY[1];
 
    MinD = sqrt (x*x + y*y);// Находим минимум.
    MaxD=MinD;          // Т.к. нам достаточно одного максимума для отрисовки круга, зная центр.
 
    for (jp = 1; jp < size; jp++)   // Находим необходимый максимум.
    {
        x = XY [jp*2];
        y = XY [jp*2+1];
 
        dist = sqrt (x*x + y*y);
 
        if(dist < MinD)
        {MinD = dist;}
        if(dist > MaxD)
        {MaxD = dist;}
    }
 
    cout << endl << endl << endl << endl << "Координаты точек:" << endl;
 
    for (unsigned int z = 0; z < size; ++z)
    {
        cout << XY[z] << ':' << XY[z+1] << ' '; 
    }
 
    // Добавим красок! ;)
    HANDLE hSTDOut = GetStdHandle(STD_OUTPUT_HANDLE); // HANDLE - дискриптор. Т.е. номер потока для буфера консоли в системе.
    CONSOLE_SCREEN_BUFFER_INFO SCRN_INFO;             // Объявляем экземплр структуры CONSOLE_SCREEN_BUFFER_INFO. Содержит информацию о буфере экрана консоли
    SetConsoleTextAttribute(hSTDOut,FOREGROUND_GREEN | FOREGROUND_GREEN | FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Играем с цветом RGB. Делаем зелёный текст.
 
 
    cout << endl << "Кольцо, построенное на плоскости и включающее все точки массива."<<' ';
    cout << "Радиус:" << MaxD << endl;
    r = MaxD; // Радиус инициализируем найденным максимумом.
 
    HDC hDC = GetDC( GetConsoleWindow( ) ); // Извлекает дескриптор дисплейного контекста устройства (DC) для рабочей области заданного окна
    HPEN Pen = CreatePen( PS_SOLID, 2, RGB(255, 255, 255)); // Создаём "Ручку". Инструмент для рисования.
 
    SelectObject( hDC, Pen );       // Функция  SelectObject выбирает объект в заданный контекст устройства (DC).
    MoveToEx( hDC, 10, c, NULL );   // Двигаемся на позицию.
    LineTo( hDC, c + 300, c );      // Чертим линию. Ось Ох.
    MoveToEx( hDC, c, 90, NULL );
    LineTo( hDC, c, c + 300 );
 
    for ( t = -r; t <= r; t += 1) // Цифра задаёт шаг в прорисовке окружности. Можно эксперементировать. Float задаётся через "."!!!
    {
        MoveToEx( hDC, r*sin(t)+c, r*cos(t)+c, NULL ); // Двигаемся на позицию NULL (0).
        LineTo  ( hDC, r*sin(t)+c, r*cos(t)+c );       // Чертим круг.
    }
 
    HANDLE hCon;
    COORD cPos; // Экземпляр. Структура COORD определяет координаты символьной клетки в консоли.
    hCon = GetStdHandle(STD_OUTPUT_HANDLE); // Функция GetStdHandle извлекает дескриптор для стандартного ввода данных, стандартного вывода или стандартной ошибки устройства.
    cPos.Y = c/13; // Определяем позицию немного левее от центраю
    cPos.X = c/9;
 
    SetConsoleCursorPosition(hCon, cPos); // Устанавливаем курсор.
    cout << "0" <<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; 
    system("pause");    
 
} // end_main
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.03.2013, 04:49     Определить кольцо с центром в начале координат, которое содержит все точки #4
Цитата Сообщение от oleg@tor1 Посмотреть сообщение
dist = sqrt (x*x + y*y);
чтобы найти максимальный радиус, квадратный корень каждый раз извлекать не оптимально. Достаточно сравнивать квадраты радиусов.
oleg@tor1
 Аватар для oleg@tor1
32 / 17 / 2
Регистрация: 05.09.2011
Сообщений: 152
10.03.2013, 14:42     Определить кольцо с центром в начале координат, которое содержит все точки #5
Т.е. данную строку лучше вынести из цикла - излишняя нагрузка на проц?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.03.2013, 15:31     Определить кольцо с центром в начале координат, которое содержит все точки #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for (jp = 1; jp < size; jp++)   // Находим необходимый максимум.
    {
        x = XY [jp*2];
        y = XY [jp*2+1];
 
        dist = (x*x + y*y);
 
        if(dist < MinD)MinD = dist;
        if(dist > MaxD)MaxD = dist;
    }
MaxD=sqrt(MaxD);
/////...
 
    cout << endl << "Кольцо, построенное на плоскости и включающее все точки массива."<<' ';
    cout << "Радиус:" << MaxD << endl;
Yandex
Объявления
10.03.2013, 15:31     Определить кольцо с центром в начале координат, которое содержит все точки
Ответ Создать тему
Опции темы

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