你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 1394|回复: 0

【MCU实战经验】+stm32实现长方体显示,旋转。

[复制链接]

4

主题

12

回帖

0

蝴蝶豆

初级会员

最后登录
2018-3-24
发表于 2014-4-1 13:18:16 | 显示全部楼层 |阅读模式
有视频为证
v.youku.com/v_show/id_XNjEwODcxODc2.html 
以下为源代码:
#include "includes.h"
#include "LHLGUI.h"
MemDevHandle mmemdev;
/******************************调色板数据******************************/
const unsigned short colorpalettle[]=
{
        RGB(255,255,255),
        RGB(5,90,144),
        RGB(196,64,42),
        RGB(0,0,255),
        RGB(255,0,0),
        RGB(0,255,0),
        RGB(255,255,0),
        RGB(0,0,0)
};
/****************************调色板索引数据****************************/
enum
{
        CP_WHITE=0,
        CP_GRAY,
        CP_UN,
        CP_BLUE,
        CP_RED,
        CP_GREEN,
        CP_YELLOW,
        CP_BLACK
};
/************3维图像的点定义******************/
typedef struct
{
        float x;
        float y;
        float z;
}GUI_POINT_3D;
typedef struct
{
        GUI_POINT_3D SideCenter;
        short PointIndex[4];
}SideStruct;
/****************长方体特征点定义***********************/
const GUI_POINT_3D GP_Cube[]={{-1,-1,-1},{1,-1,-1},{1,-1,1},{-1,-1,1},
                                                                                                                        {-1, 1,-1},{1, 1,-1},{1, 1,1},{-1, 1,1}};
const short CubeColor[6]={CP_WHITE,CP_GRAY,CP_UN,CP_BLUE,CP_RED,CP_GREEN};
/*****************长方体旋转角度************************/
float Angle_x=0.0f;
float Angle_y=0.0f;
float Angle_z=0.0f;

void CreatGUITask(void)
{
                xTaskCreate( GUI_Process_TaskBody, ( signed portCHAR * ) "GUI_Pro", StackSize_GUIPROCESS, NULL, GUIPROCESSPro, NULL );        
}

GUI_POINT_3D Culculate[8]={0};
void SideStructInit(SideStruct *NewStruct,short m1,short m2,short m3,short m4)
{
        NewStruct-&gtointIndex[0]=m1;
        NewStruct-&gtointIndex[1]=m2;
        NewStruct-&gtointIndex[2]=m3;
        NewStruct-&gtointIndex[3]=m4;
        
        NewStruct->SideCenter.x=(GP_Cube[m1].x+GP_Cube[m3].x)/2;
        NewStruct->SideCenter.y=(GP_Cube[m1].y+GP_Cube[m3].y)/2;
        NewStruct->SideCenter.z=(GP_Cube[m1].z+GP_Cube[m3].z)/2;
}
void GUI_3D_Polygon(GUI_POINT_3D *pResultPoint,const GUI_POINT_3D *pPoint,
                                                                                short Len,float xAngle,float yAngle,float zAngle)
{
        float Focus_K,Focus_len;//计算人的视角所引起的物体变形
        float cosfx=cosf(xAngle);
        float cosfy=cosf(yAngle);
        float cosfz=cosf(zAngle);
        float sinfx=sinf(xAngle);
        float sinfy=sinf(yAngle);
        float sinfz=sinf(zAngle);
        short i;
        float tempx,tempy,tempz;
        float tempx1,tempy1,tempz1;
        for(i=0;ix;
                tempy=(pPoint+i)->y;
                tempz=(pPoint+i)->z;
                tempy1 = tempy * cosfx - tempz * sinfx;
                tempz1 = tempy * sinfx + tempz * cosfx;
                tempy = tempy1;
                tempz = tempz1;

                tempx1 = tempx * cosfy - tempz * sinfy;
                tempz1 = tempx * sinfy + tempz * cosfy;
                tempx = tempx1;
                tempz = tempz1;
                
                tempx1 = tempx * cosfz - tempy * sinfz;
                tempy1 = tempx * sinfz + tempy * cosfz;
                tempx = tempx1;
                tempy = tempy1;
                
                Focus_len=(25-tempz)/25;
                Focus_K=tempy/tempx;
                tempx*=Focus_len;
                tempy=tempx*Focus_K;
                
                (pResultPoint+i)->x=tempx;
                (pResultPoint+i)->y=tempy;
                (pResultPoint+i)->z=tempz;
        }
}
GUI_POINT_3D cube3dbuffer[8]={0};
SideStruct Cube_6Side[6];
SideStruct Cube_6SideBuffer[6];
short Cube_SideOrder[6]={0,1,2,3,4,5};

float AccX,AccY,AccZ;
void GUI_Process_TaskBody(void *p)

{
        short x,y,m;
        BSP_Init();
        
        SideStructInit(Cube_6Side         ,0,1,2,3);
        SideStructInit(Cube_6Side+1,0,1,5,4);
        SideStructInit(Cube_6Side+2,1,2,6,5);
        SideStructInit(Cube_6Side+3,2,3,7,6);
        SideStructInit(Cube_6Side+4,3,0,4,7);
        SideStructInit(Cube_6Side+5,4,5,6,7);
        
        GUI_MemDevInit(&mmemdev,320,240,GUI_MEMDEV_4BIT);//初始化内存设备
        GUI_MemDevSetColorPalettle(&mmemdev,colorpalettle);//选择自定义调色板
        GUICore_SetMemDev(&mmemdev);//选择内存设备为当前绘图设备
        
        while(1)
        {
                ADS7843_Rd_Addata((u16 *)&x,(u16 *)&y);
                if((short)xSideCenter,1,Angle_x,Angle_y,Angle_z);
                        (Cube_6SideBuffer+x)->SideCenter.x=(Cube_6SideBuffer+x)->SideCenter.x*100+100;
                        (Cube_6SideBuffer+x)->SideCenter.y=(Cube_6SideBuffer+x)->SideCenter.y*100+100;
                }
                for(x=0;xx*80+120;
                        (cube3dbuffer+x)->y=(cube3dbuffer+x)->y*80+100;
                }
                for(x=3;xPointIndex+y)].x;
                                (mbffer+y)->y=cube3dbuffer[*((Cube_6Side+Cube_SideOrder[x])-&gtointIndex+y)].y;
                        }
                        GUI_FillPolygon(mbffer,4,0,0,CubeColor[Cube_SideOrder[x]]);
                }
                
                GUI_MemDevShow(&mmemdev,0,0);//将绘制好的图像贴到屏幕上
        }
}
void _cb_mButton(void *Handle,MsgType msg)
{
        NMBTN_SetInCallBack(Handle,1);
        switch(msg)
        {
                case BTN_MOVEIN:
                        break;
                case BTN_MOVEOUT:
                        break;
                case BTN_MESSAGESEND:
                        break;
                case BTN_REDRAW_NOTPRESSED:
                        break;
                case BTN_REDRAW_PRESSED:
                        break;
                default:
                        break;
        }
        NMBTN_SetInCallBack(Handle,0);
}
回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版