Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2010, 21:00   #1
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию площадь полигона

Даны координаты точек, xi, yj.
По этим данным определить площадь фигуры.
Что то ума не приложу, разделим, из 1й вершины проведем ко всем линии, получатся треугольники, сложим их. Но там же получатся части захватывающие, которые не нужны. Как реализовать возможно?

Или быть может не треугольниками, свой вариант предложите...
Изображения
Тип файла: jpg 5.jpg (18.9 Кб, 134 просмотров)
boomeer вне форума Ответить с цитированием
Старый 16.10.2010, 21:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так тут не все координаты нарисованы... Есть "углы" без точек. что с ними делать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.10.2010, 03:20   #3
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Рискну предложить такое:
Код:
#include <iostream>
#include <list>

struct Point
{
    double x;
    double y;
};

typedef std::list<Point> PointList;

struct CompY
{
    bool operator () (const Point &a, const Point &b) { return a.y < b.y; }
} cmp;

double area(PointList &pl)
{
    pl.sort(cmp);

    double x0, x1, y0;
    double a = 0;

    if(!pl.empty())
    {
        x0 = x1 = pl.front().x;
        y0 = pl.front().y;
        pl.pop_front();

        while(!pl.empty())
        {
            double x2 = pl.front().x;
            double y1 = pl.front().y;
            a += (x1 - x0) * (y1 - y0);
            y0 = y1;
            ((x2 < (x0 + x1) * 0.5) ? x0 : x1) = x2;
            pl.pop_front();
        }
    }

    return a;
}

int main(int, char *[])
{
    Point pts[] = { {0, 9}, {7, 9}, {5, 8}, {7, 8}, {0, 5}, {2, 4}, {5, 4}, {3, 0}, {6, 0} };
    PointList pl;

    for(unsigned int i = 0; i < sizeof pts / sizeof pts[0]; ++i) pl.push_back(pts[i]);
    std::cout << "Area: " << area(pl) << std::endl;

    return 0;
}
P.S. Точки в коде заданы левые, подставьте свои.
sergey.d вне форума Ответить с цитированием
Старый 17.10.2010, 11:05   #4
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так тут не все координаты нарисованы... Есть "углы" без точек. что с ними делать?
А эти точки и не даны. Если в оригинале, то там так "Даны прямоугольники которые могут пересекаться и находится внутри другого. Найти площадь которую они занимают вместе"
boomeer вне форума Ответить с цитированием
Старый 17.10.2010, 11:11   #5
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

Цитата:
Сообщение от sergey.d Посмотреть сообщение
Рискну предложить такое:
Код:
#include <iostream>
#include <list>

struct Point
{
    double x;
    double y;
};

typedef std::list<Point> PointList;

struct CompY
{
    bool operator () (const Point &a, const Point &b) { return a.y < b.y; }
} cmp;

double area(PointList &pl)
{
    pl.sort(cmp);

    double x0, x1, y0;
    double a = 0;

    if(!pl.empty())
    {
        x0 = x1 = pl.front().x;
        y0 = pl.front().y;
        pl.pop_front();

        while(!pl.empty())
        {
            double x2 = pl.front().x;
            double y1 = pl.front().y;
            a += (x1 - x0) * (y1 - y0);
            y0 = y1;
            ((x2 < (x0 + x1) * 0.5) ? x0 : x1) = x2;
            pl.pop_front();
        }
    }

    return a;
}

int main(int, char *[])
{
    Point pts[] = { {0, 9}, {7, 9}, {5, 8}, {7, 8}, {0, 5}, {2, 4}, {5, 4}, {3, 0}, {6, 0} };
    PointList pl;

    for(unsigned int i = 0; i < sizeof pts / sizeof pts[0]; ++i) pl.push_back(pts[i]);
    std::cout << "Area: " << area(pl) << std::endl;

    return 0;
}
P.S. Точки в коде заданы левые, подставьте свои.
Отлично, теперь бы в коде разобраться
boomeer вне форума Ответить с цитированием
Старый 17.10.2010, 14:17   #6
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Цитата:
Отлично, теперь бы в коде разобраться
Основная идея -- "закрашиваем" нашу фигуру плоской горизонтальной "кистью" переменной ширины снизу вверх. Начинаем с кисти 0-й ширины, меняем ширину каждый раз, встречая новую точку из числа заданных. Ну, а наиболее полное описание кода - это сам код
sergey.d вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны площадь круга и площадь квадрата Joker<777> Паскаль, Turbo Pascal, PascalABC.NET 10 17.01.2012 07:00
Площадь прямоугольников savraska Помощь студентам 7 04.06.2010 16:42
Вычислить площадь и т.д. rmdzn Microsoft Office Excel 3 31.05.2010 22:16
Площадь прямоугольника AndrSil Помощь студентам 5 22.04.2010 23:23
Рисование затекстурированного полигона в OpenGL. Вадим Буренков Мультимедиа в Delphi 2 17.08.2009 16:22