Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
4 / 4 / 0
Регистрация: 01.11.2023
Сообщений: 88

Построить квадрат

13.08.2024, 13:06. Показов 3995. Ответов 34
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста с задачей, очень важно!!!
Заданы координаты точек A(xa, ya) и B(xb, yb). Найдите две точки C и D такие, что ACBD — квадрат, причём AB — его диагональ.
Формат ввода

В единственной строке находятся четыре целых числа xa, ya, xb, yb, по модулю не превышающих 1000. Гарантируется, что точки A и B не совпадают.
Формат вывода

В первой строке выведите координаты точки C, во второй — координаты точки D. Точки можно выводить в произвольном порядке. Координаты необходимо вывести с точностью до пятого знака после запятой.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2024, 13:06
Ответы с готовыми решениями:

Построить квадрат из знаков '*'
Напишите программу, которая строит "квадрат" из знаков '*' заданного размера. Используйте процедуру. Входные данные Входная строка...

Как построить квадрат в с++
Здравствуйте! Помогите с заданием Необходимо построить квадрат по координатам точек, и найти его площадь. Заранее спасибо

Ввести символ и построить из него квадрат.
Всем доброго времени суток! Пытаюсь написать прогу, которая выводит квадрат со стороной, введенной пользователем. Символ, из которых...

34
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6697 / 3098 / 1064
Регистрация: 01.06.2021
Сообщений: 11,980
18.08.2024, 15:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от повар1 Посмотреть сообщение
у Volga_ алгоритм не верный
Volga_ просто немного ошибся, но ход его мыслей понятен

ищем центр квадрата, а учитывая тот факт, что диагонали квадрата пересекаются под прямым углом, вращаем известные точки на 90 градусов относительно центра квадрата

я уже писал код для вращения точки относительно другой точки на определенный угол

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Point
{
    double x;
    double y;
};
 
Point RotateAround(const Point &point, const Point &pivot, double angle, bool deg = false)
{
    Point p;
    if (deg)
        angle *= std::acos(-1.) / 180.;
    double c = std::cos(angle);
    double s = std::sin(angle);
    double dx = point.x - pivot.x;
    double dy = point.y - pivot.y;
    p.x = c * dx - s * dy + pivot.x;
    p.y = s * dx + c * dy + pivot.y;
    return p;
}
Но тут еще проще, т.к. sin(90°) = 1, а cos(90°) = 0. Код значительно упрощается, т.к. тригонометрические функции полностью отбрасываются. В итоге получается то, что у analogov net.
1
 Аватар для Storm Screamer
5840 / 1597 / 127
Регистрация: 21.04.2013
Сообщений: 9,249
18.08.2024, 17:57
DanMAm,

Для решения задачи необходимо определить координаты точек C и D таким образом, чтобы ACBD образовывал квадрат с диагональю AB.

Пусть координаты точек A(x_a, y_a) и B(x_b, y_b) заданы. Для нахождения точек C(x_c, y_c) и D(x_d, y_d), можно использовать следующие рассуждения:

Если AB — диагональ квадрата, то вектор AB можно повернуть на 90 и на -90 градусов, чтобы получить векторы AC и BD соответственно. Координаты точек C и D тогда можно получить путем прибавления и вычитания соответствующих векторов к координатам точки A.

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
#include <iostream>
#include <cmath>
#include <iomanip>
 
using namespace std;
 
int main() {
    // Ввод координат точек A и B
    int xa, ya, xb, yb;
    cin >> xa >> ya >> xb >> yb;
 
    // Вычисление точек C и D
    double xc1 = xa + (yb - ya) / sqrt(2.0);
    double yc1 = ya - (xb - xa) / sqrt(2.0);
    double xd1 = xb + (yb - ya) / sqrt(2.0);
    double yd1 = yb - (xb - xa) / sqrt(2.0);
 
    double xc2 = xa - (yb - ya) / sqrt(2.0);
    double yc2 = ya + (xb - xa) / sqrt(2.0);
    double xd2 = xb - (yb - ya) / sqrt(2.0);
    double yd2 = yb + (xb - xa) / sqrt(2.0);
 
    // Вывод координат точек C и D с точностью до пятого знака после запятой
    cout << fixed << setprecision(5);
    cout << xc1 << " " << yc1 << endl;
    cout << xd1 << " " << yd1 << endl;
 
    cout << xc2 << " " << yc2 << endl;
    cout << xd2 << " " << yd2 << endl;
 
    return 0;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5209 / 2927 / 1509
Регистрация: 14.12.2018
Сообщений: 5,267
Записей в блоге: 1
18.08.2024, 18:06
повар1, Royal_X, у меня ошибка. Это квадрат, а у меня прямоугольник. Не заметил, извините.
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6697 / 3098 / 1064
Регистрация: 01.06.2021
Сообщений: 11,980
19.08.2024, 00:15
Цитата Сообщение от Storm Screamer Посмотреть сообщение
Координаты точек C и D тогда можно получить путем прибавления и вычитания соответствующих векторов к координатам точки A.
Проверил снова на точках A(-3, 2), B(3, 1), но получил аж 4 точки вместо двух
C++
1
2
3
4
5
-3 2 3 1
-3.70711 -2.24264
2.29289 -3.24264
-2.29289 6.24264
3.70711 5.24264


Не вижу ни квадрата, ни чтобы AB была диагональю чего-то...
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
19.08.2024, 00:28
Цитата Сообщение от Royal_X Посмотреть сообщение
Проверил снова на точках
это точно не квадрат
Миниатюры
Построить квадрат  
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6697 / 3098 / 1064
Регистрация: 01.06.2021
Сообщений: 11,980
19.08.2024, 00:33
Цитата Сообщение от повар1 Посмотреть сообщение
это точно не квадрат
ага
для твоих точек должен выдать
C++
1
2
3
2 2 -2 -2
2.00000 -2.00000
-2.00000 2.00000
но выдает дичь

Вообще, в теме уже есть рабочий код, выделенный как ответ. Не думаю, что найдется что-то лучше.
Как вытекает из поста Построить квадрат в коде не должно быть ни тригонометрических функций (они отбрасываются), ни квадратных корней...
0
 Аватар для Storm Screamer
5840 / 1597 / 127
Регистрация: 21.04.2013
Сообщений: 9,249
19.08.2024, 01:07
Цитата Сообщение от Royal_X Посмотреть сообщение
но получил аж 4 точки вместо двух
Программа выводит два возможных решения для точек C и D, которые соответствуют квадратам, образованным вокруг диагонали AB.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
19.08.2024, 05:54
Цитата Сообщение от Storm Screamer Посмотреть сообщение
Если AB — диагональ квадрата, то вектор AB можно повернуть на 90 и на -90 градусов, чтобы получить векторы AC и BD соответственно. Координаты точек C и D тогда можно получить путем прибавления и вычитания соответствующих векторов к координатам точки A.
Это какая-то белиберда. Какие еще 90 градусов? Угол между диагональю и стороной квадрата - 45 градусов.

---

Если AB — диагональ квадрата, то сразу можно вычислить точку O - середину этой диагонали. После этого достаточно взять направленный отрезок OA (или OB - неважно) и повернуть его вокруг точки O на +90 и -90 градусов, что тут же странслирует точку A в точки C и D. Все, задача решена.

Никаких корней и тригонометрии для выполнения этих действий не нужно. Фактически нужно только уметь делить на 2. Фактически именно это, с непринципиальными вариациями, делает analogov net в #18.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6697 / 3098 / 1064
Регистрация: 01.06.2021
Сообщений: 11,980
19.08.2024, 09:24
Цитата Сообщение от TheCalligrapher
Если AB — диагональ квадрата, то сразу можно вычислить точку O - середину этой диагонали. После этого достаточно взять направленный отрезок OA (или OB - неважно) и повернуть его вокруг точки O на +90 и -90 градусов, что тут же странслирует точку A в точки C и D. Все, задача решена.
То же самое я писал в #21 посте. ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯
0
 Аватар для Storm Screamer
5840 / 1597 / 127
Регистрация: 21.04.2013
Сообщений: 9,249
19.08.2024, 11:41
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какие еще 90 градусов? Угол между диагональю и стороной квадрата - 45 градусов.
Поворот вектора диагонали на 90 градусов делается для нахождения направлений, которые совпадают с ориентацией сторон квадрата. То есть мы ищем такие векторы, которые будут параллельны сторонам квадрата, перпендикулярным друг другу.

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

Ищем не саму сторону, параллельную диагонали, а перпендикулярные направления сторон квадрата.
Стороны квадрата перпендикулярны друг другу. Поэтому, когда мы разворачиваем диагональ на 90 градусов, мы получаем направление вектора, которое совпадает с направлением одной из сторон квадрата.

Если повернуть вектор на 45 градусов от диагонали, мы получим направление, которое параллельно одной из сторон квадрата (например, сторону, идущую вверх или вправо). Однако для полного определения формы квадрата нужны обе стороны.

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

Примерно вот так:
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
#include <iostream>
#include <iomanip> // Для установки точности вывода
 
using namespace std;
 
int main() {
    int xa, ya, xb, yb;
    cin >> xa >> ya >> xb >> yb;
 
    // Вектор AB
    int dx = xb - xa;
    int dy = yb - ya;
 
    // Координаты точки C
    int xc = xa - dy;
    int yc = ya + dx;
 
    // Координаты точки D
    int xd = xb - dy;
    int yd = yb + dx;
 
    // Вывод с точностью до 5 знаков после запятой
    cout << fixed << setprecision(5);
    cout << xc << " " << yc << endl;
    cout << xd << " " << yd << endl;
 
    return 0;
}
Ввод: 2 2 -2 -2
Вывод:
6 -2
2 -6

Получился квадрат.
0
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
19.08.2024, 11:57
Цитата Сообщение от Storm Screamer Посмотреть сообщение
Получился квадрат.
Storm Screamer, квадрат-то получился, спору нет. Только диагонали у него никак ни AB и ни CD.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6697 / 3098 / 1064
Регистрация: 01.06.2021
Сообщений: 11,980
19.08.2024, 12:37
analogov net лучше вашего решения все равно ничего не найдется.

Идея с вращением на 90 градусов известных точек A и B вокруг центра квадрата самая оптимальная.
Во-первых, центр квадрата легко находится. Во-вторых, 90 градусов идеальны с точки зрения тригонометрии.

Так матрица поворота на угол https://www.cyberforum.ru/cgi-bin/latex.cgi?\theta вокруг центра квадрата https://www.cyberforum.ru/cgi-bin/latex.cgi?O(x_o, y_o) выглядит

https://www.cyberforum.ru/cgi-bin/latex.cgi?\left(<br />
\begin{array}{ccc}<br />
 \cos (\theta ) & -\sin (\theta ) & -\cos (\theta ) x_o+x_o+\sin (\theta ) y_o \\<br />
 \sin (\theta ) & \cos (\theta ) & -\sin (\theta ) x_o-\cos (\theta ) y_o+y_o \\<br />
 0 & 0 & 1 \\<br />
\end{array}<br />
\right)

при https://www.cyberforum.ru/cgi-bin/latex.cgi?\theta=\frac{\pi}{2}

получаем матрицу

https://www.cyberforum.ru/cgi-bin/latex.cgi?\left(<br />
\begin{array}{ccc}<br />
 0 & -1 & x_o+y_o \\<br />
 1 & 0 & y_o-x_o \\<br />
 0 & 0 & 1 \\<br />
\end{array}<br />
\right)

А вот координаты точки https://www.cyberforum.ru/cgi-bin/latex.cgi?P(x, y) после поворота по этой матрице выглядят так

https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\(x_o+y_o-y,-x_o+y_o+x\right\)

Это именно то, что сделал analogov net. Все очень просто.
2
 Аватар для Storm Screamer
5840 / 1597 / 127
Регистрация: 21.04.2013
Сообщений: 9,249
19.08.2024, 13:03
Цитата Сообщение от analogov net Посмотреть сообщение
Только диагонали у него никак ни AB и ни CD.
Прошу прощения, самое главное я и не заметил...

Тогда такое решение:
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
#include <iostream>
#include <cmath>
 
struct Point {
    double x, y;
};
 
// Функция для вращения точки на 90 градусов вокруг средней точки
Point rotate(Point origin, Point p, bool clockwise) {
    double x_shifted = p.x - origin.x;
    double y_shifted = p.y - origin.y;
 
    double rotated_x, rotated_y;
 
    if (clockwise) {
        rotated_x = y_shifted;
        rotated_y = -x_shifted;
    } else {
        rotated_x = -y_shifted;
        rotated_y = x_shifted;
    }
 
    return {origin.x + rotated_x, origin.y + rotated_y};
}
 
int main() {
    Point A, B;
 
    // Ввод координат точек A и B
    std::cout << "Введите координаты точки A (x1, y1): ";
    std::cin >> A.x >> A.y;
 
    std::cout << "Введите координаты точки B (x2, y2): ";
    std::cin >> B.x >> B.y;
 
    // Средняя точка диагонали AB
    Point mid = {(A.x + B.x) / 2, (A.y + B.y) / 2};
 
    // Вычисление координат вершин C и D через вращение на 90 градусов
    Point C = rotate(mid, A, true);  // По часовой стрелке
    Point D = rotate(mid, B, true);  // По часовой стрелке
 
    // Вывод координат всех вершин квадрата
    std::cout << "Вершина A: (" << A.x << ", " << A.y << ")\n";
    std::cout << "Вершина B: (" << B.x << ", " << B.y << ")\n";
    std::cout << "Вершина C: (" << C.x << ", " << C.y << ")\n";
    std::cout << "Вершина D: (" << D.x << ", " << D.y << ")\n";
 
    return 0;
}
Квадрат с вводом: 2 2 -2 -2
Название: chrome_B0bbLb7u1G.png
Просмотров: 99

Размер: 6.0 Кб

Квадрат с вашим вводом: -2 4 8 9


Правильно получилось?
2
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6697 / 3098 / 1064
Регистрация: 01.06.2021
Сообщений: 11,980
19.08.2024, 13:10
Цитата Сообщение от Storm Screamer Посмотреть сообщение
Правильно получилось?
Проверил на тех же точках на A(-3, 2), B(3, 1)

C++
1
2
3
4
5
6
Введите координаты точки A (x1, y1): -3 2
Введите координаты точки B (x2, y2): 3 1
Вершина A: (-3, 2)
Вершина B: (3, 1)
Вершина C: (0.5, 4.5)
Вершина D: (-0.5, -1.5)
да, правильно

Добавлено через 1 минуту
Цитата Сообщение от Storm Screamer Посмотреть сообщение
bool clockwise
только это лишнее, можно выбрать любое одно направление для обеих точек. Имею в виду, можно сократить код функции.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
19.08.2024, 17:28
Цитата Сообщение от Storm Screamer Посмотреть сообщение
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Какие еще 90 градусов? Угол между диагональю и стороной квадрата - 45 градусов.
Поворот вектора диагонали на 90 градусов делается для нахождения направлений, которые совпадают с ориентацией сторон квадрата. [...]

Диагональ квадрата образует угол 45 градусов с каждой из его сторон, [...]
??? Вы продолжаете повторять вещи, которые просто в упор противоречат сами себе. ¯\_(ツ)_/¯
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.08.2024, 17:28

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

Построить квадрат, который вращается вокруг своего центра на угол a
помогите понять условие задачи а то я не до конца ее понимаю вот задание: Построить квадрат, который вращается вокруг своего центра на...

Построить класс для описания плоской геометрической фигуры квадрат
Помогите написать программу в Борланд С++, вот условие: 1.Сложить целые и нецелые части двох действительных чисел. например: 1,8 и 5,3. ...

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

Построить блок-схему. Даны числа:а,в и с.Если их полусумма больше нуля,то наименьшее из чисел возвести в квадрат
Даны числа:а,в и с.Если их полусумма больше нуля,то наименьшее из чисел возвести в квадрат.В противном случае все отрицательные числа из...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru