精华内容
下载资源
问答
  • 用Java语言编写的圆盘画法 可用于统计图 用循环实现 替换过于迅速
  • Android 手撸一个圆环信息统计控件

    千次阅读 2018-05-03 17:25:43
    对于很多应用来说都可能需要做一些数据的统计与展示,通常使用的也就是圆盘统计图和直线统计图以及折线统计图,由于android原生系统中不提供这类的控件,通常需要自己手撸一个或者使用第三方框架,有很多第三方框架...

    目录

    前言

    对于很多应用来说都可能需要做一些数据的统计与展示,通常使用的也就是圆盘统计图和直线统计图以及折线统计图,由于android原生系统中不提供这类的控件,通常需要自己手撸一个或者使用第三方框架,有很多第三方框架做的很好很炫酷,功能也很全面,但是如果让你自己手写一个改怎么实现呢?今天我来展示一下我的小思路吧。

    设计

    统计控件有很多种,我这次只写了圆环信息统计控件,首先的设计一下这个控件的样式和功能,在参考支付宝账单的圆环统计控件后,我觉得这个样式很有特色的有特殊的美感。

    效果

    设计与实现的效果如下:

    控件效果

    编写

    首先加载一个圆环统计信息必须按照每一个子项来进行加载,定义一个bean类DataItem,其中包括属性:

        /**
         * 所占值
         */
        private int value;
        /**
         * 顶部文本
         */
        private String topText;
        /**
         * 底部文本
         */
        private String bottomText;
        /**
         * 颜色
         */
        private int color;

    现在开始我们的重头戏,那就是自定义控件的工作,首先看了效果图,我们要先画圆环,由于整个大圆环由不同数据子项构成,即把每个子项进行比例运算画出每个子项对应的圆弧最后达到画出整个圆环的效果。不过第一步还是进行大小的测量,即先获得控件所占的高度和宽度,按照圆半径占控件高度比例和圆心半径所占控件高度比例,得出圆环大圆和圆心的半径。代码如下:

        /**
         * 圆半径所占控件高度比例
         */
        private float radiusRatio = 7.0f/24.0f;
        /**
         * 圆心半径所占控件高度比例
         */
        private float centerRadiusRatio = 1.0f/6.0f;
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int widthSize  = MeasureSpec.getSize(widthMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            radius = (int) (radiusRatio*heightSize);
            centerRadius = (int) (heightSize*centerRadiusRatio);
            setMeasuredDimension(widthSize,heightSize);
        }

    确定好控件的大小之后开始重写onDraw方法

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            drawItem(canvas);
            drawCenter(canvas);
            drawItemInfo(canvas);
        }

    onDraw方法中有三个方法第一绘制每个子项对应的圆弧,第二绘制环形中心颜色第三绘制每个数据子项对应的数据线和数据信息。首先看画弧:

        private void drawItem(Canvas canvas) {
            float start = 0;
            float need = 0;
            canvas.translate(getWidth()/ 2, getHeight()/ 2);
            discRect = new RectF(-radius,-radius,radius,radius);
            for (DataItem item : items) {
                mPaint.setColor(item.getColor());
                start += need;
                need = item.getValue()*1.0f/total*360.0f;
                canvas.drawArc(discRect,start,need,true,mPaint);
            }
        }

    其中start表示每个子项开始绘制的圆弧起始度数,need表示每个子项圆弧所占的度数,然后画圆弧,每个子项对应圆弧所占的度数由value和total的比例决定。
    画完圆弧之后即可绘制中心

        private void drawCenter(Canvas canvas) {
            mPaint.setColor(centerColor);
            canvas.drawCircle(0,0,centerRadius,mPaint);
        }

    代码简单即根据设定的颜色覆盖圆心区域,最后最大的难点到了,即是绘制每个子项对应的数据线和数据信息。先看效果图,每个子项对应的数据线先是一个小圆然后对应一线,如果没有数据重叠是不需要画折线的,当数据点位于顶边上圆弧的时候画折线要和画直线更好看,底部圆弧同理。当数据子项挨的很近的时候这个时候可以进行数据位置的移动让其不重叠在一起,为了简单起见,我们先写一个函数只负责根据起点和终点绘制数据线。把起点和终点确定的方法留给之后一个函数来计算和确定

    private void drawDataLine(Point start,Point end,Canvas canvas,DataItem item){
            mPaint.setColor(item.getColor());
            canvas.drawCircle(start.x,start.y,radius/20,mPaint);
            if (start.y != end.y){
                Point temp = new Point(0,end.y);
                int distance = Math.abs(start.y-end.y);
                if (distance>itemHeight){
                    distance = itemHeight;
                }
                if (start.x>0){
                    temp.x = start.x+distance;
                }else {
                    temp.x = start.x-distance;
                }
                canvas.drawLine(start.x,start.y,temp.x,temp.y,mPaint);
                start = temp;
            }
            drawText(canvas,end,item);
            canvas.drawLine(start.x,start.y,end.x,end.y,mPaint);
        }

    代码如上所述,根据起点和终点画数据线,如果线的起点和终点在一条水平线上即可画一条直线,若不在一条水平线上即画一条折线。当线条画好自然对应的文本也可绘制完成

        private void drawText(Canvas canvas,Point point,DataItem item) {
            drawText(canvas,point,item.getTopText(),true);
            drawText(canvas,point,item.getBottomText(),false);
        }
    
        private void drawText(Canvas canvas,Point point,String text,boolean isTop) {
            if (text!=null){
                float x = point.x +(point.x>0?-getAlignLength(text):0);
                float y ;
                if (isTop){
                    y = point.y - (itemHeight-textSize)/2;
                }else {
                    y = point.y + (itemHeight+textSize)/2;
                }
                canvas.drawText(text,x,y,textPaint);
            }
        }
    
        private float getAlignLength(String text){
            return textPaint.measureText(text);
        }

    绘制数据线的功能函数已经实现那么现在只需要明确好起点和终点集合,对于起点很好确定,即将圆弧对应的中线延长一点即可获取的数据线的起点,即获取圆弧的中心点的角度。按照半径的8/7获取到起点,代码如下:

        private Point getPointByAngle(float angle) {
            Point point = new Point();
            point.x = (int) (Math.cos(Math.toRadians(angle))*radius*8/7);
            point.y = (int) (Math.sin(Math.toRadians(angle))*radius*8/7);
            return point;
        }

    起点确定了,就得获取到终点,所限终点可以为起点平移到左右两侧边缘的点,但是可能会导致多个数据项的终点距离太近导致数据项信息的重叠,所以必须要进行终点位置的调整,先看代码:

        private void drawItemInfo(Canvas canvas) {
            float angle[] = new float[items.size()];
            Point point[] = new Point[items.size()];
            Stack<Point> stack = new Stack<>();
            Point endPoint = null;
            for (int i = 0; i < items.size(); i++) {
                angle[i] = items.get(i).getValue()*1.0f/total*360.0f;
                point[i] = getPointByAngle(angle[i]/2+(i>0?angle[i-1]:0));
                endPoint = getEndPoint(point[i],endPoint);
                if (i>0) angle[i] += angle[i-1];
                if ((point[i].x<0&&point[i].y>0)||(point[i].x>0&&point[i].y<0)){
                    if (!stack.isEmpty()&&!isSameQuadrant(stack.peek(),point[i])){
                        reverseDrawItemInfo(stack,i-1,canvas,null);
                        endPoint = point[i-1];
                    }
                    stack.push(point[i]);
                    if (i==items.size()-1){
                        reverseDrawItemInfo(stack,i,canvas,point[0]);
                    }
                    continue;
                }else if (!stack.isEmpty()){
                    reverseDrawItemInfo(stack,i-1,canvas,null);
                    endPoint = getEndPoint(point[i],point[i-1]);
                }
                drawDataLine(point[i],endPoint,canvas,items.get(i));
            }
        }
    
        private boolean isSameQuadrant(Point point,Point prePoint) {
            return point.x*prePoint.x>=0&&point.y*prePoint.y>=0;
        }

    这段代码中首先确定了每个数据子项的起点(point[i]),然后根据数据子项的起点来确定终点。首先我们我们看一张图:
    这里写图片描述
    圆弧绘制的起点为蓝色小点,我们可以简单的比较当前点和前一个点的终点,如果当前点与前一个点挨的太近即将当前点的终点Y坐标下移使得两点高度距离适中,但是由于绘制的方向是从第四象限开始一直到第一象限结束,所以当绘制到第三象限和第二象限时会导致数据线的重叠,应该反向绘制,这个时候采取一个Stack的数据结构即可实现,让我们先来看一下确定终点的方法,如下所示,如果距离相差不会导致重叠即可直接返回水平线对应的终点,反之距离相差太近或者终点靠近底部或顶部就就行终点位置的调整。

     private Point getEndPoint(Point point,Point prePoint) {
            if (prePoint != null&&point.x*prePoint.x>=0){
                int distance = Math.abs(prePoint.y - point.y);
                if (distance < 3*itemHeight/2||(point.y>=0
                        &&prePoint.y>point.y)||(point.y<0&&prePoint.y<point.y)){
                    Point endPoint = new Point();
                    endPoint.x = point.x>0?getWidth()/2-margin:-getWidth()/2+margin;
                    endPoint.y = point.y>=0?prePoint.y+2*itemHeight:prePoint.y-2*itemHeight;
                    return endPoint;
                }
            }
            return getEndPoint(point);
        }
    
     private Point getEndPoint(Point point){
            Point endPoint = new Point();
            endPoint.x = point.x>0?getWidth()/2-margin:-getWidth()/2+margin;
            if (Math.abs(point.y)> 5*radius/6){
                endPoint.y = point.y+(point.y>0?itemHeight:-itemHeight);
            }else {
                endPoint.y = point.y;
            }
            return endPoint;
        }

    对于二三象限即可反向绘制,代码如下:

     private void reverseDrawItemInfo(Stack<Point> stack
                ,int position,Canvas canvas,Point nextPoint){
            Point curPoint;
            while (!stack.isEmpty()){
                curPoint = stack.pop();
                nextPoint = getEndPoint(curPoint,nextPoint);
                drawDataLine(curPoint,nextPoint,canvas,items.get(position--));
            }
        }

    最后提供数据加载方法,将传入的数据,输入到List数据集合中,再更新界面即可

        public void setItems(List<DataItem> items) {
            this.items = items;
            total = 0;
            for (DataItem item : items) {
                total += item.getValue();
            }
            invalidate();
        }

    使用

    在自定义好控件之后,在Activity中配置使用,首先在xml里面添加控件

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false"
        tools:context="com.disc.MainActivity">
        <com.disc.DiscView
            android:id="@+id/disc"
            android:layout_width="match_parent"
            android:layout_height="250dp" />
    </android.support.constraint.ConstraintLayout>
    

    然后在Activity中加载模拟数据,示例如下:

            DiscView discView = findViewById(R.id.disc);
            List<DataItem> items = new ArrayList<>();
            items.add(new DataItem(1,"百度","26.56",getColor(R.color.red)));
            items.add(new DataItem(1,"腾讯","32.45",getColor(R.color.green)));
            items.add(new DataItem(1,"美团","12.36",getColor(R.color.red)));
            items.add(new DataItem(23,"Google","56.23",getColor(R.color.black)));
            items.add(new DataItem(1,"沃尔玛","45.56",getColor(R.color.red)));
            items.add(new DataItem(35,"阿里巴巴","45.56",getColor(R.color.blue)));
            items.add(new DataItem(2,"华为","45.56",getColor(R.color.black)));
            items.add(new DataItem(3,"斗鱼","45.56",getColor(R.color.blue)));
            items.add(new DataItem(4,"虎牙","45.56",getColor(R.color.yellow)));
            items.add(new DataItem(24,"京东","35.56",getColor(R.color.green)));
            items.add(new DataItem(23,"Windows","37.25",getColor(R.color.yellow)));
            items.add(new DataItem(12,"头条","334.25",getColor(R.color.blue)));
            items.add(new DataItem(13,"IBM","37.25",getColor(R.color.black)));
            items.add(new DataItem(2,"甲骨文","30.25",getColor(R.color.yellow)));
            discView.setItems(items);
    

    然后运行即可看到效果图所示效果

    源码

    如果有想需要查看源码的小伙伴可以点击这里
    因为时间问题里面还有一些小问题,并不能像开源框架一样适用各类项目如果有需要的朋友可以自行修改参数加入到自己的项目当中。如果感觉有用,请帮忙star,谢谢。

    总结

    很多人很喜欢用开源框架,其有利也有弊,为了适用于各类的项目开源框架会进行扩展提供适应于各种情形的设置,如果只是需要一些基本功能或者特定功能的轻量级控件,建议自行定义。在编写之前必须考虑各项功能的设计,在实现上可以让每个方法分工明确把关于逻辑控制操作留在一个方法中做统一处理,更有利于思路的清晰。

    展开全文
  • 图像处理-统计米粒

    千次阅读 2018-09-12 15:33:26
    练习:对一幅图片进行操作,消除亮度不一的背景,并使用阈值分割将修改后的图像转换为二值图像,使用成员标记返回图像中目标对象的个数以及统计特性。 原图像为: 程序如下所示: clear; close all; i=imread('...

    练习:对一幅图片进行操作,消除亮度不一的背景,并使用阈值分割将修改后的图像转换为二值图像,使用成员标记返回图像中目标对象的个数以及统计特性。
    原图像为:
    这里写图片描述

    程序如下所示:

    clear;
    close all;
    i=imread('rice.jpg');
    subplot(221);
    imshow(i);
    stru=strel('disk',16);%创建一个半径为16像素的圆盘形结构
    back=imopen(i,stru);%开操作
    i2=imsubtract(i,back);%将back从原始图像中减去,得到背景一致的图像
    subplot(222);
    imshow(i2);
    threshold=graythresh(i2);%得到图像的全局阈值
    bw=im2bw(i2,threshold);%将灰度图像转换为二值图像
    subplot(223);
    imshow(bw);
    [labeled number_object]=bwlabel(bw,8);%bwlabel识别二值图像中所有的相关成分
    number_object=80;
    graindata=regionprops(labeled,'basic');%regionprops获取图像中目标对象属性,并将属性保存到一个结构体数组中
    allgrain=[graindata.Area];
    max(allgrain)     %最大米粒的大小。
    mean(allgrain)    %米粒的平均大小。
    

    运行结果:

    这里写图片描述

    这里写图片描述

    若不使用数学形态学滤波 ,直接取阈值二值化,会造成米粒大小不完整,统计结果不准确。
    这里写图片描述

    ans =

    735

    ans =

    235.2716

    展开全文
  • qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出...

    qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等,目前已经应用到许多工业领域,同时qwt也致力于3d的开发。最近因工作需要循环绘制脉氧饱和度波形,费了半个月的时间,总算摸索出来了方法,废话不多说下面展示绘制出来的效果:


     

    源码地址:https://download.csdn.net/download/lxj434368832/11296496

    展开全文
  • qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出...

    qt超强绘图控件qwt - 安装及配置

    尘中远 2013-09-25 11:08:09  44806  已收藏 30

    分类专栏: C++ qt 绘图控件 文章标签: Qt 图形

    版权

     

    qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等,目前已经应用到许多工业领域,同时qwt也致力于3d的开发。但许多时候,qwt的安装配置难到了许多人,我曾经也在这里原地踏步很久,为了给大家开发方便,把我的安装经验分享给大家,避免少走点弯路。

     

    1.前言

    qwt有多强大,可以看看官网的截图:

    曲线类截图:http://qwt.sourceforge.net/curvescreenshots.html

    散点图:http://qwt.sourceforge.net/scatterscreenshots.html

    频谱及外形轮廓图:http://qwt.sourceforge.net/spectrogramscreenshots.html

    工业控件类:http://qwt.sourceforge.net/controlscreenshots.html

    其功能远不止展示的这些,还包括移动图线上的点修改图线,在画布上任意作图,另外,qwt控件最大的优点是它的灵活性,但这个灵活性也导致它偶尔会很麻烦

     

     

    MFC

     

     

    Qt

     

     

     

    2.下载最新的qwt

    如果你是使用qt5,那么需要最新版本的qwt控件,下载地址(已更新):http://sourceforge.net/projects/qwt/

    windows下编程下载zip,ubuntu下载bz2的

    还有个pdf说明文档,下不下都无所谓,因为安装包里面已经有文档了

    下面说说安装的问题

    3.安装

     

    把下载的文件解压缩放到一个固定目录里

    我在qt安装目录下面新建文件夹qtctrl,把所有第三方控件都放置在这里的

    解压完的文件如下图所示

    下面对它进行编译

    3.1 编译控件

    许多人在这里止步,在网上看到许多复杂的教程,又要写命令行又要设置啥啥啥的,其实很简单,直接双击qwt.pro这个文件,用qt Creator打开(建议用qt Creator打开)

     

    点编译(先在debug下和release模式下编译都一样),就开始编译了,你可以去上个厕所,喝杯茶,上上网

    编译完会有个错误提示

    这个正常,不用理他,只要编译输出那里没有错误提示就行

    好了,这就ok了,复杂的编译过程就是点几个鼠标而已

    编译完后会在原来的lib文件夹下生成dll和lib,同时会在目录外生成qt creator用的插件dll

    我们用到的是qwt.dll,qwt.lib,qwtd.dll,qwtd.lib。前者对应release版本,后者对应debug版本,其他文件可以删除

    在build-qwt-Desktop_Qt_5_1_1_MSVC201x_32bit-Release目录下的designer目录下的plugins目录下的designer目录下(@_@,囧rz)你会发现qwt_designer_plugin.dll和qwt_designer_plugin.lib

    这些就是配置qwt的必要文件

    3.2配置qwt

    3.2.1 集成进Qt Designer

    找到qt安装目录

     

    目录下的tools文件夹是qt creator的安装位置,里面就是QtCreator,找到QtCreator\bin\plugins\designer\文件夹下,把编译好的qwt_designer_plugin.dll放入。打开qtcreator,就能看的qwt控件了。

    拖放几个控件试着运行,这时软件肯定是编译不过的

     

    由于头文件dllqt creator都没有找到,所以肯定是编译不过的,现在又两种方法

     

    3.2.2 集成Qt Creator

    方法1:(建议使用)

    需要用到qwt的项目,打开它的pro文件

    加入如下语句:

    其中根据每个人的文件位置不一样,只需要改动第一个语句就可以,就是定位到qwt的安装位置的语句

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36

     

    #qwt设置
    QWT_ROOT = d:/Qt/qtctrl/qwt- 6. 1. 0 #这里就是你qwt控件的位置,根据每个人计算机的不同来修改,别直接ctrl+c,ctrl+v


    include( $${QWT_ROOT}/qwtfunctions.pri )


    INCLUDEPATH += $${QWT_ROOT}/src


    DEPENDPATH  += $${QWT_ROOT}/src

     

    %QWT_CONFIG  += QwtDll %如果需要使用继承时需要这句 -- 下面依次类推

    contains(QWT_CONFIG, QwtFramework) {
        LIBS      += -F$${QWT_ROOT}/lib
    }
    else {

        LIBS      += -L$${QWT_ROOT}/lib
    }
    qwtAddLibrary(qwt)
    contains(QWT_CONFIG, QwtOpenGL ) {

        QT += opengl
    }
    else {

        DEFINES += QWT_NO_OPENGL
    }
    contains(QWT_CONFIG, QwtSvg) {

        QT += svg
    }
    else {

        DEFINES += QWT_NO_SVG
    }
    win32 {
         contains(QWT_CONFIG, QwtDll) {
            DEFINES    += QT_DLL QWT_DLL
        }
    }
    #end qwt  set

     

     

    然后可以成功编译应用程序了

    方法2:(非常不建议)

    把lib文件放置qt sdk的lib文件夹下,dll文件放置在sdk的bin文件夹下

    qt sdk目录根据版本不同不一样,我的是vs2012版的,在c:\Qt\Qt5.1.1\5.1.1\msvc2012\目录下其他的同理,2010的就在Qt\Qt5.1.1\5.1.1\msvc2010\

    把qwt.dll和qwtd.dll复制到qt安装目录下的bin文件夹中

    把qwt.lib和qwtd.lib文件复制到qt安装目录的lib文件夹下

     

    把src文件夹下的头文件复制到qt安装文件夹下的include文件夹下(新建qwt文件夹)

     

    这样就可以了,但是还是不能编译成功,因为需要设置一下pro文件

    在pro文件下加入如下语句

     

    1
    2
    3
    4
    5
    6
    7
    8
    9

     

    #qwt设置
    include(d:/Qt/qwt- 6. 1. 0/qwtfunctions.pri)
    DEFINES *= QWT_DLL
    CONFIG += qwt
    LIBS += -Ld:/Qt/Qt5. 0. 2/ 5. 0. 2/msvc2010/lib-lqwt
    INCLUDEPATH += d:/Qt/qwt- 6. 1. 0/src
    DEPENDPATH += d:/Qt/qwt- 6. 1. 0/src
    qwtAddLibrary(qwt)
    #end qwt

     


     

     

    至此qwt的安装配置就完成了。

     

    qwt文件夹下有说明文档和例子,通过他们都能掌握基本的操作,这里暂不细说了

     

    注:

    当你用qt creator编译发现连接出问题时,你可以试下点“构建”-“清理所以项目”,当这个也没有反应时,你可以手动把编译的那个文件夹(默认和项目同级类似于“build-qwt-Desktop_Qt_5_1_1_MSVC201x_32bit-Release”这样的样式)全部删除。之后再编译,如果还有连接问题就是你代码有问题了。

     

    书籍推广:

     

    C++ GUI Qt 4编程(第二版) Qt中的C++技术 Qt5开发及实例 ARM9嵌入式系统设计直通车
    展开全文
  • Qt_qwt图形开发

    2013-10-12 17:45:00
    QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, ...
  • qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出...
  • qwt是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出...
  • Qwt下载安装使用教程

    千次阅读 2016-10-10 10:26:21
    Qwt详解Qwt,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据...
  • qwt的安装和移植-

    万次阅读 2014-05-14 09:53:03
    QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图。 它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, ...
  • 4147:汉诺塔问题(Hanoi)

    2020-08-26 11:19:05
    查看提交统计提示提问 总时间限制: 1000ms 内存限制: 65535kB 描述 一、汉诺塔问题 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一...
  • 递归--汉诺塔游戏

    2015-08-15 12:18:19
    1.游戏界面如下,游戏描述,把X针上的圆盘移动到 Z 针上,(圆盘放置的规则:大盘在下,小盘在上) 2.游戏分析,假设X针上有64个盘子 3.游戏代码  class Program  {  //统计移动次数  ...
  • qwt全称是"Qt Widgets for Technical Applications",是一个基于LGPL版权协议的开源项目,可生成各种统计图。 它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据,...
  • ## 一、前言QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示...
  • 一、前言QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据...
  • QWT,即Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图,是为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源...
  • Qwt应用笔记

    2017-06-21 22:01:27
    可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据,数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider...
  • QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, ...

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

圆盘统计图