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

Простая геометрия - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Вывод вычисления произведения http://www.cyberforum.ru/cpp-beginners/thread898493.html
Есть цикл, в котором при помощи cout выводятся номера элементов массива, как вывести вычисления произведений?#include <iostream> using namespace std; int main() { int a; int res = 1; for (int i = 0; i < 10000; i+=3) { res *= a;
C++ удалить из текста слова которые содержат цифры Нужно написать программу, в которой пользователь вводит текст, а из него удаляются слова которые содержат цифры. Например: дано: "ма2ма мила раму7 дома"; а выйти должно :"мила дома". Но для решения нельзя использовать библиотеку string.h Только через char. И размер массива char (даной стрроки) не должен быть константой и нельзя его вводить с клавиатуры. Также под переменную char (которая содержит... http://www.cyberforum.ru/cpp-beginners/thread898492.html
Эквивалентность формул. По таблице истинности C++
Помогите написать программу доказывающую эквивалентность формул по таблице истинности
Перевод секунд в часы,минуты и секунды C++
Тока начинаю изучать С++ по Лафоре, дошел до функций и не получается построить простенькую функцию. Нужно составить две, одна которая принимает структурную переменную time и выдает число секунд, а вторая принимает число секунд и выдает структурную переменную типа time. С первой я разобрался, а вот адекватно построить вторую чет не получается.Компилятор выдает что в ходе построения произошла...
C++ STL. Создать объект-контейнер stack и заполнить его данными типа double http://www.cyberforum.ru/cpp-beginners/thread898482.html
Задание: 1. Создать объект-контейнер и заполнить его данными, тип которых определяется вариантом задания. 2. Посмотреть контейнер. 3. Изменить контейнер, удалив из него одни элементы и заменив другими. 4. Посмотреть контейнер, используя для доступа к его элементам итераторы. 5. Создать второй контейнер этого же класса и заполнить его данными того же типа, что и первый контейнер. 6. Изменить...
C++ программы написанные на Code blocks не открываются на visual studio что делать? подробнее

Показать сообщение отдельно
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
11.06.2013, 21:57     Простая геометрия
Недавно решал пачку задач на геометрию, но с одной не справился, даже сейчас не выходит.

Постановка:
Дан выпуклый многоугольник (т.е. все внутренние углы не больше 180 градусов) и прямая. Прямая режет многоугольник на две части (одна из них может оказаться пустой). Какий площади у этих частей?

Входные данные
В первой строке записано число N (2 < N < 51) - количество вершин многоугольника. Далее в N строках заданы вершины своими координатами в порядке обхода по или против часовой стрелки. Возможно, что три или более точек лежит на одной прямой. В последних двух строках записаны координаты двух различных точек по которым проходит разрез. Все координаты задаются через пробел вещественными числами по модулю не превосходящими 10000. Количество знаков после запятой не превосходит 5. Вероятно, что разрез не пройдет через многоугольник.

Выходные данные
Выведите S1 и S2 через пробел с 5 знаками после запятой, S1 >= S2.

Ввод
4
0 0
0 1
1 1
1 0
0.5 0
0.5 1
Вывод
0.50000 0.50000

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

Result - 46/70, проходит половину тестов.

Вот мои наработки :
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <bitset>
 
using namespace std;
 
bool in_segment(double x, double y, double x1, double y1, double x2, double y2) {
    return (abs ((y1 -y2) * (x1 - x) -(y1 - y) * (x1 - x2)) <= 1e-8  && 
            x >= min(x1, x2) && x <= max(x1, x2) && 
            y >= min(y1, y2) && y <= max(y1, y2));
}
 
pair < bool, pair <double, double> > solv(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
    if ((y2-y1)*(x3-x4) == (y4-y3)*(x1-x2))
        return make_pair(false, make_pair(0.0, 0.0));
    double k = ((x4-x3)*(y1-y3)-(y4-y3)*(x1-x3)) / ((x2-x1)*(y4-y3)-(y2-y1)*(x4-x3));
    double xx = x1+k*(x2-x1);
    double yy = y1+k*(y2-y1);
    return make_pair(in_segment(xx, yy, x1, y1, x2, y2), make_pair(xx, yy));
}
 
 
double arr(vector <double> x, vector <double> y) {
    double ans = 0;
    for (int i = 0; i < x.size() - 1; ++i) 
        ans += (x[i+1] - x[i]) * (y[i+1] + y[i]);
    return abs(ans) / 2.0;
}
 
int main() {
    freopen ("input.txt", "rt", stdin);
    freopen ("output.txt", "wt", stdout);
    int n;
    cin >> n;
    vector <double> x(n+1), y(n+1);
    double x1, y1, x2, y2;
    for (int i = 0; i < n; i++)
        scanf("%lf%lf", &x[i], &y[i]);
    x[n] = x[0];
    y[n] = y[0];
    double total = arr(x, y);
    scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
    pair < bool, pair <double, double> > t;
    vector <double> normx, normy;
    bool flag = true;
    for (int i = 0; i < n; ++i) {
        t = solv(x[i], y[i], x[i + 1], y[i + 1], x1, y1, x2, y2);
        if (flag) {
            normx.push_back(x[i]);
            normy.push_back(y[i]);
        }
        if (t.first) {
            normx.push_back(t.second.first);
            normy.push_back(t.second.second);
            flag = !flag;
        }
    }
    normx.push_back(normx[0]);
    normy.push_back(normy[0]);
    double s1 = arr(normx, normy);
    printf("%.6lf %.6lf", max(s1, total - s1), min(s1, total - s1));
    return 0;
}
Добавлено через 3 минуты
Функции - arr - площадь многоугольника.
Solv - возвращает true как первый аргумент пары, если пересеклась прямая по двум точкам (x3,y3,x4,y4), с отрезком x1, y1, x2, y2. И если точка пересечения имеется, то как второй аргумент -- её координаты.
in_segment - проверка принадлежности точки отрезку.

Добавлено через 6 минут
подправил
C++
1
 if ((y2-y1)*(x3-x4) == (y4-y3)*(x1-x2))
на
C++
1
if (abs((y2-y1)*(x3-x4) - (y4-y3)*(x1-x2)) <= 1e-8)
но опять 46 тестов

Добавлено через 5 часов 58 минут
up !

Добавлено через 1 час 48 минут
ну давайте, ребят, help, что угодно, хотя бы идеи новые подкиньте !
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru