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

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

13.08.2024, 13:06. Показов 3872. Ответов 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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
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
5814 / 1570 / 125
Регистрация: 21.04.2013
Сообщений: 9,151
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
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
5814 / 1570 / 125
Регистрация: 21.04.2013
Сообщений: 9,151
19.08.2024, 01:07
Цитата Сообщение от Royal_X Посмотреть сообщение
но получил аж 4 точки вместо двух
Программа выводит два возможных решения для точек C и D, которые соответствуют квадратам, образованным вокруг диагонали AB.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
19.08.2024, 09:24
Цитата Сообщение от TheCalligrapher
Если AB — диагональ квадрата, то сразу можно вычислить точку O - середину этой диагонали. После этого достаточно взять направленный отрезок OA (или OB - неважно) и повернуть его вокруг точки O на +90 и -90 градусов, что тут же странслирует точку A в точки C и D. Все, задача решена.
То же самое я писал в #21 посте. ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯
0
 Аватар для Storm Screamer
5814 / 1570 / 125
Регистрация: 21.04.2013
Сообщений: 9,151
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
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
5814 / 1570 / 125
Регистрация: 21.04.2013
Сообщений: 9,151
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
Просмотров: 95

Размер: 6.0 Кб

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


Правильно получилось?
2
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,616
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
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,333
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
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru