Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: daimon от Март 29, 2010, 21:43



Название: Построение графиков
Отправлено: daimon от Март 29, 2010, 21:43
Имеет ли смысл сортировать вектор координат (математических) для построения графика?
Или тогда теряется смысл графика?


Название: Re: Построение графиков
Отправлено: Karl-Philipp от Март 29, 2010, 23:47
Имеет ли смысл сортировать вектор координат (математических) для построения графика?
Или тогда теряется смысл графика?
Если график только для отрисовки, то смысл его сортировать?
В принципе отсортировать можно, если не будет соединительных линий между точками :-)
Есть

struct tabl
{
double x,y;
}

///

QVector<tabl> table

QVector<tabl>::iterator it;


Как получить значения из итератора it?

Доступ к элементам структуры с помощью итератора:
(*it).x


Название: Re: Построение графиков
Отправлено: daimon от Март 29, 2010, 23:54
Как перебрать все стандартные цвета в Qt:: с помощью rand() % x?
всего цветов 18
Какой x?

Для цветов мне нужно только число типа int.

Как вызвать по числу типа int чёрный цвет?
QColor(Qt::black), а по числу как


Название: Re: Построение графиков
Отправлено: JayFOX от Март 30, 2010, 00:12
Код:
QStringList QColor::colorNames ()   [static]
ну и
Код:
QStringList list = QColor::colorNames();
list.at(rand()%list.count());


Название: Re: Построение графиков
Отправлено: daimon от Март 30, 2010, 00:18
Код:
QStringList QColor::colorNames ()   [static]
ну и
Код:
QStringList list = QColor::colorNames();
list.at(rand()%list.count());
А как перевести число 7 в пространство имен Qt и загнать QColor(Qt::.......?


Название: Re: Построение графиков
Отправлено: JayFOX от Март 30, 2010, 00:23
А зачем Qt::..
list.at(7) вернет имя цвета
тогда QColor(list.at(7))


Название: Re: Построение графиков
Отправлено: daimon от Март 30, 2010, 00:31
А зачем Qt::..
list.at(7) вернет имя цвета
тогда QColor(list.at(7))
Зачем использовать список-лишняя память.


Название: Re: Построение графиков
Отправлено: lit-uriy от Март 30, 2010, 00:31
>>Или тогда теряется смысл графика?
Смотря что в векторе, если номеру позиции в векторе соответсвует координата Х, а значению в этой позиции - координата Y.
То конечно ты испортишь график


Название: Re: Построение графиков
Отправлено: daimon от Март 30, 2010, 00:36
>>Или тогда теряется смысл графика?
Смотря что в векторе, если номеру позиции в векторе соответсвует координата Х, а значению в этой позиции - координата Y.
То конечно ты испортишь график
Сортиррую я строками вектора по х


Название: Re: Построение графиков
Отправлено: daimon от Март 30, 2010, 00:39
graph_line.setColor(QColor(int(rand()%256),int(rand()%256),int(rand()%256))); а если так


Название: Re: Построение графиков
Отправлено: daimon от Март 30, 2010, 01:16
Как отобрать только 12-13 цветов (без оттенков)?


Название: Re: Построение графиков
Отправлено: voronElf от Март 30, 2010, 05:32
Видимо, инициализировать список цветов нужными(понравившимися) цветами и выбирать из него


Название: Re: Построение графиков
Отправлено: daimon от Март 30, 2010, 23:14
QColor(Qt::red) - красный цвет, значение 7, а как записать, чтобы отправлять в QColor число 7 и была иниционализация красным цветом.


Название: Re: Построение графиков
Отправлено: ieroglif от Март 31, 2010, 00:51
прочитайте любую книгу из серии "С++ за 21 день" или "С++ для чайников" - это вам, Даймон, будет 100крат полезнее, и на многие другие вопросы вы тоже получите ответы автоматически ;)


Название: Re: Построение графиков
Отправлено: daimon от Апрель 03, 2010, 14:16
есть

Код
C++ (Qt)
///////////////класс координаты (точки)
struct tabl
{
tabl& tabl::operator = (const tabl &Other)
{
// Присваивание - не константный результат!!!!!
this->x_tabl = Other.x_tabl;
this->y_tabl = Other.y_tabl;
this->x_widget = Other.x_widget;
this->y_widget = Other.y_widget;
return *this;
}
 
inline bool tabl::operator == (const tabl &Other) const
{
// Равенство, константный метод
return ((this->x_tabl == Other.x_tabl) && (this->y_tabl == Other.y_tabl )&& (this->x_widget==Other.x_widget) && (this->y_widget==Other.y_widget));
}
inline bool tabl::operator < (const tabl &Other) const
{
if(this->x_tabl == Other.x_tabl)
return (this->y_tabl <Other.y_tabl);
 
return (this->x_tabl < Other.x_tabl);
}
 
double x_tabl;
double y_tabl;
double x_widget;
double y_widget;
tabl(){x_tabl=0; y_tabl=0; x_widget=0; y_widget=0;}
 
tabl(double x_tabl_,double y_tabl_,double x_widget_=0,double y_widget_=0)
{
x_tabl = x_tabl_;
y_tabl = y_tabl_;
x_widget =x_widget_;
y_widget = y_widget_;
}
 
 
};
 
