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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
#1

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

27.11.2012, 15:46. Просмотров 494. Ответов 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" проходят правильно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 15:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Геометрия. Симметричная точка (C++):

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

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

Симметричная матрица - C++
Заполнить матрицу случайными числами. Отобразить матрицу симметрично относительно главной диагонали. Тоесть должна вийти матрица вида: ...

Симметричная квадратная матрица - C++
&quot;Симметричная квадратная матрица А порядка n задана последовательностью n(n+1)/2 чисел, аналогично правой треугольной матрице. Кроме этой...

Симметричная разность массивов - C++
Даны два массива: массив А из n элементов и массив В из m элементов. Сформируйте массив С, состоящий из элементов массива А и В, которые...

Квадратная матрица и симметричная её часть - C++
Помогите решить задачу, пожалуйста: Написать функцию,которая вычисляет для заданной квадратной матрицы А симметричную её часть S(ij) =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
29.11.2012, 10:31  [ТС] #2
Спасибо за помощь ! Решено : Было переполнение типа double, а long double в с++ 2008 = double. Сдал на delphi
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2012, 10:31
Привет! Вот еще темы с ответами:

Симметричная строка через указатели - C++
Здравствуйте. Застопорился на абсолютно элементарной задачке: Дан текст из 80 букв. Определить, симметричен ли он, т.е. читается...

Неверно выводится симметричная строка - C++
Проблема с выводом данной программы, надо что бы программа выводила в двоичном коде там где начало кода симметрично концу 1 101 111 1001 и...

Реализовать классические операции над множествами - объединение, пересечение и симметричная разность - C++
Создать параметризованный тип данных - множество. Этот тип предназначен для хранения множества элементов и выполнения операций над ними....

Дана точка М(x, y). Присвоить z = 1, если точка принадлежит окружности с радиусом R и центром в точке (a, b) и z = 0 в противном случае. - C++
Дана точка М(x, y). Присвоить z = 1, если точка принадлежит окружности с радиусом R и центром в точке (a, b) и z = 0 в противном случае.


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru