标题:将一维数组转化成曲线图
只看楼主
k_tide
Rank: 2
等 级:论坛游民
帖 子:22
专家分:15
注 册:2012-1-2
得分:0 
新人    长见识了    谢谢提问者   谢谢版主
2012-03-26 22:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
程序代码:
#include <Windows.h>
#include <ctime>
#include <conio.h>

const int MaxValue(100);
const RECT Border = { 10, 10, 620, 350 };
const POINT Origin = { 20, 170 };

void CreateData(int* pData, const size_t Count);

void wmain(void)
{
    int Data[50];
    CreateData(Data, _countof(Data));    // 你修改Data[]的数据就可以了

    HDC hDC(GetDC(GetConsoleWindow()));
    HPEN hPen(CreatePen(PS_SOLID, 1, RGB(0, 255, 0)));
    HBRUSH hBrush(CreateSolidBrush(RGB(0, 0, 0)));
    SelectObject(hDC, hPen);
    SelectObject(hDC, hBrush);
    Rectangle(hDC, Border.left, Border.top, Border.right, Border.bottom);
    hPen = CreatePen(PS_SOLID, 1, RGB(0, 255, 255));
    SelectObject(hDC, hPen);
    MoveToEx(hDC, Origin.x, Origin.y, NULL);
    LineTo(hDC, Border.right - 10, Origin.y);
    hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
    SelectObject(hDC, hPen);
    MoveToEx(hDC, Origin.x, Origin.y - Data[0], NULL);
    for (size_t i = 1; i != _countof(Data); ++i)
    {
        LineTo(hDC, Origin.x + i * 10, Origin.y - Data[i]);
    }

    _getwch();

    DeleteObject(hBrush);
    DeleteObject(hPen);
    ReleaseDC(NULL, hDC);
}

void CreateData(int* pData, const size_t Count)
{
    srand(static_cast<unsigned int>(_time32(NULL)));
    rand();
    for (size_t i = 0; i < Count; ++i)
    {
        *pData++ = static_cast<int>(MaxValue * static_cast<double>(rand()) / (RAND_MAX + 1));
    }
}

这个没有使用自编的库,你可以编译的。Windows API GDI的图形库,而且是对控制台输出的,相当于TC的Graphics模式。

下面是运行效果:


请参考:https://bbs.bccn.net/thread-364436-1-1.html

[ 本帖最后由 TonyDeng 于 2012-3-27 02:16 编辑 ]

授人以渔,不授人以鱼。
2012-03-26 23:50
kyauto
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-8
得分:0 
回复 9楼 TonyDeng
对的,就是这种
2012-03-27 20:20
kyauto
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-8
得分:0 
回复 12楼 TonyDeng
我试试把数组数据改了,看能不能得到我想要的曲线
谢谢斑竹对后学的帮助
2012-03-27 20:27
kyauto
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-8
得分:0 
程序代码:
程序基本看懂了,得到了我想要的曲线
主程序(作图):

