From dddd49ca24fe0f0f6ee5b86f7dc2131a53e7e6ee Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Wed, 13 Dec 2023 01:20:18 +0700 Subject: template --- src/main.c | 106 ++++--------------------------------------------------------- 1 file changed, 6 insertions(+), 100 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 519dbfc..e05d3e1 100644 --- a/src/main.c +++ b/src/main.c @@ -9,22 +9,9 @@ typedef struct InitConfig { int TARGET_FPS; } InitConfig; -typedef struct Ball { - Vector2 pos; - float radius; - float mass; - Vector2 velocity; - Vector2 force; - Color color; -} Ball; - -typedef struct Physics { - float gravityConstant; -} Physics; - void doInitialization(InitConfig config); -void doDrawing(Ball **balls, int totalBalls); -void doUpdate(Ball **balls, int totalBalls, Physics physics); +void doDrawing(); +void doUpdate(); int main(void) { @@ -36,43 +23,10 @@ int main(void) }; doInitialization(config); - Physics physics = { - .gravityConstant = 70.0f, - }; - - Ball luna = { - .pos = {(float)config.SCREEN_WIDTH / 2, 0.0f + 100}, - .radius = 5, - .mass = 200, - .velocity = { 50.0f, 0.0f }, - .force = {0.0f, 0.0f}, - WHITE - }; - - Ball potato = { - .pos = {(float)config.SCREEN_WIDTH / 2, (float)config.SCREEN_HEIGHT - 320}, - .radius = 5, - .mass = 200, - .velocity = { -80.0f, 0.0f }, - .force = {0.0f, 0.0f}, - YELLOW - }; - - Ball earth = { - .pos = {(float)config.SCREEN_WIDTH / 2, (float)config.SCREEN_HEIGHT / 2 }, - .radius = 20, - .mass = 15000, - .velocity = { 0.0f, 0.0f }, - .force = {0.0f, 0.0f}, - BLUE - }; - - Ball *balls[] = {&earth, &luna, &potato}; - while (!WindowShouldClose()) { - doUpdate(balls, 3, physics); - doDrawing(balls, 3); + doUpdate(); + doDrawing(); } CloseWindow(); @@ -85,62 +39,14 @@ void doInitialization(InitConfig config) { SetTargetFPS(config.TARGET_FPS); } -//float pix2m(int pixels) { -// // Pixel to meter conversion, 1 pixel = 1 cm -// return 0.01f * (float)pixels; -//} -// -//int m2pix(float metres) { -// return (int)floorf(metres / 0.01f); -//} - -Vector2 computeGravity(Ball *ball1, Ball *ball2, Physics physics) { - // Gravity felt by ball2 - Vector2 displacement = Vector2Subtract(ball1->pos, ball2->pos); - float gravityMag = (physics.gravityConstant * ball1->mass * ball2->mass) / Vector2LengthSqr(displacement); - return Vector2Scale(Vector2Normalize(displacement), gravityMag); -} - -Vector2 computeGravityNDimension(Ball *ball1, Ball *ball2, Physics physics, int dimension) { - // Generalisasi. Nyoba kalo ada N-dimensi ruang - Vector2 displacement = Vector2Subtract(ball1->pos, ball2->pos); - float distance = Vector2Length(displacement); - float distanceFactor = (float)pow(distance, dimension - 1); - float gravityMag = (physics.gravityConstant * ball1->mass * ball2->mass) / distanceFactor; - return Vector2Scale(Vector2Normalize(displacement), gravityMag); -} - -void doUpdate(Ball **balls, int totalBalls, Physics physics) { +void doUpdate() { float dt = GetFrameTime(); - for (int i = 0; i < totalBalls; i++) { - Ball *ball = balls[i]; - // Sum over gravity felt from all other balls - Vector2 gravityTotal = {0.0f, 0.0f}; - for (int j = 0; j < totalBalls; j++) { - if (i != j) { - Ball *otherBall = balls[j]; - Vector2 gravity = computeGravity(otherBall, ball, physics); - gravityTotal = Vector2Add(gravityTotal, gravity); - } - } - // Update position from last velocity - ball->pos = Vector2Add(ball->pos, Vector2Scale(ball->velocity, dt)); - // a = F / m - Vector2 acceleration = Vector2Scale(gravityTotal, 1.0f / ball->mass); - // Update velocity for next frame - ball->velocity = Vector2Add(ball->velocity, Vector2Scale(acceleration, dt)); - } } -void doDrawing(Ball **balls, int totalBalls) { +void doDrawing() { BeginDrawing(); ClearBackground(BLACK); - for (int i = 0; i < totalBalls; i++) { - Ball *ball = balls[i]; - DrawCircleV(ball->pos, ball->radius, ball->color); - } - EndDrawing(); } \ No newline at end of file -- cgit v1.2.3-70-g09d2 From c91f0c68aa03451607bca6f9bbaa8fb4503b1494 Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Wed, 13 Dec 2023 21:48:10 +0700 Subject: with origin point --- src/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index e05d3e1..eaf6d3d 100644 --- a/src/main.c +++ b/src/main.c @@ -1,10 +1,11 @@ #include "raylib.h" -#include "raymath.h" typedef struct InitConfig { int SCREEN_WIDTH; int SCREEN_HEIGHT; + int ORIGIN_X; + int ORIGIN_Y; char TITLE[20]; int TARGET_FPS; } InitConfig; @@ -18,7 +19,9 @@ int main(void) InitConfig config = { 1500, 900, - "Just a fucking test", + 1500 / 2, + 900 / 2, + "Cool shit", 60 }; doInitialization(config); -- cgit v1.2.3-70-g09d2 From 8dd06cebfd4448679210ff732869499ac1f06145 Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Wed, 20 Dec 2023 23:56:35 +0700 Subject: lines and lines --- src/main.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 71 insertions(+), 10 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index eaf6d3d..1d5fc9e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,35 +1,64 @@ +#include +#include + #include "raylib.h" -typedef struct InitConfig { +typedef struct Config { int SCREEN_WIDTH; int SCREEN_HEIGHT; int ORIGIN_X; int ORIGIN_Y; char TITLE[20]; int TARGET_FPS; -} InitConfig; +} Config; + +typedef struct Line { + Vector2 start; + Vector2 end; + Color color; +} Line; + +typedef struct VectorField { + int colSize; + int rowSize; + int spacing; + Line **lines; // col then row +} VectorField; -void doInitialization(InitConfig config); -void doDrawing(); +void Initialize(Config config); +void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize); +void doDrawing(VectorField *vectorField, int colSize, int rowSize); void doUpdate(); int main(void) { - InitConfig config = { + Config config = { 1500, 900, 1500 / 2, 900 / 2, - "Cool shit", + "Cool Thing", 60 }; - doInitialization(config); + Initialize(config); + + int spacing = 20; + int colSize = config.SCREEN_WIDTH / spacing - 1; + int rowSize = config.SCREEN_HEIGHT / spacing - 1; + Line **lines = NULL; + VectorField vectorField = { + .colSize = colSize, + .rowSize = rowSize, + .spacing = spacing, + .lines = lines + }; + InitializeVectorField(&vectorField, colSize, rowSize); while (!WindowShouldClose()) { doUpdate(); - doDrawing(); + doDrawing(&vectorField, colSize, rowSize); } CloseWindow(); @@ -37,19 +66,51 @@ int main(void) return 0; } -void doInitialization(InitConfig config) { +void Initialize(Config config) { InitWindow(config.SCREEN_WIDTH, config.SCREEN_HEIGHT, config.TITLE); SetTargetFPS(config.TARGET_FPS); } +void MemAllocFailed(char *source) { + printf("Memory allocation for %s failed", source); + exit(42); +} + +void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { + vectorField->lines = malloc(rowSize * sizeof(Line*)); + for (int i = 0; i < rowSize; i++) { + vectorField->lines[i] = malloc(colSize * sizeof(Line)); + for (int j = 0; j < colSize; j++) { + Line line = { + .start = { + (float)((j + 1) * vectorField->spacing), + (float)((i + 1) * vectorField->spacing) + }, + .end = { + (float)((j + 1) * vectorField->spacing + 10), + (float)((i + 1) * vectorField->spacing - 10) + }, + .color = WHITE + }; + vectorField->lines[i][j] = line; + } + } +} + void doUpdate() { float dt = GetFrameTime(); } -void doDrawing() { +void doDrawing(VectorField *vectorField, int colSize, int rowSize) { BeginDrawing(); ClearBackground(BLACK); + for (int i = 0; i < rowSize; i++) { + for (int j = 0; j < colSize; j++) { + DrawLineV(vectorField->lines[i][j].start, vectorField->lines[i][j].end, vectorField->lines[i][j].color); + } + } + EndDrawing(); } \ No newline at end of file -- cgit v1.2.3-70-g09d2 From f85e511f3a7bb974fdbfc289f6706187d2b023d9 Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Thu, 21 Dec 2023 00:50:13 +0700 Subject: some useless modifications --- src/main.c | 52 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 15 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 1d5fc9e..5948ce8 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ #include #include "raylib.h" +#include "raymath.h" typedef struct Config { @@ -19,17 +20,25 @@ typedef struct Line { Color color; } Line; +typedef struct Object { + int posX; + int posY; + float radius; + Color color; + float charge; +} Object; + typedef struct VectorField { int colSize; int rowSize; int spacing; - Line **lines; // col then row + Line **lines; } VectorField; void Initialize(Config config); void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize); -void doDrawing(VectorField *vectorField, int colSize, int rowSize); -void doUpdate(); +void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *object); +void doUpdate(VectorField *vectorField, Object *object); int main(void) { @@ -55,10 +64,18 @@ int main(void) }; InitializeVectorField(&vectorField, colSize, rowSize); + Object positiveCharge = { + .posX = config.ORIGIN_X, + .posY = config.ORIGIN_Y, + .radius = 20, + .color = RED, + .charge = 10 + }; + while (!WindowShouldClose()) { - doUpdate(); - doDrawing(&vectorField, colSize, rowSize); + doUpdate(&vectorField, &positiveCharge); + doDrawing(&vectorField, colSize, rowSize, &positiveCharge); } CloseWindow(); @@ -76,20 +93,24 @@ void MemAllocFailed(char *source) { exit(42); } +float getRndAngle() { + float nMax = 360; + return (float)rand() / ((float)RAND_MAX / nMax); // NOLINT(cert-msc30-c, cert-msc50-cpp) +} + void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { vectorField->lines = malloc(rowSize * sizeof(Line*)); for (int i = 0; i < rowSize; i++) { vectorField->lines[i] = malloc(colSize * sizeof(Line)); for (int j = 0; j < colSize; j++) { + Vector2 start = { + (float)((j + 1) * vectorField->spacing), + (float)((i + 1) * vectorField->spacing) + }; + Vector2 end = {start.x + 5, start.y - 5}; Line line = { - .start = { - (float)((j + 1) * vectorField->spacing), - (float)((i + 1) * vectorField->spacing) - }, - .end = { - (float)((j + 1) * vectorField->spacing + 10), - (float)((i + 1) * vectorField->spacing - 10) - }, + .start = start, + .end = end, .color = WHITE }; vectorField->lines[i][j] = line; @@ -97,11 +118,11 @@ void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { } } -void doUpdate() { +void doUpdate(VectorField *vectorField, Object *object) { float dt = GetFrameTime(); } -void doDrawing(VectorField *vectorField, int colSize, int rowSize) { +void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *object) { BeginDrawing(); ClearBackground(BLACK); @@ -111,6 +132,7 @@ void doDrawing(VectorField *vectorField, int colSize, int rowSize) { DrawLineV(vectorField->lines[i][j].start, vectorField->lines[i][j].end, vectorField->lines[i][j].color); } } + DrawCircle(object->posX, object->posY, object->radius, object->color); EndDrawing(); } \ No newline at end of file -- cgit v1.2.3-70-g09d2 From fe8dbcd2361ee220cbfa9e4723d717c2059f9554 Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Thu, 21 Dec 2023 10:24:41 +0700 Subject: moving charge --- src/main.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 5948ce8..9f7579b 100644 --- a/src/main.c +++ b/src/main.c @@ -21,8 +21,8 @@ typedef struct Line { } Line; typedef struct Object { - int posX; - int posY; + float posX; + float posY; float radius; Color color; float charge; @@ -65,11 +65,11 @@ int main(void) InitializeVectorField(&vectorField, colSize, rowSize); Object positiveCharge = { - .posX = config.ORIGIN_X, - .posY = config.ORIGIN_Y, + .posX = 50, + .posY = (float)config.ORIGIN_Y, .radius = 20, .color = RED, - .charge = 10 + .charge = 100 }; while (!WindowShouldClose()) @@ -93,10 +93,10 @@ void MemAllocFailed(char *source) { exit(42); } -float getRndAngle() { - float nMax = 360; - return (float)rand() / ((float)RAND_MAX / nMax); // NOLINT(cert-msc30-c, cert-msc50-cpp) -} +//float getRndAngle() { +// float nMax = 360; +// return (float)rand() / ((float)RAND_MAX / nMax); // NOLINT(cert-msc30-c, cert-msc50-cpp) +//} void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { vectorField->lines = malloc(rowSize * sizeof(Line*)); @@ -120,6 +120,16 @@ void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { void doUpdate(VectorField *vectorField, Object *object) { float dt = GetFrameTime(); + for (int i = 0; i < vectorField->rowSize; i++) { + for (int j = 0; j < vectorField->colSize; j++) { + Vector2 distanceVector = Vector2Subtract(vectorField->lines[i][j].start, (Vector2){object->posX, object->posY}); + float fieldStrength = object->charge / Vector2LengthSqr(distanceVector); + float vectorLineMag = fmaxf(10.0f, fieldStrength); + Vector2 directionVector = Vector2Scale(distanceVector, vectorLineMag / Vector2Length(distanceVector)); + vectorField->lines[i][j].end = Vector2Add(vectorField->lines[i][j].start, directionVector); + } + } + object->posX += dt * 20; } void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *object) { -- cgit v1.2.3-70-g09d2 From c1d8c59373812fc7f1a6d7cde0eb2fad429f54ef Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Thu, 21 Dec 2023 10:35:40 +0700 Subject: fix clamp value --- src/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 9f7579b..13bcfdf 100644 --- a/src/main.c +++ b/src/main.c @@ -119,12 +119,13 @@ void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { } void doUpdate(VectorField *vectorField, Object *object) { + float k = 5000.0f; float dt = GetFrameTime(); for (int i = 0; i < vectorField->rowSize; i++) { for (int j = 0; j < vectorField->colSize; j++) { Vector2 distanceVector = Vector2Subtract(vectorField->lines[i][j].start, (Vector2){object->posX, object->posY}); - float fieldStrength = object->charge / Vector2LengthSqr(distanceVector); - float vectorLineMag = fmaxf(10.0f, fieldStrength); + float fieldStrength = k * object->charge / Vector2LengthSqr(distanceVector); + float vectorLineMag = Clamp(fieldStrength, 2.0f, 20.0f); Vector2 directionVector = Vector2Scale(distanceVector, vectorLineMag / Vector2Length(distanceVector)); vectorField->lines[i][j].end = Vector2Add(vectorField->lines[i][j].start, directionVector); } -- cgit v1.2.3-70-g09d2 From 9d0453d24aefbaef33b448a91dceb34e4587fa67 Mon Sep 17 00:00:00 2001 From: Rosyid Haryadi Date: Thu, 21 Dec 2023 11:41:37 +0700 Subject: multipla objects --- src/main.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 18 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 13bcfdf..e536730 100644 --- a/src/main.c +++ b/src/main.c @@ -10,7 +10,7 @@ typedef struct Config { int SCREEN_HEIGHT; int ORIGIN_X; int ORIGIN_Y; - char TITLE[20]; + char TITLE[50]; int TARGET_FPS; } Config; @@ -37,8 +37,8 @@ typedef struct VectorField { void Initialize(Config config); void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize); -void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *object); -void doUpdate(VectorField *vectorField, Object *object); +void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *objects, int objectNum); +void doUpdate(VectorField *vectorField, Object *objects, int objectNum); int main(void) { @@ -47,7 +47,7 @@ int main(void) 900, 1500 / 2, 900 / 2, - "Cool Thing", + "Force Field Simulator", 60 }; Initialize(config); @@ -64,18 +64,37 @@ int main(void) }; InitializeVectorField(&vectorField, colSize, rowSize); - Object positiveCharge = { - .posX = 50, + Object object0 = { + .posX = (float)config.ORIGIN_X - 200, .posY = (float)config.ORIGIN_Y, .radius = 20, .color = RED, .charge = 100 }; + Object object1 = { + .posX = (float)config.ORIGIN_X + 200, + .posY = (float)config.ORIGIN_Y, + .radius = 20, + .color = BLUE, + .charge = -100 + }; + +// Object object2 = { +// .posX = (float)config.ORIGIN_X + 200, +// .posY = (float)config.ORIGIN_Y - 100, +// .radius = 20, +// .color = BLUE, +// .charge = -100 +// }; + + Object objects[] = {object0, object1}; + int objectNum = sizeof(objects) / sizeof(Object); + while (!WindowShouldClose()) { - doUpdate(&vectorField, &positiveCharge); - doDrawing(&vectorField, colSize, rowSize, &positiveCharge); + doUpdate(&vectorField, objects, objectNum); + doDrawing(&vectorField, colSize, rowSize, objects, objectNum); } CloseWindow(); @@ -118,22 +137,34 @@ void InitializeVectorField(VectorField *vectorField, int colSize, int rowSize) { } } -void doUpdate(VectorField *vectorField, Object *object) { - float k = 5000.0f; +void doUpdate(VectorField *vectorField, Object *objects, int objectNum) { + float forceConstant = 5000.0f; float dt = GetFrameTime(); for (int i = 0; i < vectorField->rowSize; i++) { for (int j = 0; j < vectorField->colSize; j++) { - Vector2 distanceVector = Vector2Subtract(vectorField->lines[i][j].start, (Vector2){object->posX, object->posY}); - float fieldStrength = k * object->charge / Vector2LengthSqr(distanceVector); - float vectorLineMag = Clamp(fieldStrength, 2.0f, 20.0f); - Vector2 directionVector = Vector2Scale(distanceVector, vectorLineMag / Vector2Length(distanceVector)); - vectorField->lines[i][j].end = Vector2Add(vectorField->lines[i][j].start, directionVector); + Vector2 resultant = Vector2Zero(); + for (int k = 0; k < objectNum; k++) { + Object object = objects[k]; + Vector2 distanceVector = Vector2Subtract(vectorField->lines[i][j].start, (Vector2){object.posX, object.posY}); + float fieldStrength = forceConstant * object.charge / Vector2LengthSqr(distanceVector); + Vector2 force = Vector2Normalize(distanceVector); + force = Vector2Scale(force, fieldStrength); + resultant = Vector2Add(force, resultant); + } + float resultantMag = Clamp(Vector2Length(resultant), -20.0f, 20.0f); + if (fabsf(resultantMag) < 2.0f) { + resultantMag = resultantMag >= 0 ? 2.0f : -2.0f; + } + resultant = Vector2Normalize(resultant); + resultant = Vector2Scale(resultant, resultantMag); + vectorField->lines[i][j].end = Vector2Add(vectorField->lines[i][j].start, resultant); } } - object->posX += dt * 20; +// objects[0].posX += 10 * dt; +// objects[1].posX -= 10 * dt; } -void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *object) { +void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *objects, int objectNum) { BeginDrawing(); ClearBackground(BLACK); @@ -143,7 +174,10 @@ void doDrawing(VectorField *vectorField, int colSize, int rowSize, Object *objec DrawLineV(vectorField->lines[i][j].start, vectorField->lines[i][j].end, vectorField->lines[i][j].color); } } - DrawCircle(object->posX, object->posY, object->radius, object->color); + for (int i = 0; i < objectNum; i++) { + Object object = objects[i]; + DrawCircle((int)object.posX, (int)object.posY, object.radius, object.color); + } EndDrawing(); } \ No newline at end of file -- cgit v1.2.3-70-g09d2