//////////////////////////////////////////класс одной кривой
class Data
{
public:
QVector<tabl>table;
 
 
double maxX_graph_one;
double minX_graph_one;
double minY_graph_one;
double maxY_graph_one;
int count_point_in_tabl;
 
Data()
{
 
}
Data(QVector<tabl> table_)
{
 
table=table_;
 
defaultSettings();
 
 
 
 
}
void set_vector_table(QVector<tabl> table_)
{
table = table_;
defaultTable();
}
void defaultTable()
{
maxY_graph_one=table[0].y_tabl;
minY_graph_one=table[0].y_tabl;
 
minX_graph_one = std::min_element(table.begin(),table.end())->x_tabl;
maxX_graph_one = std::max_element(table.begin(),table.end())->x_tabl;
 
for(int i=0;i<count_point_in_tabl;i++)
{
           if(maxY_graph_one <=(table[i].y_tabl)) maxY_graph_one=(table[i].y_tabl);
if(minY_graph_one >= (table.at(i).y_tabl)) minY_graph_one = (table.at(i).y_tabl);
}
}
};
 
//////////////класс координатной плоскости, где накладываются кривые
class SettingsGraph
{
public:
 
double stepX;
double stepY;
double minX_graph_all;
double minY_graph_all;
double maxX_graph_all;
double maxY_graph_all;
 
QVector<Data> curves;
 
public:
SettingsGraph()
{
 
}
SettingsGraph(QVector<Data> curves_)
{
if(curves_!=curves)
curves = curves_;
 
 
 
}
void add_curves_one(Data graph_)
{
curves.push_back(graph_);
calculate_Min_Max();
 
}
void delete_curves_one(double number_)
{
curves.remove(number_);
calculate_Min_Max();
 
}
 
void calculate_Min_Max()
{
int countGraph=curves.size();
minX_graph_all=0;
maxX_graph_all=0;
minY_graph_all=0;
maxY_graph_all=0;
 
for(int i=0;i<countGraph;i++)
{
if(maxY_graph_all<=(curves[i].maxY_graph_one)&&curves[i].visible_graph_one) maxY_graph_all=(curves[i].maxY_graph_one);
 
if(minY_graph_all>=(curves[i].minY_graph_one)&&curves[i].visible_graph_one) minY_graph_all=(curves[i].minY_graph_one);
 
if(maxX_graph_all<=(curves[i].maxX_graph_one)&&curves[i].visible_graph_one) maxX_graph_all=(curves[i].maxX_graph_one);
 
if(minX_graph_all>=(curves[i].minX_graph_one)&&curves[i].visible_graph_one) minX_graph_all=(curves[i].minX_graph_one);
 
}
 
 
if(minX_graph_all == maxX_graph_all&& minY_graph_all == maxY_graph_all)
{
defaultAces();
return ;
}
 
}
//////////////////////////////////////////////////////////////////////////////
Вопрос

при вызове add добавляются кривая, graph-объект класса SettingsGraph

Код
C++ (Qt)
void Plotter::add(double x,double y)
{
Data data_;
QVector<tabl> tabl_;
 
tabl_.push_back(tabl(x,y));
data_.set_vector_table(tabl_);
graph.add_curves_one(data_);
 
}

Проблема- при удалении крывой из вектора curves класса SettingsGraph происходит прикол
например, есть 2 точки (-1000,2) (3,100)

вызову 2 раза подряд add(-1000,2) add(3,100)
в итоге в curves будет 2 элемента

-      curves   [2]
-      
  •    
      
+      table   [1]({x_tabl=-1000.0000000000000 y_tabl=2.0000000000000000 x_widget=0.00000000000000000 ...})   QVector<tabl>
      maxX_graph_one   -1000.0000000000000   double
      minX_graph_one   -1000.0000000000000   double
      minY_graph_one   2.0000000000000000   double
      maxY_graph_one   2.0000000000000000   double
      
-      [1]   
      
+      table   [1]({x_tabl=3.0000000000000000 y_tabl=100.00000000000000 x_widget=0.00000000000000000 ...})   QVector<tabl>
      maxX_graph_one   3.0000000000000000   double
      minX_graph_one   3.0000000000000000   double
      minY_graph_one   100.00000000000000   double
      maxY_graph_one   100.00000000000000   double
      
////////////////////////////////////////////

вызвав функцию graph.delete_curves_one(0);
получаю

-      curves   [1]
-      
  •    
+      table   [1]({x_tabl=3.0000000000000000 y_tabl=100.00000000000000 x_widget=0.00000000000000000 ...})   QVector<tabl>
      maxX_graph_one   -1000.0000000000000   double
      minX_graph_one   -1000.0000000000000   double
      minY_graph_one   2.0000000000000000   double
      maxY_graph_one   2.0000000000000000   double


Как решить прикол с вектором curves - удаление элементов происходит неправильно??




Название: Re: Построение графиков
Отправлено: ieroglif от Апрель 03, 2010, 15:55
извини, ломает разбираться с твоим кодом.

Код:
void MyDrawWidget::paintEvent(QPaintEvent *) {
  QMap<int, QVector<QPoint> > graphs; //думаю, ты догадаешься как сделать этот массив глобальным ;)
  QPainter painter(this);
  painter.setWindow( this->minX, this->maxY, (this->maxX - this->minX), (this->maxY - this->minY) ); //замечательная функция - позволяет задавать свои собственные координаты рисования. перевод координат из "собственных" в "экранно-оконные" берёт на себя Qt.
  DrawGrid(&painter); //надеюсь что сетку ты тоже сможешь сам нарисовать ;)
  if ( graphs.count() > 0 ) {
    QMap<int, QVector<QPoint> >::const_iterator i = graphs.constBegin();
    while ( i != graphs.constEnd() ) {
      painter.drawLines( i.value() ); //да да.. рисует линию по массиву точек..
      i++;
    }
  }
}

ну что после этого остаётся? =) ну разве что поизвращаться с кешированием "отрисованного" графика (дабы потом не отрисовывать ещё раз)... ну уж точно не извращаться с придумыванием своего класса для координаты точки и хранения этих координат в массиве ;)


Название: Re: Построение графиков
Отправлено: daimon от Апрель 03, 2010, 16:06
Я решил - в перегрузку = Data добавил всё для мин макс


Название: Re: Построение графиков
Отправлено: daimon от Апрель 03, 2010, 16:08
QMap больше памяти жрёт чем вектор


Название: Re: Построение графиков
Отправлено: ieroglif от Апрель 03, 2010, 16:27
ты меня извини, конечно, но напиши для начала что-то работающее, а потом уже разбирайся с быстродействием/памятью ;)


Название: Re: Построение графиков
Отправлено: daimon от Апрель 03, 2010, 18:37
vector<int> лучше, чем QMap<int,int>


Название: Re: Построение графиков
Отправлено: daimon от Апрель 05, 2010, 22:12
Что лучше каждый раз перерисовывать pixmap и его рисовать или нарисовать один pixmap и его трансформировать (сохраняя пропорции)? img=pixmap.scaled(size().width(),size().height(),Qt::KeepAspectRatio,Qt::SmoothTransformation);

Можна как-то уменьшить уровень сглаживания?

Проблема- трансформируя средствами Qt - или слишком топорно или слишком сглажено, почему нельзя получить такой pixmap, который изначально рисует painter

По моему мнению трансформацией можна оптимизировать отрисовку максимально - 10000 точек - без тормозов при изменении размера окна, что не скажешь про постоянную отрисовку QPainter (все оси, кривые, подписи)


Название: Re: Построение графиков
Отправлено: daimon от Апрель 06, 2010, 21:20
Есть ли возможность залить QPixmap прозрачным фоном


Название: Re: Построение графиков
Отправлено: dnc2rt от Апрель 07, 2010, 07:33
Прочитай QPixmap в нем про alpha канал рассказано.


Название: Re: Построение графиков
Отправлено: ieroglif от Апрель 07, 2010, 10:27
daimon, ты уже написал что-то работающее? если ещё нет - в хелпе есть абсолютно всё, что тебе надо - прекрати напрягать вопросами, ответы на которые нормальный программист пойдёт читать в хелп. если уже да и размышляешь над архитектурой приложения, быстродействием и оптимизацией - то велкам. расскажи что у тебя есть сейчас и что тебя в этом не устраивает (и где тормозной момент - его то мы тоже не телепаты угадывать).


Название: Re: Построение графиков
Отправлено: daimon от Апрель 07, 2010, 20:56
Тормозной момент только один - перерисовка всего QPixmap при изменении размера окна - при любом коде(при 10 точках летает, 10000-тормоза). Так вопрос у меня один - что-то есть толковое для такого (алгоритм)


Название: Re: Построение графиков
Отправлено: ieroglif от Апрель 08, 2010, 17:21
а зачем перерисовывать всё? перерисовывай только то, что попадает в отображаемый  регион
ну и вообще - 10к точек всегда будут отрисовываться медленнее 10и.