rdrawing

基于raylib的2维绘图库

rdrawing是raylib的扩展库raylib-drawing中的一个子库,提供了诸如绘制指定线宽的线段、填充圆形、填充任意形状多边形等raylib缺少的2d绘图功能。

教程

raylib和rdrawing中文使用教程

示例

#include <raylib.h>
#include <rdrawing.h>
#include <time.h>

#define SHRINK_FRAMES 2

Image genBodyImage();

int main() {
	InitWindow(800,600,"Doraemon");
	SetTraceLogLevel(LOG_WARNING);
	SetTargetFPS(30);
	
	Image img=genBodyImage();
	
	Texture texture = LoadTextureFromImage(img);
	
	while(!WindowShouldClose()) {
		BeginDrawing();
		ClearBackground(WHITE);
		DrawTexture(texture,0,0,WHITE);
		EndDrawing();
	}
	
	//Clean up
	UnloadTexture(texture);
	UnloadImage(img);
	CloseWindow();
}

Image genBodyImage(){
	Image img=GenImageColor(800,600,WHITE);
	// 画头
	Color fillColor = (Color){7,190,234,255};
	Color color=BLACK;
	ImageFillRoundRectEx(&img,265, 94, 270, 260, 124, 124,fillColor);
	ImageDrawRoundRectEx(&img,265, 94, 270, 260, 124, 124,1,color);
	
	fillColor = WHITE;								// 脸
	ImageFillEllipseEx(&img, 400, 256, 115, 95, fillColor);
	
	ImageFillRoundRectEx(&img,337, 131, 63, 74, 28, 28, fillColor);			// 右眼
	ImageDrawRoundRectEx(&img,337, 131, 63, 74, 28, 28,1, color);			
	ImageFillRoundRectEx(&img,400, 131, 63, 74, 28, 28, fillColor);			// 左眼
	ImageDrawRoundRectEx(&img,400, 131, 63, 74, 28, 28,1, color);	
	
	fillColor = BLACK;
	ImageFillCircleEx(&img,384,184,6, fillColor);							// 右眼球
	ImageFillCircleEx(&img,416,184,6, fillColor);							// 左眼球
	
	fillColor = (Color){201, 62, 0, 255};						// 鼻子
	ImageFillCircleEx(&img, 400, 208, 15, fillColor);
	
	ImageDrawLineEx(&img,400,223,400,296,1,color);		// 人中
	ImageDrawArcEx(&img,400, 192, 108, 108, PI * 5 / 4, PI * 7 / 4,1,color);	// 嘴
	
	ImageDrawLineEx(&img,358, 227, 310, 209,1,color);							// 胡子
	ImageDrawLineEx(&img,442, 227, 490, 209,1,color);
	ImageDrawLineEx(&img,359, 235, 308, 235,1,color);
	ImageDrawLineEx(&img,441, 235, 492, 235,1,color);
	ImageDrawLineEx(&img,358, 243, 310, 261,1,color);
	ImageDrawLineEx(&img,442, 243, 490, 261,1,color);	
	
	// 画身体
	ImageDrawLineEx(&img, 319, 332, 262, 372,1,color);					// 手臂(上)
	ImageDrawLineEx(&img, 481, 332, 538, 372,1,color);
	ImageDrawLineEx(&img, 304, 396, 284, 410,1,color);					// 手臂(下)
	ImageDrawLineEx(&img, 496, 396, 516, 410,1,color);
	
	ImageDrawLineEx(&img, 304, 385, 304, 478,1,color);					// 腿外侧
	ImageDrawLineEx(&img, 496, 385, 496, 478,1,color);
	ImageDrawArcEx(&img, 400, 479, 15,11,0,PI,1,color);				// 腿内侧
	
	fillColor=WHITE;						// 手
	ImageFillCircleEx(&img, 260,399,27, fillColor);
	ImageDrawCircleEx(&img, 260,399,27, 1, color);
	ImageFillCircleEx(&img, 540,399,27, fillColor);
	ImageDrawCircleEx(&img, 540,399,27, 1, color);
	ImageFillRoundRectEx(&img,288,478,110,27,12,12,fillColor);			// 脚
	ImageDrawRoundRectEx(&img,288,478,110,27,12,12,1,color);			
	ImageFillRoundRectEx(&img,402,478,110,27,12,12,fillColor);
	ImageDrawRoundRectEx(&img,402,478,110,27,12,12,1,color);			
	
	fillColor=(Color){7,190,234,255};							// 身体填充蓝色
	ImageFloodFill(&img,400,400,BLACK,fillColor);
	
	fillColor=WHITE;						// 肚皮
	ImageFillCircleEx(&img,400,381,75,fillColor);
	ImageFillRectangleEx(&img,340,304,120,20,fillColor); // 用白色矩形擦掉多余的肚皮
	
	ImageDrawSectorEx(&img,400,381,58, 58,PI,2*PI,1,color); // 口袋 
	
	// 画铃铛
	fillColor=(Color){169, 38, 0,255};				// 绳子
	ImageFillRoundRectEx(&img,300,323,200,19,12,12,fillColor);
	
	fillColor=(Color){245, 237, 38,255};			// 铃铛外形
	ImageFillCircleEx(&img,400,349,19,fillColor);
	
	fillColor=BLACK;						// 铃铛上的洞
	ImageFillEllipseEx(&img,400,354,4,4,fillColor);
	ImageDrawLineEx(&img,400,357,400,368,3,color);	
	
	ImageDrawLineEx(&img,384,340,416,340,1,color);					// 铃铛上的纹路
	ImageDrawLineEx(&img,384,344,418,344,1,color);
	return img;
}

