crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Пересечение визира с графиком
AD
  опции профиля:
сообщение 23.7.2009, 10:05
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Подскажите, пожалуйста, как определить пересечение визира с графиком. Вот для наглядности рисунок:
[attachment=718:viewfinder.JPG]
Мне хотя бы саму идею, алгоритм узнать. А то пока - никаких идей нет....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 5)
BRE
  опции профиля:
сообщение 23.7.2009, 10:20
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 23.7.2009, 11:05) *
Мне хотя бы саму идею, алгоритм узнать. А то пока - никаких идей нет....

А по какой функции график рисуется? Или откуда данные берутся?

Сообщение отредактировал BRE - 23.7.2009, 10:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 23.7.2009, 10:21
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 23.7.2009, 11:20) *
А по какой функции график рисуется? Или откуда данные берутся?

Разбор лог-файла. Оттуда считываю данные. По этим данным и строю график. Технология та еще....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.7.2009, 10:30
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 23.7.2009, 11:21) *
Разбор лог-файла. Оттуда считываю данные. По этим данным и строю график. Технология та еще....

У тебя есть коллекция значений Y при определенном X, которые ты соединяешь прямыми?
Формулу прямой знаем, выбираем координаты начала и конца линии из диапазона в котором визир. Подставляем их в формулу и получаем значение Y.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 23.7.2009, 10:46
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 23.7.2009, 11:30) *
У тебя есть коллекция значений Y при определенном X, которые ты соединяешь прямыми?

Да. Спасибо, попробую....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.7.2009, 15:26
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Что-то конкретно не то выходит. Подскажите, где ошибка.

drawing
/// Отображение координат пересечения с визиром
void GraphicDisplay::viewCoordViewfinder(const QVector<SpecPointF>& data, int index, const QPointF& pnt)
{
    if(!v_viewfinderAction -> isChecked() && !h_viewfinderAction -> isChecked())
        return;
    int graphic_x = data[index].x(), graphic_y = data[index].y();
    foreach(VFFrame* pf, viewfinderList)
    {
        int frame_x = pf -> x(), frame_y = pf -> y();
        if(pf -> frameShape() == QFrame::VLine && v_viewfinderAction -> isChecked())
            if(fabs((double)(pf -> x() - graphic_x)) <= 3.)
            {
                QPointF coord(frame_x + 10., pnt.y() - 10.);
                QPen oldPen(painter.pen());
                painter.setPen(Qt::black);
                painter.drawText(coord, QString::number(pnt.x()));
                painter.setPen(oldPen);
            }
        else if(pf -> frameShape() == QFrame::HLine  && h_viewfinderAction -> isChecked())
            if(fabs((double)(pf -> y() - graphic_y)) <= 3.)
            {
                QPointF coord(pnt.x() + 10., frame_y - 10.);
                QPen oldPen(painter.pen());
                painter.setPen(Qt::black);
                painter.drawText(coord, QString::number(pnt.x()));
                painter.setPen(oldPen);
            }
    }    
}


/// Отрисовка графика
void GraphicDisplay::drawCurves(QPainter* painter)
{
    if(!paramsDisplay -> rect().isValid())    return;
    painter -> setClipRect(paramsDisplay -> rect().adjusted(1, 1, -1, -1));

    QMapIterator<int, QVector<SpecPointF>> iter(curveMap);
    int k = 1;
    while(iter.hasNext())
    {
        iter.next();        int id = iter.key();
        if(fact_prm.size() == 0 || id >= fact_prm.size()) break;
        if(settings.win_type != fact_prm[id].type) continue;

        QString x_dimension(fact_prm[id].dimension[language_flag].toLower());
        double x_dim = (metric_map[x_dimension]) ? metric_map[x_dimension] : 1.0;
        QString y_dimension(fact_prm[id].y_dim[language_flag].toLower());
        double y_dim = (metric_map[y_dimension]) ? metric_map[y_dimension] : 1.0;
        myPen.setColor(fact_prm[id].param_color);
        painter -> setPen(myPen);

        const QVector<SpecPointF>& data = iter.value();
        QPolygonF polyline(0);
        for(int j=0; j<data.size(); ++j)
        {
            double x = (settings.win_type != COUNTPARAM) ? data[j].x() * x_dim : data[j].x();
            double y = data[j].y() * y_dim;
            QPointF pnt(initXY(x, y));
            if(isExistPhase(data[j]))
                if(!polyline.isEmpty())
                {
                    if(pnt.x() > polyline.last().x())
                    {
                        setPenForLine(j);
                        painter -> setPen(myPen);
                        if(j > 0 && isExistPhase(data[j - 1]))
                        {
                            painter -> drawLine(polyline.last(), pnt);
                            viewCoordViewfinder(data, j, pnt);
                        }
                        polyline.append(pnt);
                    }
                }
                else polyline.append(pnt);
        }
        drawLegend(painter, paramsDisplay -> rect(), k, id);
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.12.2024, 14:34