微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于stm32f4的三维旋转显示平台

基于stm32f4的三维旋转显示平台

时间:09-05 来源:互联网 点击:

formula

//Q = [-1,1,-1];

//P = [1,1,-1];

//V = Q - p = [-2,0,0];

//Theta = pi/6;

//Tmp0 = Q(1)*sin(Theta) - Q(2)*cos(Theta);

//Tmp1 = V(1)*sin(Theta) - V(2)*cos(Theta);

//Result = Q - (Tmp0/Tmp1)*V

float32_t f32_point0[3] = {-1.0f,1.0f,-1.0f};

float32_t f32_point1[3] = {1.0f,1.0f,-1.0f};

float32_t f32_directionVector[3], f32_normalVector[3], f32_theta,

f32_tmp0, f32_tmp1, f32_tmp2, f32_result[3];

arm_sub_f32(f32_point0,f32_point1,f32_directionVector,3);

f32_theta = PI/6.0f;

f32_normalVector[0] = arm_sin_f32(f32_theta);

f32_normalVector[1] = arm_cos_f32(f32_theta);

f32_normalVector[2] = 0.0f;

arm_dot_prod_f32(f32_point0, f32_normalVector, 3, &f32_tmp0);

arm_dot_prod_f32(f32_directionVector, f32_normalVector, 3, &f32_tmp1);

f32_tmp2 = f32_tmp0/f32_tmp1;

arm_scale_f32(f32_normalVector, f32_tmp2, f32_normalVector, 3);

arm_sub_f32(f32_point0, f32_normalVector, f32_result, 3);

//and than we need to decide whether to add a new visible point in the point queue, or to update

//the color field of a given point in the point queue(as 4 visible point share one data structure). from this point, you will find that, it may be

//sensible for you not to diretly insert a new point into the end of point queue but to insert it in order

//when you build the pointqueue. it seems more effective.

void EnPointQueue(PointQueue_t * inputQueue, QueueNode_t inputNode);

//finally we will get an sorted queue at the end of the inner for loop

//than we need to calculate the number of invisible points between these visible points

//and to store it in each frame structure. the main purpose to do so is to offer an quick generation

//of the blank point(color field = 16'b0) between each electrical frame

//the work flow will be like this:

loop

{

dma output of the blank points;

output of the visible points;

}

/******************************************/

//some points need more detailed discussion

/******************************************/

//1.memory allocation strategy

//a quite straight forward method will be establishing a big memnory pool in advance, but the drawback of this method

//is that it's hard for you to decide the size of the memory pool. Another way would be the C runtime library method,

// and you can use build-in function malloc to allocate the memory, but it will be a quite heavy load for the m3 cpu

// as you need dynamic memeory allocation throughout the algorithm.

//2.the choice of Q format of the IQMATH library

//from the discussion above, the range of the coordnate is about 1-100, but the range of sin&cos is only 0-1,so there's a large gap between them.

//may be we can choose iq24?? Simultaneously, another big problem will be the choice between IQMATH and arm dsp library as their q format is

//incompatible with each other. as far as my knowledge is concerned, we should choose IQMATH with m3 without fpu, and cmsis dsp library with m4 with fpu.

//more detail discussion about the range of the algorithm

//x,y range is -64 to 64

//the formula is

//Tmp0 = Q(1)*sin(Theta) - Q(2)*cos(Theta);

//Tmp0 range is -128 to 128

//Tmp1 = V(1)*sin(Theta) - V(2)*cos(Theta);

//Tmp1 range is -128 to 128

//Result = Q - (Tmp1/Tmp2)*V

//because the minimal precision of the coordinate is 1, so if the result of Tmp1/Tmp2 is bigger than 128, the Result will be

//saturated. With the same reson, if (Tmp1/Tmp2)*V >= 128 or <= -127, the result will be saturated

  4.系统创新

其一,由于高效解析算法的提出,大幅简化了真三维显示器显示数据的获取难度,只需在PC端获得当前较为标准化的三维图形的三角面顶点数据流文件,即可在真三维显示平台上显示出来,使得真三维显示器的整体显示流程大

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top