Russian Qt Forum
Ноябрь 01, 2024, 01:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рисуем 2d грфик painter правильно через матрицу преобразования  (Прочитано 1417 раз)
daimon
Гость
« : Июнь 10, 2011, 19:36 »

Как заюзать для пеинтера класс QTransform, чтобы самому не выводить формулы для преобразования логических координат графика в виджета? график типа
2 3
4 5
-10 3

при этом график должен распологатся от 50 пикселей от рамки виджета и имень координатную ось в виде прямоугольника с осями слева и внизу, низ для y = 3 верх 5  

а то приходится так рисовать
Код
C++ (Qt)
for(int j=0;j<  set.curves.size();j++)
{
 
 
if(set.curves[j].show_graph_one)
for(int i=0; i<set.curves[j].table.size();i++)
{
 
set.curves[j].table[i].x_widget = x_widget(set.curves[j].table[i].x_tabl, set);
set.curves[j].table[i].y_widget = y_widget(set.curves[j].table[i].y_tabl,set);
 
if(i>0)
{
QPen penLineGraph;
penLineGraph.setStyle(m_CSettings2DGraph.curves[j].type_line_graph);
penLineGraph.setColor(m_CSettings2DGraph.curves[j].color_line_graph);
penLineGraph.setWidth(m_CSettings2DGraph.curves[j].width_line_graph);
 
painter->setPen(penLineGraph);
 
painter->drawLine(x_widget(set.curves[j].table[i-1].x_tabl, set, true)  ,y_widget(set.curves[j].table[i-1].y_tabl,set,true),
x_widget(set.curves[j].table[i].x_tabl, set,true),y_widget(set.curves[j].table[i].y_tabl,set,true));
}
 
 
 
}
 
}
 
/////////////////////
double CGraph2DPlotter::y_widget(double y_tabl_, const CGraph2DSettings &set, bool line)
{
 
 
double dy = y_tabl_ - set.minY_graph_all;
 
 
double y = set.rect.bottom() - (dy * (set.rect.height() - 1)
/ (set.maxY_graph_all - set.minY_graph_all));
 
if(  y < - std::numeric_limits<int>::max()) y = - std::numeric_limits<int>::max();
else if(  y > std::numeric_limits<int>::max()) y = std::numeric_limits<int>::max();
 
return y;
}
 
double CGraph2DPlotter::x_widget(double x_tabl_,const CGraph2DSettings &set, bool line)
{
 
 
double dx = x_tabl_ - set.minX_graph_all;
   double x =  set.rect.left() + (dx * (set.rect.width() - 1)
/ (set.maxX_graph_all - set.minX_graph_all));
 
if( x < - std::numeric_limits<int>::max()) x = - std::numeric_limits<int>::max();
else if( x > std::numeric_limits<int>::max()) x = std::numeric_limits<int>::max();
 
return x;
 
}
 
 

это только линии, точки чуток по другому, но суть таже
« Последнее редактирование: Июнь 10, 2011, 19:45 от daimon » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.152 секунд. Запросов: 20.