Построение шариков, квадратиков и т.д. (QT, аналогично TChart Bubbles)
Так уж получилось, что в QwtPlot нету готового компонента для рисования bubbles - как, например, в TChart от Borland (Delphi). Но не беда. Все это можно сделать вручную, причем не очень сложным путем.
Если вам неважен масштаб bubble по отношению к qwt plot, можно использовать класc QwtSymbol. Для этого вначале нужно набросать точек в QwtPlotCurve (советую сначала прочитать вот это):
#include "qwt_plot_curve.h"
#include"qmath.h"
QwtPlotCurve *curve = new QwtPlotCurve; QVector<QPointF> *points = new QVector<QPointF>; for (float i=0; i <= 10; i += 0.1) points->append(QPointF(i, qSin(i))); curve->setSamples(*points); curve->attach(ui->qwtPlot);
И для того, чтобы отключить автоматическое соединение линиями точек кривой, допишем:
curve->setStyle(QwtPlotCurve::Dots);
Теперь создадим символ:
#include "qwt_symbol.h"
QwtSymbol *symbol = new QwtSymbol; symbol->setStyle(QwtSymbol::Ellipse); //задаем стиль - в данном случае - кружки symbol->setSize(10); //задаем размер в пикселях
Теперь подключаем символ к кривой:
curve->setSymbol(symbol);
У метод setStyle можно передать разные аргументы - для построения кругов, квадратов, крестиков, шестиугольников и т.д: QwtSymbol::Cross (крестики), QwtSymbol::Diamond (ромбики), QwtSymbol::Ellipse (круги), QwtSymbol::Hexagon (шестиугольники), QwtSymbol::HLine (линии), QwtSymbol::LTriangle ("левосторонние" треугольники), QwtSymbol::RTriangle ("правосторонные" треугольники), QwtSymbol::Star1, QwtSymbol::Star2 (звездочки ) и т.д.
Можно разукрасить символы - логика такая же, как и в графиках, гистограммах:
symbol->setBrush(QBrush(QColor(100,200,150)));
symbol->setPen(QPen(QColor(50,50,50)));
Получили:
Увы, для создания bubbles в масштабе QwtPlot средств QwtPlot не предусмотрено. Но можно написать свою не очень сложную функцию для отрисовки хотя бы кружков.
У меня получилось вот такое:
QVector<QPointF> сircle(float x, float y, float r){
QVector<QPointF> vector1;
for (float i = 0; i <= 3.14/2; i += 0.1){
sin = qSin(i);
cos =qCos(i);
vector1.append(QPointF(x + r*cos, y + r*sin));
vector1.append(QPointF(x + r*cos, y - r*sin));
vector1.append(QPointF(x - r*cos, y + r*sin));
vector1.append(QPointF(x - r*cos, y - r*sin));
}
return vector1;
}
Входные параметры функции - положение x, y кружка и его радиус r в масштабе QwtPlot. Функция будет полезной при моделировании, например, газа, с учетом радиуса атомов.
Если немного доработать, можно так же дописать и возможность рисовать другие фигуры в масштабе QwtPlot.
Функция возвращает вектор, у котором находятся точки кружка. Можно управлять плотностью заполнения и другими параметрами подправив функцию. Стоит отметить, что она немного оптимизирована - так как синус и косинус достаточно тяжелые функции, мы просчитываем их один раз на шагу цикла, причем значения только от 0 до ?/4 и зеркально отображаем.
Теперь, чтобы набросать кружков, в цикле на добавление точек в QVector напишем:
for (float i = 0; i <= 10; i += 0.1)
points->operator+=(circle(i ,qSin(i), 0.1));
Получили: