C语言如果要用,一样可以用的又快又好
前几天我在写一个关于贝塞尔曲线的科普回答时,就是使用C语言来制作科普动图的
并且C语言的可移植性可以做到非常好,这个代码可以直接移植到Android上使用,用纯C编写一个Android Application,一样的代码不需要改一个字
最重要的是,代码也不长
#include "PainterEngine_Application.h" PX_Application App; px_void PX_ApplicationOnButtonClear(PX_Object *pObject,PX_Object_Event e,px_void *ptr) { PX_Application *pApp=(PX_Application *)ptr; pApp->status=PX_APPLICATION_STATUS_STOP; pApp->pt_count=0; pApp->t=0; } px_void PX_ApplicationOnButtonPlay(PX_Object *pObject,PX_Object_Event e,px_void *ptr) { PX_Application *pApp=(PX_Application *)ptr; if (pApp->pt_count<2) { return; } pApp->status=PX_APPLICATION_STATUS_PLAYING; pApp->t=0; } px_void PX_ApplicationDrawBezierCurve(px_surface *rendersurface,px_point pt[],px_int pt_count,px_float t,px_int linewidth,px_color clr) { px_int i; if (pt_count<=0) { return; } if (pt_count==1) { if(rendersurface) PX_GeoDrawPenCircle(rendersurface,pt[0].x,pt[0].y,5,clr); return; } if (linewidth<1) { linewidth=1; } //draw path if(rendersurface) { for (i=0;i<pt_count-1;i++) { PX_GeoDrawCircle(rendersurface,(px_int)pt[i].x,(px_int)pt[i].y,8,1,clr); PX_GeoDrawLine(rendersurface,(px_int)pt[i].x,(px_int)pt[i].y,(px_int)pt[i+1].x,(px_int)pt[i+1].y,linewidth,clr); } PX_GeoDrawCircle(rendersurface,(px_int)pt[i].x,(px_int)pt[i].y,5,1,clr); } //update path for (i=0;i<pt_count-1;i++) { px_point vector_unit=PX_PointUnit(PX_PointSub(pt[i+1],pt[i])); px_float distance=PX_PointMod(PX_PointSub(pt[i+1],pt[i])); pt[i]=PX_PointAdd(pt[i],PX_PointMul(vector_unit,distance*t)); } PX_ApplicationDrawBezierCurve(rendersurface,pt,pt_count-1,t,linewidth-1,PX_COLOR(96,PX_randEx(pt_count)%255,PX_randEx(pt_count+1)%255,PX_randEx(pt_count+2)%255)); } px_bool PX_ApplicationInitialize(PX_Application *pApp,px_int screen_width,px_int screen_height) { PX_ApplicationInitializeDefault(&pApp->runtime, screen_width, screen_height); pApp->ui_root=PX_ObjectCreate(&pApp->runtime.mp_ui,0,0,0,0,0,0,0); pApp->btn_play=PX_Object_PushButtonCreate(&pApp->runtime.mp_ui,pApp->ui_root,0,0,64,24,"Play",PX_NULL,PX_COLOR(255,0,64,255)); pApp->btn_clear=PX_Object_PushButtonCreate(&pApp->runtime.mp_ui,pApp->ui_root,0,0,64,24,"Clear",PX_NULL,PX_COLOR(255,0,64,255)); pApp->pt_count=0; pApp->status=PX_APPLICATION_STATUS_STOP; pApp->t=0; PX_ObjectRegisterEvent(pApp->btn_clear,PX_OBJECT_EVENT_EXECUTE,PX_ApplicationOnButtonClear,pApp); PX_ObjectRegisterEvent(pApp->btn_play,PX_OBJECT_EVENT_EXECUTE,PX_ApplicationOnButtonPlay,pApp); return PX_TRUE; } px_void PX_ApplicationUpdate(PX_Application *pApp,px_dword elpased) { px_float x=(px_float)pApp->runtime.RenderSurface.width; if (pApp->status==PX_APPLICATION_STATUS_PLAYING) { pApp->t+=elpased/5000.0f; if (pApp->t>1) { pApp->t=1; } } pApp->btn_clear->x=x-pApp->btn_clear->Width; x-=pApp->btn_clear->Width; pApp->btn_play->x=x-pApp->btn_play->Width; x-=pApp->btn_play->Width; PX_ObjectUpdate(pApp->ui_root,elpased); } px_void PX_ApplicationRender(PX_Application *pApp,px_dword elpased) { px_int i; px_char content[16]; px_surface *pRenderSurface=&pApp->runtime.RenderSurface; PX_RuntimeRenderClear(&pApp->runtime,PX_COLOR(255,255,255,255)); //points texts for (i=0;i<pApp->pt_count;i++) { PX_sprintf1(content,sizeof(content),"P%1",PX_STRINGFORMAT_INT(i)); PX_FontDrawText(pRenderSurface,(px_int)pApp->pt[i].x,(px_int)pApp->pt[i].y-8,PX_FONT_ALIGN_MIDBOTTOM,content,PX_COLOR(255,0,0,192)); } switch(pApp->status) { case PX_APPLICATION_STATUS_STOP: { for (i=0;i<pApp->pt_count-1;i++) { PX_GeoDrawCircle(pRenderSurface,(px_int)pApp->pt[i].x,(px_int)pApp->pt[i].y,5,1,PX_COLOR(255,0,0,192)); PX_GeoDrawLine(pRenderSurface,(px_int)pApp->pt[i].x,(px_int)pApp->pt[i].y,(px_int)pApp->pt[i+1].x,(px_int)pApp->pt[i+1].y,6,PX_COLOR(255,0,0,192)); } if(pApp->pt_count) PX_GeoDrawSolidCircle(pRenderSurface,(px_int)pApp->pt[i].x,(px_int)pApp->pt[i].y,5,PX_COLOR(255,0,0,192)); } break; case PX_APPLICATION_STATUS_PLAYING: { px_point path[201]; px_point pt[PX_APPLICATION_MAX_POINT]; px_int pathCount=(px_int)(pApp->t/0.005f); PX_memcpy(pt,pApp->pt,sizeof(px_point)*pApp->pt_count); PX_ApplicationDrawBezierCurve(pRenderSurface,pt,pApp->pt_count,pApp->t,6,PX_COLOR(128,0,0,192)); path[0]=pApp->pt[0]; for (i=1;i<=pathCount;i++) { PX_memcpy(pt,pApp->pt,sizeof(px_point)*pApp->pt_count); PX_ApplicationDrawBezierCurve(PX_NULL,pt,pApp->pt_count,i*0.005f,1,PX_COLOR(0,0,0,0)); path[i]=pt[0]; } PX_GeoDrawPath(pRenderSurface,path,pathCount+1,8,PX_COLOR(128,255,0,0)); //last pt PX_GeoDrawPenCircle(pRenderSurface,path[pathCount].x,path[pathCount].y,8,PX_COLOR(255,255,0,0)); //t { px_char t[8]; PX_sprintf1(t,sizeof(t),"t=%1.2",PX_STRINGFORMAT_FLOAT(pApp->t)); PX_FontDrawText(pRenderSurface,path[pathCount].x,path[pathCount].y-10,PX_FONT_ALIGN_MIDBOTTOM,t,PX_COLOR(255,255,0,0)); } } break; } PX_ObjectRender(pRenderSurface,pApp->ui_root,elpased); } px_void PX_ApplicationPostEvent(PX_Application *pApp,PX_Object_Event e) { PX_ApplicationEventDefault(&pApp->runtime, e); if (e.Event==PX_OBJECT_EVENT_CURSORDOWN) { if (PX_Object_Event_GetCursorY(e)<24) { PX_ObjectPostEvent(pApp->ui_root,e); } else { if (pApp->status==PX_APPLICATION_STATUS_STOP&&pApp->pt_count<PX_COUNTOF(pApp->pt)) { pApp->pt[pApp->pt_count].x=PX_Object_Event_GetCursorX(e); pApp->pt[pApp->pt_count].y=PX_Object_Event_GetCursorY(e); pApp->pt[pApp->pt_count].z=0; pApp->pt_count++; } } } else { PX_ObjectPostEvent(pApp->ui_root,e); } }
不是不实用,你缺的,只是一个图形库而已
当然,重要的是你还需要一个能够白嫖的交流平台
这居然有人来问??现在的孩子都怎么了?
第一,你倒是喜欢人家,人家喜欢你吗?
第二,你倒是跟他上了一个高中。那到大学怎么办?万一他没考上大学,你是不是要跟他一起辍学?如果他考一个不好的大学,你是不是要放弃更好的大学跟他在一起?
第三,你跟他在一个高中又有什么意义?中学生就算你们互相喜欢,还不是分手。你们还能外面买套房去登记吗?年纪也不够啊。那既然大概率是三年以后就要分手,那你现在跟他在一个高中又有什么意义呢?就为了上学放学能够一起走?
第四,你看看你爸你妈差几岁。等你真的到了结婚的年纪,能和你结婚的女生现在估计还在上小学。世界那么大,出去多看看,一般来说大学毕业那年回过头去,你会发现当初的自己是多么幼稚。