Image genShrinkImage0() {
	Image img = GenImageColor(800,600, BLANK);
	Color fillColor=WHITE;
	Color color=BLACK;
	ImageFillRoundRectEx(&img,337, 131, 63, 74, 28, 28, fillColor);			// 右眼
	ImageFillRoundRectEx(&img,400, 131, 63, 74, 28, 28, fillColor);			// 左眼
	ImageDrawRoundRectEx(&img,337, 131, 63, 74, 28, 28,1, color);			
	ImageDrawRoundRectEx(&img,400, 131, 63, 74, 28, 28,1, color);	
	
	fillColor = BLACK;
	ImageFillCircleEx(&img,384,184,6, fillColor);							// 右眼球
	ImageFillCircleEx(&img,416,184,6, fillColor);							// 左眼球
	fillColor = (Color){201, 62, 0, 255};						// 鼻子
	ImageFillCircleEx(&img, 400, 208, 15, fillColor);
	return img;
}

Image genShrinkImage1() {
	Image img = GenImageColor(800,600, BLANK);
	Color fillColor=WHITE;
	Color color=BLACK;
	ImageFillRoundRectEx(&img,337, 131, 63, 74, 28, 28, fillColor);			// 右眼
	ImageFillRoundRectEx(&img,400, 131, 63, 74, 28, 28, fillColor);			// 左眼
	ImageDrawRoundRectEx(&img,337, 150, 63, 37, 28, 28, 1, color);
	ImageDrawRoundRectEx(&img,400, 150, 63, 37, 28, 28, 1, color);
	
	ImageFillRectangleEx(&img,337,168,63,19,fillColor);
	ImageFillRectangleEx(&img,400,168,63,19,fillColor);
	
	ImageDrawRoundRectEx(&img,337, 131, 63, 74, 28, 28,1, color);			
	ImageDrawRoundRectEx(&img,400, 131, 63, 74, 28, 28,1, color);	
	
	fillColor = BLACK;
	ImageFillCircleEx(&img,384,184,6, fillColor);							// 右眼球
	ImageFillCircleEx(&img,416,184,6, fillColor);							// 左眼球
	fillColor = (Color){201, 62, 0, 255};						// 鼻子
	ImageFillCircleEx(&img, 400, 208, 15, fillColor);
	return img;
}

Image genShrinkImage2() {
	Image img=GenImageColor(800,600,BLANK);
	Color fillColor=WHITE;
	Color color=BLACK;
	ImageFillRoundRectEx(&img,337, 131, 63, 74, 28, 28, fillColor);			// 右眼
	ImageFillRoundRectEx(&img,400, 131, 63, 74, 28, 28, fillColor);			// 左眼
	
	ImageDrawLineEx(&img,337,168,399,168,1,color);
	ImageDrawLineEx(&img,400,168,462,168,1,color);
	
	ImageDrawRoundRectEx(&img,337, 131, 63, 74, 28, 28,1, color);			
	ImageDrawRoundRectEx(&img,400, 131, 63, 74, 28, 28,1, color);
	fillColor = (Color){201, 62, 0, 255};						// 鼻子
	ImageFillCircleEx(&img, 400, 208, 15, fillColor);
	return img;
}

Image genShrinkImage3(){
	Image img=GenImageColor(800,600,BLANK);
	Color fillColor=WHITE;
	Color color=BLACK;
	ImageFillRoundRectEx(&img,337, 131, 63, 74, 28, 28, fillColor);			// 右眼
	ImageFillRoundRectEx(&img,400, 131, 63, 74, 28, 28, fillColor);			// 左眼
	ImageDrawRoundRectEx(&img,337, 150, 63, 37, 28, 28, 1, color);
	ImageDrawRoundRectEx(&img,400, 150, 63, 37, 28, 28, 1, color);
	
	ImageFillRectangleEx(&img,337,150,63,19,fillColor);
	ImageFillRectangleEx(&img,400,150,63,19,fillColor);
	
	ImageDrawRoundRectEx(&img,337, 131, 63, 74, 28, 28,1, color);			
	ImageDrawRoundRectEx(&img,400, 131, 63, 74, 28, 28,1, color);
	fillColor = (Color){201, 62, 0, 255};						// 鼻子
	ImageFillCircleEx(&img, 400, 208, 15, fillColor);
	return img;
}

Image genShrinkImage4() {
	Image img=GenImageColor(800,600,BLANK);
	Color fillColor=WHITE;
	Color color=BLACK;
	ImageFillRoundRectEx(&img,337, 131, 63, 74, 28, 28, fillColor);			// 右眼
	ImageFillRoundRectEx(&img,400, 131, 63, 74, 28, 28, fillColor);			// 左眼
	
	ImageDrawRoundRectEx(&img,337, 131, 63, 74, 28, 28,1, color);			
	ImageDrawRoundRectEx(&img,400, 131, 63, 74, 28, 28,1, color);	
	fillColor = (Color){201, 62, 0, 255};						// 鼻子
	ImageFillCircleEx(&img, 400, 208, 15, fillColor);
	return img;
}

函数列表

函数名 功能
ImageDrawPointEx 使用指定的大小,在Image对象中画一个点
ImageDrawArcEx 使用指定的线宽和颜色,在Image对象中画一段椭圆弧
ImageDrawCubicBezierEx 使用指定的线宽和颜色,绘制三次贝塞尔曲线
ImageDrawLineEx 使用指定的线宽和颜色,在Image对象中画一条线段
ImageDrawPolylineEx 使用指定的线宽和颜色,在Image对象中画一条多义线(polyline)
ImageDrawRectangleEx 使用指定的线宽和颜色,在Image对象中画一个矩形(仅轮廓线)
ImageDrawRoundRectEx 使用指定的线宽和颜色,在Image对象中画一个圆角矩形(仅轮廓线)
ImageDrawCircleEx 使用指定的线宽和颜色,在Image对象中画一个圆(仅轮廓线)
ImageDrawEllipseEx 使用指定的线宽和颜色,在Image对象中画一个椭圆(仅轮廓线)
ImageDrawPolygonEx 使用指定的线宽和颜色,在Image对象中画一个多边形(仅轮廓线)
ImageDrawSectorEx 使用指定的线宽和颜色,在Image对象中画一个扇形(仅轮廓线)
ImageFillCircleEx 使用指定的颜色,绘制一个填充的圆
ImageFillEllipseEx 使用指定的颜色,绘制一个填充的椭圆
ImageFillTriangleEx 使用指定的颜色,绘制一个填充的三角形
ImageFillRectangleEx 使用指定的颜色,绘制一个填充的矩形
ImageFillRoundRectEx 使用指定的颜色,绘制一个填充的圆角矩形
ImageFillPolygonEx 使用指定的颜色,绘制一个填充的多边形
ImageFillSectorEx 使用指定的颜色,绘制一个填充的扇形
ImageFloodFill 泛洪填充(当遇到颜色为border color的像素时停止)
最后修改 July 6, 2023: update (ae1ce626)