Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 3
1

Рисунок единичной окружности в заданной метрике

02.08.2018, 21:43. Показов 1945. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В задании требуется написать функцию нахождения расстояния между двумя точками на плоскости в различных метриках которая задается числом n в степенях формулы эвклидовой метрики |x - y| =(|x1 - y1|n + |x2 - y2|n)1/n.
И реализовать функцию, которая будет рисовать единичные окружности с центром в начале координат, но в заданной метрике, т.е. функции на вход задаете параметр n (число которое стоит в формуле метрики), на выходе получаете рисунок.
В поиске нашел похожий пример с установкой размера радиуса, но как нарисовать единичную окружность в нужной метрике, не ясно. Может кто в теме?

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
#include <iostream>
#include <math.h>
#include <Windows.h>
 
//Круг с центром в начале координат
 
#define WIDTH 80
#define HEIGHT 22
 
using namespace std;
 
int main()
{
    float x;
    float r;
    int c = 150;
    cout << "input radius" << endl;
    cin >> r;
    system("cls");
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN Pen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
    SelectObject(hDC, Pen);
    MoveToEx(hDC, 0, c, NULL);
    LineTo(hDC, c + 200, c);
    MoveToEx(hDC, c, 0, NULL);
    LineTo(hDC, c, c + 200);
    for (x = -r; x <= r; x += 0.01f) // O(100,100) - center
    {
        MoveToEx(hDC, r*sin(x) + c, r*cos(x) + c, NULL);
        LineTo(hDC, r*sin(x) + c, r*cos(x) + c);
    }
 
    HANDLE hCon;
    COORD cPos;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    cPos.Y = c / 12;
    cPos.X = c / 8;
    SetConsoleCursorPosition(hCon, cPos);
    cout << "0" << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n" << endl; 
    system("pause");
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2018, 21:43
Ответы с готовыми решениями:

Найти радиус окружности и площадь круга по заданной длине окружности
Дана длина L окружности. Найти ее радиус R и площадь S круга, ограниченного этой окружностью,...

Определить, принадлежит ли точка с координатами (x, y) единичной окружности
Всем привет. помогите понять задачу. задача 1 Функции: Описать логическую функцию Yes(x,y),...

Логические выражения. Точка принадлежит области, ограниченной левой частью единичной окружности и осью у
Написать на языке Паскаль логическое выражение, принимающее значение истина или ложь при выполнении...

Рисунок окружности
Подскажите как нарисовать окружность по заданной формуле: A*x^2 + A*y^2 + B*x + C*y +D = 0

5
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
03.08.2018, 08:16 2
https://en.wikipedia.org/wiki/Euclidean_distance
ничего подобного там не сказано. С чего ты взял, что степени и корни должны быть n? Во всех формулах даже для n-мерных пространств они квадратные.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
03.08.2018, 08:31 3
Думаю, Вам надо нарисовать семейство точек, для которых
(|x1 - y1|n + |x2 - y2|n)1/n=1
Пусть x1=x2=0 - центр фигуры
Тогда надо найти точки
(|y1|n + |y2|n)1/n=1
Возводим в степень n
|y1|n + |y2|n=1
или
|y2|n=1-|y1|n

|y2|=(1-|y1|n)1/n

y2=(+-)(1-|y1|n)1/n

Т.о. в цикле проходим по всем точкам, для которых |y1|<1 и вычисляем по 2 значения y2
0
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 3
03.08.2018, 11:09  [ТС] 4
Kuzia domovenok,
дополнение из текста задания: "...Эвклидова метрика имеет эквивалентные ей метрики, например метрика таксиста, где вместо 2 в степенях стоят 1 и метрика задается другой формулой ||x -y|| = |x1-y1|+|x2-y2|, или 2 можно заменить на 3 ||x -y|| = (|x1-y1|3+|x2-y2|3)1/3, или любое другое натуральное число n..."
zss,
Вы доступно прояснили направление решения, но как результат выводить в рисунок, может задание подразумевает использование win api или С++ Builder?
К сожалению с графикой пока не работал, - темы последних заданий про массивы и шифрование.
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
03.08.2018, 12:20 5
Лучший ответ Сообщение было отмечено Tomas_17 как решение

Решение

Так у Вас все написано.
Цикл уже есть
Только в 29-30 строках используйте x как y1, а y вычисляйте по указанной формуле.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
     double x=-1.,y=0;
     MoveToEx(hDC, r*x + c, r*y + c, NULL); // незачем это делать каждый раз
 
     for (; x <= 1.0; x += 0.01) // верхняя половина
     {
         y=pow(1.-abs(pow(x,n)),1./n);
         LineTo(hDC, r*x + c, r*y + c);
     }
     for (x=1.0; x >= -1.0; x -= 0.01)  // нижняя половина
     {
         y=-pow(1.-abs(pow(x,n)),1./n);
         LineTo(hDC, r*x + c, r*y + c);
     }
1
0 / 0 / 0
Регистрация: 01.08.2018
Сообщений: 3
03.08.2018, 16:03  [ТС] 6
Спасибо, вроде работает. Интересно как параметр метрики влияет на фигуру. Во 2-й степени это обычное уравнение единичной окружности рисует концентрическую фигуру. В 1-й степени рисуется ромб, а в степени 3 и более - фигура стремится к квадрату... Подписал координатные оси, в коде добавил комментарии - может кому пригодится.
Есть небольшая недорисовка фигуры во второй четверти в степени 2 и более - это исправимо?
P.S.
Обработка предельного случая, когда n > + infinite ||x -y|| = max [|x1-y1|, |x2-y2|] - это если n стремится к бесконечности?

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
#include <iostream>
#include <math.h>
#include <Windows.h>
 
//Окружность с центром в начале координат
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "RUS");
    float y1;
    float r=110;
    int c = 160;
    int n;//параметр метрики - любое натуральное число. 
          
    cout << "Введите параметр метрики n: " << endl;
    cin >> n;//При вводе 1 - ромб, при вводе 2 - конц. окружность, 3 и более - фигура стремится к квадрату
 
    system("cls");//clear screen, очистка экрана
    
 
    //подписи координатных осей
    HANDLE hCon;
    COORD cPos;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    cPos.Y = c / 11;
    cPos.X = c / 8.5;
    SetConsoleCursorPosition(hCon, cPos);
    cout << "0" << endl;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    cPos.Y = c / 54;
    cPos.X = c / 8.5;
    SetConsoleCursorPosition(hCon, cPos);
    cout << "y" << endl;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);
    cPos.Y = c / 11;
    cPos.X = c / 3.7;
    SetConsoleCursorPosition(hCon, cPos);
    cout << "x" << endl;
 
 
    //рисунки координатных осей
 
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN Pen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
    SelectObject(hDC, Pen);
    MoveToEx(hDC, 10, c, NULL);//рисует ось Х, отступ 10 пикселей слева
    LineTo(hDC, c + 200, c);//указываем длину линии (200 пикселей)
    MoveToEx(hDC, c, 10, NULL);//рисует ось У, отступ 10 пикселей сверху
    LineTo(hDC, c, c + 200);//указываем длину линии (200 пикселей)
 
 
//рисунок окружности
 
    double x = -1., y = 0;
    MoveToEx(hDC, r*x + c, r*y + c, NULL); // незачем это делать каждый раз
 
    for (; x <= 1.0; x += 0.01) //  нижняя половина фигуры
    {
        y = pow(1. - abs(pow(x, n)), 1./ n);
        LineTo(hDC, r*x + c, r*y + c);
    }
    for (x = 1.0; x >= -1.0; x -= 0.01)  //  верхняя половина фигуры
    {
        y = -pow(1. - abs(pow(x, n)), 1. / n);
        LineTo(hDC, r*x + c, r*y + c);
    }
 
 
    cout << "\n\n\n\n\n\n\n\n\n" << endl;
    system("pause");
 
}
0
03.08.2018, 16:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2018, 16:03
Помогаю со студенческими работами здесь

Определить, сколько значений заданной функции принадлежит к заданной окружности
Значения функции f(x)=sin(x)+cos(x) определены при x=x0(hx)xn . Определить, сколько значений...

Принадлежит ли точка заданной окружности
Составить программу в Pascal ABC, определяющую, принадлежит ли точка с координатами (x,y) данной...

Получить на экране рисунок паутины с центром в произвольной (заданной) точке
Получить на экране рисунок паутины с центром в произвольной (заданной) точке, с произвольным числом...

Определите, принадлежит ли точка заданной окружности
Как решить задачу на чистом Си? Окружность с центром в точке (x,y) проходит через точку (x1,y1)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru