С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595

Геометрия. Симметричная точка

27.11.2012, 15:46. Показов 2214. Ответов 1

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Задача :
Дана прямая, проходящая через две различные точки (x1,y1) и (x2,y2). Найдите точку, симметричную точке (X, Y).
Входные данные
В первой строке входного файла записано два числа x1 и y1. Во второй - x2 и y2, а в третьей - X и Y. Все числа целые, по модулю не превосходящие 10^9.

Выходные данные
Выведите координаты симметричного нефтяного месторождения через пробел с восемью знаками после запятой или фразу "Oil field is on the frontier", если точка лежит на прямой.

Пример

Ввод

1 1
2 2
0 1

Вывод
1.00000000 0.00000000

C++ (Qt)
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
#define sqr(x) ((x)*(x))
#define _USE_MATH_DEFINES
 
#include <iostream>
#include <algorithm>
#include <math.h>
 
 
using namespace std;
 
double len(double x1, double y1, double x2, double y2, double x, double y){
    double A = y2 - y1;
    double B = x1 - x2;
    double C = -(A * x1 + B * y1);
    return abs(A * x + B * y + C) / sqrt( sqr(A) + sqr(B) );
}
 
int main()
{   
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    int x1,y1,x2,y2,x,y;
    cin >> x1 >> y1 >> x2 >> y2 >> x >> y;
    if ((x - x1)*(y2 - y1) == (y - y1)*(x2 - x1))   {
        cout << "Oil field is on the frontier";
        return 0;
    }
    double superlen = len(x1,y1,x2,y2,x,y);
    double Nx = y2 - y1;
    double Ny = x1 - x2;
    double megalen = sqrt(sqr(Nx)+sqr(Ny));
    Nx /= megalen;
    Ny /= megalen;
    double C1x = x + 2 * Nx * superlen;
    double C2x = x - 2 * Nx * superlen;
    double C1y = y + 2 * Ny * superlen;
    double C2y = y - 2 * Ny * superlen;
    if (len(x1,y1,x2,y2,C1x,C1y) < len(x1,y1,x2,y2,C2x,C2y))
        printf("%.9f %.9f", C1x, C1y);
    else 
        printf("%.9f %.9f", C2x, C2y);
    return 0;
}
Result - 18/20 (Проходит 18 тестов из 20 и 2 wrong answer'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
33
#define _USE_MATH_DEFINES
#define sqr(x) (long double)((x)*(x))
#include <iostream>
#include <algorithm>
#include <math.h>
 
using namespace std;
 
long double get_angle(long double x, long double y){
    return atan2(y,x)+(y<0)*M_PI*2;
}
 
int main()
{   
    long double x1,y1,x2,y2,x,y;
    cin >> x1 >> y1 >> x2 >> y2 >> x >> y;
    if ((x - x1)*(y2 - y1) == (y - y1)*(x2 - x1))   {
        cout << "Oil field is on the frontier";
        return 0;
    }
    long double Ax = x2-x1;
    long double Ay = y2-y1;
    long double Bx = x-x1;
    long double By = y-y1;
    long double a = get_angle(Ax, Ay);
    long double b = get_angle(Bx, By);
    long double ans = a + (a - b);
    long double len = sqrt(sqr(Bx)+sqr(By));
    long double Cx = len*cos(ans) + x1;
    long double Cy = len*sin(ans) + y1;
    printf("%.15lf %.15lf", Cx, Cy);
    return 0;
}
Добавлено через 6 минут
В 1-м примере я решал так : находим расстояние от точки до прямой, затем находим нормальный нормализованый вектор прямой (перпендикулярный с длиной = 1) и пляшем от точки x y в 2 стороны с длиной 2 * длину от точки до прямой по этому вектору.
Во 2-м я переношу x1 y1 в начало координат, а остальные смещаю на то же расстояние, что и x1 y1. Затем я нахожу 2 угла м\д нашей точкой и м\д 2-й точкой прямой, потом определяю угол к новой точке от начала координат (как и у тех), потом по длине восстанавливаю её.
Собсно всё окейно. Спасайте, народ.
И ещё! Тесты, на которых требуется вывести "Oil field is on the frontier" проходят правильно
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2012, 15:46
Ответы с готовыми решениями:

Геометрия (проверить, принадлежит ли третья точка кругу!)
Отрезок прямой задан двумя точками и есть радиусом круга с центром в первой точке, приверить принадлежит ли третья точка кругу!

if геометрия (Переменной К присвоить номер четверти, в которой находится точка с коэффициентами x,y)
Переменной К присвоить номер четверти, в которой находится точка с коэффициентами x,y (х,у не равны нулю )

Симметричная ли матрица
Определить, симметричен ли массив относительно главной диагонали матрицы А порядка n, эленты которой есть целыми числами. Аргументы: ...

1
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
29.11.2012, 10:31  [ТС]
Спасибо за помощь ! Решено : Было переполнение типа double, а long double в с++ 2008 = double. Сдал на delphi
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2012, 10:31
Помогаю со студенческими работами здесь

Симметричная матрица
Написать программу, которая проверяет, является ли квадратная матрица симметричной относительно главной диагонали. Входные данные В...

Симметричная последовательность
подскажите пожалуйста как определить образуют ли цифры числа симметричную последовательность?

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

Симметричная матрица
Написать программу, которая формирует новый линейный массив минимально необходимой длины, элементами которого являются элементы...

Симметричная матрица
Когда делаешь матрицу не симметричной, то лишнее обрезается, а недостающее нулями заполняется :gcray2:извелась уже я. Я в программирование...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru