#include #include #include #define RAYGUI_IMPLEMENTATION #include void updateRadius(int baseL, int outerL, int pointL, int *pBaseR, int *pOuterR, int *pPointR) { int totalL=baseL+outerL; if (pointL>outerL) totalL+=pointL; else totalL+=outerL; int totalR = 420; int remainder = totalR % totalL; if (remainder!=0) { if (remainder < totalL / 2) { totalR -= remainder; } else { totalR += ( totalL - remainder); } } *pBaseR = (totalR) / totalL * baseL; *pOuterR = (totalR) / totalL * outerL; *pPointR = (totalR) / totalL * pointL; } int main() { int baseL=2; int outerL=13; int pointL=3; int baseR,outerR,pointR; int cx=450,cy=450; int speed = 1; Color trackColor = BLUE; updateRadius(baseL, outerL, pointL, &baseR, &outerR, & pointR); InitWindow(1300,900,"Epitrochoid"); SetTraceLogLevel(LOG_WARNING); SetTargetFPS(60); GuiSetStyle(DEFAULT,TEXT_SIZE,20); Image trackImage=GenImageColor(900,900,WHITE); //border ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY); ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE); Image circlesImage = GenImageColor(900,900,BLANK); float r=0; int lastx,lasty; lasty=cy; lastx=cx+(baseR+outerR-pointR); int frameCount = 0; while(!WindowShouldClose()) { //GUI int newOuterL = GuiSliderBar((Rectangle){ 70, 20, 200, 30 },"Outer",TextFormat("%i", (int)outerL), outerL, 1, 50); int newBaseL = GuiSliderBar((Rectangle){ 70, 60, 200, 30 },"Base",TextFormat("%i", (int)baseL), baseL, 1, 50); int newPointL = GuiSliderBar((Rectangle){ 70, 100, 200, 30 },"Point",TextFormat("%i", (int)pointL), pointL, 1, 50); speed = GuiSliderBar((Rectangle){ 70, 150, 200, 30 },"Speed",TextFormat("%i", (int)speed), speed, 1, 50); GuiLabel((Rectangle){ 20, 220, 80, 30 },TextFormat("Color: 0x%02X%02X%02X ",(int)(trackColor.r), (int)(trackColor.g),(int)(trackColor.b))); trackColor= GuiColorPicker((Rectangle){ 50, 250, 196, 192 }, NULL, trackColor); int doClear = GuiButton((Rectangle){ 120, 700, 80, 30 },"Clear"); if (newOuterL!=outerL || newBaseL!=baseL || newPointL!=pointL) { if (newOuterL!=outerL) pointL=newOuterL; else pointL=newPointL; outerL=newOuterL; baseL=newBaseL; updateRadius(baseL, outerL, pointL, &baseR, &outerR, & pointR); lasty=cy; lastx=cx+(baseR+outerR-pointR); r=0; ImageClearBackground(&trackImage,WHITE); ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY); ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE); } else if (doClear) { ImageClearBackground(&trackImage,WHITE); ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY); ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE); } //update datas r+=0.01; float outerCX=cx+ (baseR+outerR)*cos(r); float outerCY=cy+ (baseR+outerR)*sin(r); float theta = r * (baseL+outerL) / outerL; int x=round(outerCX - pointR * cos(theta)); int y=round(outerCY - pointR * sin(theta)); //update image (in CPU) //ImageClearBackground(&trackImage,WHITE); ImageDrawLineEx(&trackImage,lastx,lasty,x,y,3,trackColor); frameCount++; if (frameCount>=speed) { ImageClearBackground(&circlesImage,BLANK); //base circle ImageDrawCircleEx(&circlesImage,cx,cy,baseR,1,LIGHTRED); ImageDrawCircleEx(&circlesImage,outerCX,outerCY,outerR,1,LIGHTSLATEGRAY); ImageDrawLineEx(&circlesImage,cx,cy,outerCX,outerCY,1,LIGHTRED); ImageDrawLineEx(&circlesImage,x,y,outerCX,outerCY,1,LIGHTSLATEGRAY); ImageDrawPointEx(&circlesImage,x,y,7,RED); //Drawing in GPU Texture trackTexture = LoadTextureFromImage(trackImage); Texture circlesTexture = LoadTextureFromImage(circlesImage); BeginDrawing(); ClearBackground(WHITE); DrawTexture(trackTexture,300,0,WHITE); DrawTexture(circlesTexture,300,0,WHITE); EndDrawing(); UnloadTexture(circlesTexture); UnloadTexture(trackTexture); frameCount=0; } lastx=x; lasty=y; } //Clean up UnloadImage(circlesImage); UnloadImage(trackImage); CloseWindow(); }