查找重叠和下采样散点图
find overlap and downsample scatter plot
我有大量由点 (x,y) 组成的数据,需要在散点图中显示。
为了找到重叠并消除相同点之间的不可见差异,我编写了以下代码:
void DownSampler::makeDownSample(QVector<double> keys,QVector<double> values, QVector<int> pixmapIdx, QSize resolution, sViewSize view)
{
m_calculating = true;
QTime now = QTime::currentTime();
QMap<QPair<double, double>,int> downsampledMap;
QSizeF stepValue( ( view.maxHorizontal - view.minHorizontal ) * m_downSampleRatio / (resolution.width() ),
( view.maxVertical - view.minVertical ) * m_downSampleRatio/ (resolution.height() ) ) ;
for(int index = 0 ; index < keys.size() ; index++)
{
keys[index] = round((keys[index]) / stepValue.width());
keys[index] *= stepValue.width();
values[index] = round(values[index] / stepValue.height());
values[index] *= stepValue.height();
//remove same items
if((keys[index] >= view.minHorizontal) && (keys[index] <= view.maxHorizontal)) {
if((values[index] >= view.minVertical) && (values[index] <= view.maxVertical)) {
QPair<double, double> pairValue = qMakePair(keys[index], values[index]);
if(!downsampledMap.contains(pairValue)){
downsampledMap.insert(pairValue, pixmapIdx[index]);
}
}
}
}
QVector<int> retPixmapIdx;
QVector<double> retKey, retValue;
for(QMap<QPair<double, double>,int>::iterator iter = downsampledMap.begin() ; iter != downsampledMap.end() ; ++iter)
{
retKey.append(iter.key().first);
retValue.append(iter.key().second);
retPixmapIdx.append(iter.value());
}
emit downSampledPlotReady(retKey, retValue, retPixmapIdx);
m_calculating = false;
// qDebug() << __FUNCTION__ << "firstPointSize ==> "<< keys.size() << "downsampledSize ==> " << retKey.size() << "time ==> " << now.msecsTo(QTime::currentTime());
}
如您所见,首先,我将所有位置四舍五入到期望呈现数据的像素大小步长,然后迭代所有创建的框和 return 创建的框列表。
根据这段代码,每个框都可以包含很多点,我们 return 只是一个位置,因此重叠点被删除了。
这是我的手写代码,但我认为它没有达到预期的最佳性能。
我的问题是:
1-是否有像我们的依赖项那样收集所有分散数据的库或算法?
2- 我们的源代码有改进吗?
2D方面的点云库和Grid Voxel可以完美处理和下采样点云。
我有大量由点 (x,y) 组成的数据,需要在散点图中显示。
为了找到重叠并消除相同点之间的不可见差异,我编写了以下代码:
void DownSampler::makeDownSample(QVector<double> keys,QVector<double> values, QVector<int> pixmapIdx, QSize resolution, sViewSize view)
{
m_calculating = true;
QTime now = QTime::currentTime();
QMap<QPair<double, double>,int> downsampledMap;
QSizeF stepValue( ( view.maxHorizontal - view.minHorizontal ) * m_downSampleRatio / (resolution.width() ),
( view.maxVertical - view.minVertical ) * m_downSampleRatio/ (resolution.height() ) ) ;
for(int index = 0 ; index < keys.size() ; index++)
{
keys[index] = round((keys[index]) / stepValue.width());
keys[index] *= stepValue.width();
values[index] = round(values[index] / stepValue.height());
values[index] *= stepValue.height();
//remove same items
if((keys[index] >= view.minHorizontal) && (keys[index] <= view.maxHorizontal)) {
if((values[index] >= view.minVertical) && (values[index] <= view.maxVertical)) {
QPair<double, double> pairValue = qMakePair(keys[index], values[index]);
if(!downsampledMap.contains(pairValue)){
downsampledMap.insert(pairValue, pixmapIdx[index]);
}
}
}
}
QVector<int> retPixmapIdx;
QVector<double> retKey, retValue;
for(QMap<QPair<double, double>,int>::iterator iter = downsampledMap.begin() ; iter != downsampledMap.end() ; ++iter)
{
retKey.append(iter.key().first);
retValue.append(iter.key().second);
retPixmapIdx.append(iter.value());
}
emit downSampledPlotReady(retKey, retValue, retPixmapIdx);
m_calculating = false;
// qDebug() << __FUNCTION__ << "firstPointSize ==> "<< keys.size() << "downsampledSize ==> " << retKey.size() << "time ==> " << now.msecsTo(QTime::currentTime());
}
如您所见,首先,我将所有位置四舍五入到期望呈现数据的像素大小步长,然后迭代所有创建的框和 return 创建的框列表。 根据这段代码,每个框都可以包含很多点,我们 return 只是一个位置,因此重叠点被删除了。 这是我的手写代码,但我认为它没有达到预期的最佳性能。 我的问题是: 1-是否有像我们的依赖项那样收集所有分散数据的库或算法? 2- 我们的源代码有改进吗?
2D方面的点云库和Grid Voxel可以完美处理和下采样点云。