• 8969阅读
  • 12回复

QList<QVector<QPointF> > fills [复制链接]

上一主题 下一主题
离线tlcugb
 

只看楼主 正序阅读 楼主  发表于: 2015-06-07
QList<QVector<QPointF> > fills;
QVector<QPointF> points;
fills.push_back(points);后加入的数据有误,但points数据没有问题,请问是怎么回事?
离线tlcugb

只看该作者 12楼 发表于: 2015-06-08
回 firebolt 的帖子
firebolt:如果是引用,QList里的元素,只是你points的引用,你points.clear()的结果,QList里的值也会跟着变. (2015-06-08 13:18) 

换成QVector<QVector<QPointF> > fills后,也points.clear();结果就不会变!
离线tlcugb

只看该作者 11楼 发表于: 2015-06-08
ok,谢谢!
离线firebolt

只看该作者 10楼 发表于: 2015-06-08
回 tlcugb 的帖子
tlcugb:我换成QVector<QVector<QPointF> > fills后,为什么QVector插入花费的时间居然比QList<QVector<QPointF> > fills这种方式少?按理说应该QList<QVector<QPointF> > fills这个花费时间较少吧! (2015-06-08 12:13) 

你从前面取数据,从后面添加数据,这样的操作vector肯定比list要快啊,vector是顺序存取啊,直接用下标寻址当然要比list快了,从中间插入就比不上list了。
离线firebolt

只看该作者 9楼 发表于: 2015-06-08
回 tlcugb 的帖子
tlcugb:谢谢,这样传存在什么问题? (2015-06-08 12:07) 

如果是引用,QList里的元素,只是你points的引用,你points.clear()的结果,QList里的值也会跟着变.
离线tlcugb

只看该作者 8楼 发表于: 2015-06-08
追问一下QVector<QVector<QPointF> > fills这种方式下, points.clear(); 这句加上就不会出现问题。谢谢
离线tlcugb

只看该作者 7楼 发表于: 2015-06-08
我换成QVector<QVector<QPointF> > fills后,为什么QVector插入花费的时间居然比QList<QVector<QPointF> > fills这种方式少?按理说应该QList<QVector<QPointF> > fills这个花费时间较少吧!
离线tlcugb

只看该作者 6楼 发表于: 2015-06-08
谢谢,这样传存在什么问题?
离线tlcugb

只看该作者 5楼 发表于: 2015-06-08
是传的引用
离线firebolt

只看该作者 4楼 发表于: 2015-06-08
我不知道QList<QVector<QPointF> > fills;这个申明中QVector<QPointF>是不是直接传引用,如果是,你 points.clear(); 后,数据的确不对。你把这句去掉试试看。
离线tlcugb

只看该作者 3楼 发表于: 2015-06-08
void Engine::handle(GeoPainterContext* context,QList<QVector<QPointF> >& fills, QVector<QPointF>& lines,int trace, int top, int bottom, bool flag)
{
    if(top >= bottom)
        return;
#define SHOT(x) SHOTS[x]
#define DATA(x) SHOT(0).TraceData[trace-1].data[x]

    //flag = true points is positive, else points is negative
    bool start(false),end(false);
    float data_1,data_2;
    double maxValue = SHOT(0).TraceData[trace-1].maxTraceData;
    QVector<QPointF> points;
    int sampleN = bottom-top;
    for(int i=0;i<sampleN;i++)
    {
        data_1 = DATA(i)/maxValue;
        data_2 = DATA(i+1)/maxValue;
        lines = context->paintFromSeismic(QPointF(trace+data_1,top+i));

        if(flag)
        {

            //第一种情况:
            /*------------------------------------
                |             |          |
             .  |           .  |       .  |
                |  .          .       .  |
            ------------------------------------*/
            if(data_1<0)
            {
                if(data_2>0)
                {
                    start = true;
                    points.push_back(context->paintFromSeismic(QPointF(trace,top+i+fabs(data_1)/(fabs(data_1)+fabs(data_2)))));
                    //若是最后一个采样点时,需多记录平衡位置上的一个点
                    if(i==bottom-1)
                    {
                        points.push_back(context->paintFromSeismic(QPointF(trace+data_2,top+i+1)));
                        points.push_back(context->paintFromSeismic(QPointF(trace,bottom)));
                        end = true;
                    }
                }
            }
            //第二种情况:
            /*------------------------------------
            |          |          |
            |  .       | .        | .
            |  .       .       .  |
            ------------------------------------*/            
            else if(data_1>0)
            {
                //若是第一个采样点时,需多记录平衡位置上的一个点
                if(i==top)
                {
                    start = true;
                    points.push_back(context->paintFromSeismic(QPointF(trace,top)));
                }

                if(data_2<0)
                {
                    points.push_back(context->paintFromSeismic(QPointF(trace+data_1,top+i)));
                    points.push_back(context->paintFromSeismic(QPointF(trace,top+i+fabs(data_1)/(fabs(data_1)+fabs(data_2)))));
                    end = true;
                }
                else if(data_2==0)
                {
                    points.push_back(context->paintFromSeismic(QPointF(trace+data_1,top+i)));
                    end = true;
                }
                else
                {
                    points.push_back(context->paintFromSeismic(QPointF(trace+data_1,top+i)));
                    if(i==bottom-1)
                    {
                        points.push_back(context->paintFromSeismic(QPointF(trace+data_2,top+i+1)));
                        points.push_back(context->paintFromSeismic(QPointF(trace,bottom)));
                        end = true;
                    }
                }
            }

            //第三种情况
            /*------------------------------------
            |           |          |
            .           .          .
            |  .      . |          .
            ------------------------------------*/
            else
            {
                if(data_2>0)
                {
                    start = true;
                    points.push_back(context->paintFromSeismic(QPointF(trace,top)));
                    points.push_back(context->paintFromSeismic(QPointF(trace+data_2,top+i+1)));

                    if(i==bottom-1)
                    {
                        points.push_back(context->paintFromSeismic(QPointF(trace,bottom)));
                        end = true;
                    }
                }
            }

            //只要同时有开始标识和结束标识时,才构成一个多边形点集合。
            if(start && end)
            {
                fills.push_back(points);

                points.clear();
                start = false;
                end = false;
            }
        }
}


经调试,在此语句中fills.push_back(points);出现的结果有误。
谢谢

离线dbzhang800

只看该作者 2楼 发表于: 2015-06-07
请给出可重现问题的,最小的,完整的,测试代码。
离线tlcugb

只看该作者 1楼 发表于: 2015-06-07
有人清楚这个情况不?
快速回复
限100 字节
 
上一个 下一个