Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: daimon от Июнь 10, 2011, 19:36



Название: Рисуем 2d грфик painter правильно через матрицу преобразования
Отправлено: 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;
 
}
 
 

это только линии, точки чуток по другому, но суть таже