#include <Windows.h>
#include <ctime>
#include <conio.h>
const int MaxValue(100);
const RECT Border = { 20, 20, 620, 350 };//const RECT Border = { 10, 10, 620, 350 };
const POINT Origin = { 20, 170 };
const POINT Sp = { 20, 70 };
#define N 500
struct arrar stepmain();
struct arrar
{
    float y[N];
};
void wmain(void)
{
    float Data[N];
    struct arrar p;
    p=stepmain();
    int i;
    for(i=0;i<N;i++)
    {
       
        Data[i]=p.y[i];
       
    }

    HDC hDC(GetDC(GetConsoleWindow()));
    HPEN hPen(CreatePen(PS_SOLID, 1, RGB(233, 19, 7)));
    HBRUSH hBrush(CreateSolidBrush(RGB(52, 184, 72)));
    SelectObject(hDC, hPen);
    SelectObject(hDC, hBrush);
    Rectangle(hDC, Border.left, Border.top, Border.right, Border.bottom);
    hPen = CreatePen(PS_SOLID, 1, RGB(54, 54, 182));
    SelectObject(hDC, hPen);
    MoveToEx(hDC, Origin.x, Origin.y, NULL);
    LineTo(hDC, Border.right, Origin.y);
    hPen = CreatePen(PS_SOLID, 1, RGB(98, 24, 102));
    SelectObject(hDC, hPen);
    MoveToEx(hDC, Sp.x, Sp.y, NULL);
    LineTo(hDC, Border.right, Sp.y);
    hPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
    SelectObject(hDC, hPen);
    MoveToEx(hDC, Origin.x, Origin.y - Data[0], NULL);
    for (size_t i = 1; i != _countof(Data); ++i)
    {
        LineTo(hDC, Origin.x + i * 0.7, Origin.y - Data[i]);
    }

    _getwch();

    DeleteObject(hBrush);
    DeleteObject(hPen);
    ReleaseDC(NULL, hDC);
} 



 子程序(提供Data[]数据):
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define ts 0.001
#define N 500
#define pi 3.14
float yd(int i,int s);
typedef struct arrar
{
    float y[N];
};
struct arrar stepmain()
{
    arrar data;
    float den[4]={1.0000,-2.9063,2.8227,-0.9164};
    float num[4]={ 0,0.0853*1.0e-003,0.3338*1.0e-003,0.0817*1.0e-003};
    float kp,ki,kd;
    float cu[3]={0,0,0};
    float cy[3]={0,0,0};
    float x[3]={0,0,0};
    float error_1=0;
    float u[N],error[N];
    int s,i;
    printf("输入数字1为step signal、2为square wave signal\n");
    scanf("%d",&s);
    if((s<1)||(s>3))
        {
            printf("请按要求输入1-2的整数,选择跟踪信号类型\n");
    return data;
    }
    if(s==1)
        {
            kp=0.5;ki=0.001;kd=0.001;
    }
       else
       {
           kp=0.5;ki=0.001;kd=0.001;
    }
        for(i=0;i<N;i++)
    {
        u[i]=kp*x[0]+kd*x[1]+ki*x[2];
        u[i]=(u[i]>10?10:u[i]);
        u[i]=(u[i]<-10?-10:u[i]);
        data.y[i]=-den[1]*cy[0]-den[2]*cy[1]-den[3]*cy[2]+num[1]*cu[0]+num[2]*cu[1]+num[3]*cu[2];
        //printf("y[%d]=%f  u[%d]=%f\n",i,y[i],i,u[i]);
        error[i]=yd(i,s)-data.y[i];
        cu[2]=cu[1];cu[1]=cu[0];cu[0]=u[i];
        cy[2]=cy[1];cy[1]=cy[0];cy[0]=data.y[i];
        x[0]=error[i];
        x[1]=(error[i]-error_1)/ts;
        x[2]+=error[i]*ts;
        error_1=error[i];
    }
        return data;
}
    float yd(int i,int s)
  {
      float y;
        if(s==1)
        {
            y=100;
            return y;
        }
        else
            {
                y=100*sin(8*pi*i*ts);
                return y;
            }
    }

运行效果图,不知道怎么上传不了了,大家可以自己试试
谢谢斑竹




 

[ 本帖最后由 kyauto 于 2012-3-28 20:50 编辑 ]
2012-03-28 20:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
看不到你的效果图。能画出来就好,原先那个CreateData()不需要啦,你给数组赋值就可以了。

授人以渔,不授人以鱼。
2012-03-28 20:50
kyauto
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-3-8
得分:0 
回复 16楼 TonyDeng
对的。。。
我还想能在x y轴加上文字说明
还请斑竹指导
2012-03-28 21:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
看我前面给的连接,那里有输出文字的例子。

授人以渔,不授人以鱼。
2012-03-28 21:26
aifeifeiyuer
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-1
得分:0 
Screen.h文件能给我吗,我执行不出来
2013-07-01 11:04
aifeifeiyuer
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-1
得分:0 
版主在吗,我是个菜鸟,急求Screen.h文件!
2013-07-01 11:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-364017-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.080274 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved