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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Изменение фактического состояния объекта не мгновенно по вызове метода, а через некоторое время http://www.cyberforum.ru/cpp-beginners/thread710859.html
Хочу сделать чтобы после вызова метода объекта изменение состояния объекта происходило только через некоторое время, например 3 минуты. Как такое можно сделать?
C++ С какого символа начинается std::string? С нулевого, или с первого? http://www.cyberforum.ru/cpp-beginners/thread710846.html
C++ Создание makefile
У меня есть проект на с++, написанный в MS VS 2010 Express, нужно создать makefile. Я раньше такого не делал, поэтому прошу по-подробнее объяснить, как он делается. Спасибо! Проект имеет вид: file1.h, file2.h, file1.cpp, file2.cpp, main.cpp
стек, как правильно? C++
Есть вот такой вопрос: как правильно записать и почему!? Функция MAKENULL делает стек пустым я написал вот так void MAKENULL(Stack *S) { S->top = maxlength; } а одногруппник так void MAKENULL(Stack *S) { S->top = maxlength + 1;
C++ Windows form кнопка+текстбокс http://www.cyberforum.ru/cpp-beginners/thread710841.html
Подкиньте, пожалуйста, код формы с кнопкой и текстбоксом. ( а лучше хороших уроков, где учат, как эту кнопку делать )
C++ Найти различные элементы массива за nlog2n Друзья, помогите с кодом: нуэно найти различные элементы в массиве, чтобы сложность алгоритма была nLog2n. Как можно это реализовать? подробнее

Показать сообщение отдельно
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
27.11.2012, 15:46     Геометрия. Симметричная точка
Доброго времени суток!
Задача :
Дана прямая, проходящая через две различные точки (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" проходят правильно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 19:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru