Построение шариков, квадратиков и т.д. (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));

Получили: