コード例 #1
0
void drawVector(int theArray[5][5], neopixel::Pixel * vectorPixel, int r, int g, int b){
    for(int i = 0;i<5;i++){
        for(int j = 0; j<5;j++){
            if(theArray[i][j] == 1)
                fill_pixel(vectorPixel,i,j,r,g,b);
            else
                fill_pixel(vectorPixel,i,j,0,0,0); 
        }
    }
}
コード例 #2
0
int main()
{
    // Turn off miniblip buzzer
    PwmOut speaker(P0_8);
    speaker=0.0;
    // Create a temporary DigitalIn so we can configure the pull-down resistor.
    DigitalIn(DATA_PIN, PullDown);

    // The pixel array control class.
    neopixel::PixelArray array(DATA_PIN);

    // Generamos el array y lo vaciamos
    neopixel::Pixel vector[25];
    void_matrix(vector);
    //Introducimos varios colores de prueba
    fill_pixel(vector,0,0,255,0,0);
    fill_pixel(vector,1,1,255,0,0);
    fill_pixel(vector,2,2,0,255,0);
    fill_pixel(vector,3,3,255,0,0);
    fill_pixel(vector,4,4,255,0,0);
    fill_pixel(vector,0,4,0,0,255);
    fill_pixel(vector,1,3,0,0,255);
    fill_pixel(vector,3,1,0,0,255);
    fill_pixel(vector,4,0,0,0,255);
    
    
    while (1) {
        array.update(vector, 64);
        
    }
}
コード例 #3
0
ファイル: border.c プロジェクト: yydaor/LCUI
static int
Graph_Draw_RoundBorder_LeftTop( 
	LCUI_Graph *des,	LCUI_Pos center,
	int radius,		int line_width,
	LCUI_RGB line_color,	LCUI_BOOL hide_outarea )
/* 绘制左上角的圆角,从左边框的上端到上边框的左端绘制一条圆角线 */
{
	LCUI_Rect real_rect;
	int pos, center_pos, y, x, i, n;
	int max_x, max_y, min_x, min_y;
	
	if( line_width <= 0 && !hide_outarea ) {
		return 1;
	}
	
	real_rect = Graph_GetValidRect( des );
	des = Graph_GetQuote( des );
	if( !Graph_IsValid( des ) ) {
		return -1;
	}
	/* 预先计算xy轴坐标的有效范围 */
	max_x = radius*2;
	if( center.x+radius > real_rect.x + real_rect.width ) {
		max_x -= (center.x+radius-real_rect.x-real_rect.width);
	}
	if( max_x < 0 ) {
		max_x = 0;
	}
	min_x = center.x>radius? 0:radius-center.x;
	if( min_x < 0 ) {
		min_x = 0;
	}
	max_y = radius*2;
	if( center.y+radius > real_rect.y + real_rect.height ) {
		max_y -= (center.y+radius-real_rect.y-real_rect.height);
	}
	min_y = center.y>radius? 0:radius-center.y;
	if( min_y < 0 ) {
		min_y = 0;
	}
	
	/* 预先计算圆心的线性坐标 */
	center_pos = (real_rect.y + center.y) * des->width;
	center_pos = center_pos + center.x + real_rect.x;

	/* 根据y轴计算各点的x轴坐标并填充点 */
	for( y=0; y<=radius; ++y, center_pos -= des->width ) {
		if( radius-y >= max_y || radius-y < min_y ) {
			continue;
		}
		/* 计算出x轴整数坐标 */
		x = (int)sqrt( pow(radius, 2) - y*y );
		
		if( line_width > 0 && radius-x >= min_x 
		 && radius-x <= max_x ) {
			pos = center_pos - x;
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
		
		if( hide_outarea && des->have_alpha ) {
			/* 计算起点坐标 */
			pos = center_pos - center.x;
			if( radius-x > max_x ) {
				n = max_x - min_x;
			} else {
				n = radius-x-min_x;
			}
			/* 加上圆与背景图的左边距 */
			n += (center.x-radius);
			for(i=0; i<n; ++i) {
				des->rgba[3][pos++]=0;
			}
		}
		/* 计算需要向右填充的像素点的个数n */
		n = radius-x+line_width;
		n = n>radius ? x:line_width;
		/* 如果该点x轴坐标小于最小x轴坐标 */
		if( radius-x < min_x ) {
			/* 重新确定起点坐标pos和填充的像素点的个数n */
			pos = center_pos - radius+min_x-1;
			n -= (min_x-radius+x);
		} else {
			pos = center_pos - x;
		}
		/* 从下一个像素点开始 */
		++pos;
		/* 如果填充的像素点超出了最大x轴范围 */
		if( radius-x + n > max_x ) {
			/* 重新确定需要填充的像素点的个数n */
			n = max_x - radius + x;
		}
		/* 开始填充当前点右边的n-1个像素点 */
		for(i=0; i<n-1; ++i,++pos) {
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
	}
	return 0;
}
コード例 #4
0
ファイル: border.c プロジェクト: yydaor/LCUI
static int
Graph_Draw_RoundBorder_BottomRight(
	LCUI_Graph *des,	LCUI_Pos center,
	int radius,		int line_width,
	LCUI_RGB line_color,	LCUI_BOOL hide_outarea )
/* 绘制右下角的圆角,从下边框的右端到右边框的下端绘制一条圆角线 */
{
	LCUI_Rect real_rect;
	int pos, center_pos, y, x, i, n;
	int max_x, max_y, min_x, min_y;
	
	if( line_width <= 0 && !hide_outarea ) {
		return 1;
	}
	
	real_rect = Graph_GetValidRect( des );
	des = Graph_GetQuote( des );
	if( !Graph_IsValid( des ) ) {
		return -1;
	}
	
	max_x = radius*2;
	if( center.x+radius > real_rect.x + real_rect.width ) {
		max_x -= (center.x+radius-real_rect.x-real_rect.width);
	}
	if( max_x < 0 ) {
		max_x = 0;
	}
	min_x = center.x>radius? 0:radius-center.x;
	if( min_x < 0 ) {
		min_x = 0;
	}
	max_y = radius*2;
	if( center.y+radius > real_rect.y + real_rect.height ) {
		max_y -= (center.y+radius-real_rect.y-real_rect.height);
	}
	min_y = center.y>radius? 0:radius-center.y;
	if( min_y < 0 ) {
		min_y = 0;
	}
	
	center_pos = (real_rect.y + center.y) * des->width;
	center_pos = center_pos + center.x + real_rect.x;

	for( x=0; x<=radius; ++x ) {
		if( radius+x >= max_x || radius+x < min_x ) {
			continue;
		}
		
		y = (int)sqrt( pow(radius, 2) - x*x );
		
		if( line_width > 0 && radius+y >= min_y 
		 && radius+y < max_y ) {
			pos = center_pos + y * des->width + x;
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
		if( hide_outarea && des->have_alpha ) {
			if( radius+y > max_y ) {
				pos = center_pos;
				pos += (max_y-radius)*des->width;
			} else {
				pos = center_pos + y * des->width + x;
			}
			if( radius+y < min_y ) {
				n = max_y - min_y;
			} else {
				n = max_y-radius-y;
			}
			n += (real_rect.height-center.y-radius);
			pos+=des->width;
			for(i=0; i<n; ++i,pos+=des->width) {
				des->rgba[3][pos]=0;
			}
		}
		
		n = radius+y-line_width;
		n = n<radius ? y:line_width;
		if( radius+y > max_y ) {
			pos = center_pos + (max_y-radius)*des->width;
			n -= (radius+y-max_y);
		} else {
			pos = center_pos + y * des->width + x;
		}
		if( radius+y - n < min_y ) {
			n = min_y - radius - y;
		}
		pos -= des->width;
		for(i=0; i<n-1; ++i,pos-=des->width) {
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
	}
	return 0;
}
コード例 #5
0
ファイル: border.c プロジェクト: yydaor/LCUI
static int
Graph_Draw_RoundBorder_BottomLeft(
	LCUI_Graph *des,	LCUI_Pos center,
	int radius,		int line_width,
	LCUI_RGB line_color,	LCUI_BOOL hide_outarea )
/* 绘制左下角的圆角,从下边框的左端到左边框的下端绘制一条圆角线 */
{
	LCUI_Rect real_rect;
	int tmp_pos, pos, center_pos, y, x, i, n;
	int max_x, max_y, min_x, min_y;
	
	if( line_width <= 0 && !hide_outarea ) {
		return 1;
	}
	
	real_rect = Graph_GetValidRect( des );
	des = Graph_GetQuote( des );
	if( !Graph_IsValid( des ) ) {
		return -1;
	}
	
	max_x = radius*2;
	if( center.x+radius > real_rect.x + real_rect.width ) {
		max_x -= (center.x+radius-real_rect.x-real_rect.width);
	}
	if( max_x < 0 ) {
		max_x = 0;
	}
	min_x = center.x>radius? 0:radius-center.x;
	if( min_x < 0 ) {
		min_x = 0;
	}
	max_y = radius*2;
	if( center.y+radius > real_rect.y + real_rect.height ) {
		max_y -= (center.y+radius-real_rect.y-real_rect.height);
	}
	min_y = center.y>radius? 0:radius-center.y;
	if( min_y < 0 ) {
		min_y = 0;
	}
	
	center_pos = (real_rect.y + center.y) * des->width;
	center_pos = center_pos + center.x + real_rect.x;

	for( x=0; x<=radius; ++x ) {
		if( radius-x >= max_x || radius-x < min_x ) {
			continue;
		}
		
		y = (int)sqrt( pow(radius, 2) - x*x );
		
		if( radius+y > max_y ) {
			pos = center_pos;
			pos += (max_y-radius)*des->width;
		} else {
			pos = center_pos + y * des->width - x;
		}
		
		if( line_width > 0 && radius+y >= min_y 
		 && radius+y <= max_y ) {
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
		
		if( hide_outarea && des->have_alpha ) {
			tmp_pos = pos;
			if( radius+y < min_y ) {
				n = max_y - min_y;
			} else {
				n = max_y-radius-y;
			}
			/* 加上圆与背景图的下边距 */
			n += (real_rect.height-center.y-radius);
			tmp_pos+=des->width;
			for(i=0; i<n; ++i,tmp_pos+=des->width) {
				des->rgba[3][tmp_pos]=0;
			}
		}
		/* 计算需要向上填充的像素点的个数n */
		n = radius+y-line_width;
		/* 判断是否超过圆的x轴对称线 */
		n = n<radius ? y:line_width;
		if( radius+y > max_y ) {
			n -= (radius+y-max_y);
		}
		/* 从上一行像素点开始 */
		pos -= des->width;
		if( radius+y - n < min_y ) {
			n = min_y - radius - y;
		}
		/* 开始填充当前点下边的n-1个像素点 */
		for(i=0; i<n-1; ++i,pos-=des->width) {
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
	}
	return 0;
}
コード例 #6
0
ファイル: border.c プロジェクト: yydaor/LCUI
static int
Graph_Draw_RoundBorder_LeftBottom(
	LCUI_Graph *des,	LCUI_Pos center,
	int radius,		int line_width,
	LCUI_RGB line_color,	LCUI_BOOL hide_outarea )
/* 绘制左下角的圆角,从左边框的下端到下边框的左端绘制一条圆角线 */
{
	LCUI_Rect real_rect;
	int pos, center_pos, y, x, i, n;
	int max_x, max_y, min_x, min_y;
	
	if( line_width <= 0 && !hide_outarea ) {
		return 1;
	}
	
	real_rect = Graph_GetValidRect( des );
	des = Graph_GetQuote( des );
	if( !Graph_IsValid( des ) ) {
		return -1;
	}
	
	max_x = radius*2;
	if( center.x+radius > real_rect.x + real_rect.width ) {
		max_x -= (center.x+radius-real_rect.x-real_rect.width);
	}
	if( max_x < 0 ) {
		max_x = 0;
	}
	min_x = center.x>radius? 0:radius-center.x;
	if( min_x < 0 ) {
		min_x = 0;
	}
	max_y = radius*2;
	if( center.y+radius > real_rect.y + real_rect.height ) {
		max_y -= (center.y+radius-real_rect.y-real_rect.height);
	}
	min_y = center.y>radius? 0:radius-center.y;
	if( min_y < 0 ) {
		min_y = 0;
	}
	
	center_pos = (real_rect.y + center.y) * des->width;
	center_pos = center_pos + center.x + real_rect.x;

	if( hide_outarea && des->have_alpha ) {
		
	}
	for( y=0; y<=radius; ++y, center_pos += des->width ) {
		if( radius+y >= max_y || radius+y < min_y ) {
			continue;
		}
		x = (int)sqrt( pow(radius, 2) - y*y );
		
		if( line_width > 0 && radius-x >= min_x 
		 && radius-x <= max_x ) {
			pos = center_pos - x;
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
		if( hide_outarea && des->have_alpha ) {
			pos = center_pos - center.x;
			if( radius-x > max_x ) {
				n = max_x - min_x;
			} else {
				n = radius-x-min_x;
			}
			n += (center.x-radius);
			for(i=0; i<n; ++i) {
				des->rgba[3][pos++]=0;
			}
		}
		n = radius-x+line_width;
		n = n>radius ? x:line_width;
		if( radius-x < min_x ) {
			pos = center_pos - radius+min_x-1;
			n -= (min_x-radius+x);
		} else {
			pos = center_pos - x;
		}
		++pos;
		if( radius-x + n > max_x ) {
			n = max_x - radius + x;
		}
		for(i=0; i<n-1; ++i,++pos) {
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
	}
	return 0;
}
コード例 #7
0
ファイル: border.c プロジェクト: yydaor/LCUI
static int
Graph_Draw_RoundBorder_RightTop( 
	LCUI_Graph *des,	LCUI_Pos center,
	int radius,		int line_width,
	LCUI_RGB line_color,	LCUI_BOOL hide_outarea )
/* 绘制右上角的圆角,从右边框的上端到上边框的右端绘制一条圆角线 */
{
	LCUI_Rect real_rect;
	int pos, center_pos, y, x, i, n;
	int max_x, max_y, min_x, min_y;
	
	if( line_width <= 0 && !hide_outarea ) {
		return 1;
	}
	
	real_rect = Graph_GetValidRect( des );
	des = Graph_GetQuote( des );
	if( !Graph_IsValid( des ) ) {
		return -1;
	}
	
	max_x = radius*2;
	if( center.x+radius > real_rect.x + real_rect.width ) {
		max_x -= (center.x+radius-real_rect.x-real_rect.width);
	}
	if( max_x < 0 ) {
		max_x = 0;
	}
	min_x = center.x>radius? 0:radius-center.x;
	if( min_x < 0 ) {
		min_x = 0;
	}
	max_y = radius*2;
	if( center.y+radius > real_rect.y + real_rect.height ) {
		max_y -= (center.y+radius-real_rect.y-real_rect.height);
	}
	min_y = center.y>radius? 0:radius-center.y;
	if( min_y < 0 ) {
		min_y = 0;
	}
	
	center_pos = (real_rect.y + center.y) * des->width;
	center_pos = center_pos + center.x + real_rect.x;
	
	for( y=0; y<=radius; ++y, center_pos -= des->width ) {
		if( radius-y >= max_y || radius-y < min_y ) {
			continue;
		}
		x = (int)sqrt( pow(radius, 2) - y*y );
		
		if( line_width > 0 && radius+x >= min_x 
		 && radius+x <= max_x ) {
			pos = center_pos + x;
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
		
		if( hide_outarea && des->have_alpha ) {
			n = center_pos + max_x - radius;
			if( radius+x < min_x ) {
				pos = center_pos + min_x - radius;
			} else {
				pos = center_pos + x;
			}
			for( ++pos; pos<=n; ++pos ) {
				des->rgba[3][pos] = 0;
			}
		}
		
		/* 计算需要向左填充的像素点的个数n */
		n = radius+x-line_width;
		n = n<min_x ? x+radius-min_x:line_width;
		
		if( radius+x > max_x ) {
			pos = center_pos - radius+max_x-1;
			n -= (radius+x-max_x);
		} else {
			pos = center_pos + x;
		}
		for(i=0; i<n; ++i,--pos) {
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
	}
	return 0;
}
コード例 #8
0
ファイル: border.c プロジェクト: yydaor/LCUI
static int
Graph_Draw_RoundBorder_TopLeft( 
	LCUI_Graph *des,	LCUI_Pos center,
	int radius,		int line_width,
	LCUI_RGB line_color,	LCUI_BOOL hide_outarea )
/* 绘制左上角的圆角,从上边框的左端到左边框的上端绘制一条圆角线 */
{
	LCUI_Rect real_rect;
	int pos, center_pos, y, x, i, n;
	int max_x, max_y, min_x, min_y;
	double tmp_pos;
	uchar_t alpha[2];
	
	if( line_width <= 0 && !hide_outarea ) {
		return 1;
	}
	
	real_rect = Graph_GetValidRect( des );
	des = Graph_GetQuote( des );
	if( !Graph_IsValid( des ) ) {
		return -1;
	}
	/* 预先计算xy轴坐标的有效范围 */
	max_x = radius*2;
	if( center.x+radius > real_rect.x + real_rect.width ) {
		max_x -= (center.x+radius-real_rect.x-real_rect.width);
	}
	if( max_x < 0 ) {
		max_x = 0;
	}
	min_x = center.x>radius? 0:radius-center.x;
	if( min_x < 0 ) {
		min_x = 0;
	}
	max_y = radius*2;
	if( center.y+radius > real_rect.y + real_rect.height ) {
		max_y -= (center.y+radius-real_rect.y-real_rect.height);
	}
	min_y = center.y>radius? 0:radius-center.y;
	if( min_y < 0 ) {
		min_y = 0;
	}
	
	center_pos = (real_rect.y + center.y) * des->width;
	center_pos = center_pos + center.x + real_rect.x;

	for( x=0; x<=radius; ++x ) {
		if( radius-x >= max_x || radius-x < min_x ) {
			continue;
		}
		tmp_pos = sqrt( pow(radius, 2) - x*x );
		y = (int)tmp_pos;
		alpha[1] =(uchar_t)( 255/(tmp_pos - y));
		alpha[0] = 255-alpha[1];
		
		if( line_width > 0 && radius-y >= min_y 
		 && radius-y <= max_y ) {
			pos = center_pos - y * des->width - x;
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}

		if( hide_outarea && des->have_alpha ) {
			/* 计算起点坐标 */
			if( radius-y < min_y ) {
				pos = center_pos;
				pos -= ((radius+min_y-1)*des->width);
			} else {
				pos = center_pos - y * des->width - x;
			}
			if( radius-y > max_y ) {
				n = max_y - min_y;
			} else {
				n = radius-y-min_y;
			}
			/* 加上圆与背景图的上边距 */
			n += (center.y-radius);
			pos-=des->width;
			for(i=0; i<n; ++i,pos-=des->width) {
				des->rgba[3][pos]=0;
			}
		}
		
		/* 计算需要向下填充的像素点的个数n */
		n = radius-y+line_width;
		n = n>radius ? y:line_width;
		if( radius-y < min_y ) {
			/* 重新确定起点坐标pos和填充的像素点的个数n */
			pos = center_pos - (radius+min_y-1)*des->width;
			n -= (min_y-radius+y);
		} else {
			pos = center_pos - y * des->width - x;
		}
		/* 从下一行像素点开始 */
		pos += des->width;
		/* 如果填充的像素点超出了最大y轴范围 */
		if( radius-y + n > max_y ) {
			/* 重新确定需要填充的像素点的个数n */
			n = max_y - radius + y;
		}
		/* 开始填充当前点下边的n-2个像素点 */
		for(i=0; i<n-1; ++i,pos+=des->width) {
			fill_pixel( des->rgba, pos, line_color );
			if( des->have_alpha ) {
				des->rgba[3][pos] = 255;
			}
		}
	}
	return 0;
}