tacé du michelson + gui
This commit is contained in:
181
main.c
181
main.c
@ -1,44 +1,177 @@
|
||||
#include "raylib.h"
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define RAYGUI_IMPLEMENTATION
|
||||
#include "raygui.h"
|
||||
|
||||
#define UI_WIDTH 400
|
||||
|
||||
typedef struct {
|
||||
float d1;
|
||||
float d2;
|
||||
float lambda;
|
||||
float angleM2;
|
||||
float angleM1;
|
||||
Vector2 center;
|
||||
} Michelson;
|
||||
|
||||
void DrawMichelsonSchema (Michelson *michelson) {
|
||||
Vector2 center = { 400.0f, 300.0f };
|
||||
Vector2 originM2 = { 5.0f, 30.0f };
|
||||
Rectangle recM2 = {center.x + michelson->d2, center.y, 7.0f, 100.0f};
|
||||
DrawRectanglePro(recM2, originM2, michelson->angleM2, WHITE);
|
||||
Color WavelengthToColor(float lambda) {
|
||||
float r = 0.0f, g = 0.0f, b = 0.0f;
|
||||
if (lambda >= 380 && lambda < 440) { r = -(lambda - 440) / (440 - 380); b = 1.0f; }
|
||||
else if (lambda >= 440 && lambda < 490) { g = (lambda - 440) / (490 - 440); b = 1.0f; }
|
||||
else if (lambda >= 490 && lambda < 510) { g = 1.0f; b = -(lambda - 510) / (510 - 490); }
|
||||
else if (lambda >= 510 && lambda < 580) { r = (lambda - 510) / (580 - 510); g = 1.0f; }
|
||||
else if (lambda >= 580 && lambda < 645) { r = 1.0f; g = -(lambda - 645) / (645 - 580); }
|
||||
else if (lambda >= 645 && lambda <= 780) { r = 1.0f; }
|
||||
|
||||
float factor = 1.0f;
|
||||
if (lambda >= 380 && lambda < 420) factor = 0.3f + 0.7f * (lambda - 380) / (420 - 380);
|
||||
else if (lambda >= 380 && lambda <= 645) factor = 1.0f;
|
||||
else if (lambda > 700 && lambda <= 780) factor = 0.3f + 0.7f * (780 - lambda) / (780 - 700);
|
||||
|
||||
return (Color){
|
||||
(unsigned char)(r * factor * 255),
|
||||
(unsigned char)(g * factor * 255),
|
||||
(unsigned char)(b * factor * 255),
|
||||
255
|
||||
};
|
||||
}
|
||||
|
||||
void DrawMichelsonSchema (Michelson *mic) {
|
||||
Vector2 c = mic->center;
|
||||
Color laserColor = WavelengthToColor(mic->lambda);
|
||||
|
||||
float thickness = 4.0f;
|
||||
float armLengthSource = 450.0f;
|
||||
float armLengthScreen = 450.0f;
|
||||
float mirrorSize = 140.0f;
|
||||
|
||||
Vector2 startSource = {c.x - armLengthSource, c.y};
|
||||
DrawLineEx(startSource, c, thickness, laserColor);
|
||||
DrawRectangle(startSource.x - 20, startSource.y - 15, 20, 30, DARKGRAY);
|
||||
DrawText("Source", startSource.x - 30, startSource.y - 40, 20, LIGHTGRAY);
|
||||
|
||||
Vector2 posM2 = {c.x + mic->d2, c.y};
|
||||
|
||||
DrawLineEx(c, posM2, thickness, laserColor);
|
||||
DrawLineEx(c, (Vector2){c.x, c.y + armLengthScreen}, thickness, Fade(laserColor, 0.6f));
|
||||
|
||||
DrawRectangle(posM2.x, posM2.y - (mirrorSize / 2), 12, mirrorSize, LIGHTGRAY);
|
||||
DrawRectangle(posM2.x, posM2.y - (mirrorSize / 2) + 2, 4, mirrorSize - 4, WHITE);
|
||||
DrawText("M2", posM2.x + 20, posM2.y - 10, 20, GRAY);
|
||||
|
||||
Vector2 posM1 = {c.x, c.y - mic->d1};
|
||||
|
||||
DrawLineEx(c, posM1, thickness, laserColor);
|
||||
|
||||
float angleRad = (mic->angleM1 * 2.0f) * (PI / 180.0f);
|
||||
float yScreen = c.y + armLengthScreen;
|
||||
float verticalDist = yScreen - posM1.y;
|
||||
float xOffset = verticalDist * tanf(angleRad);
|
||||
|
||||
Vector2 endPointRetour = {
|
||||
posM1.x + xOffset,
|
||||
yScreen
|
||||
};
|
||||
|
||||
DrawLineEx(posM1, endPointRetour, thickness, Fade(laserColor, 0.6f));
|
||||
|
||||
Rectangle recM1 = {posM1.x, posM1.y, mirrorSize, 12.0f};
|
||||
Vector2 originM1 = {mirrorSize / 2, 6.0f};
|
||||
DrawRectanglePro(recM1, originM1, mic->angleM1, LIGHTGRAY);
|
||||
|
||||
Rectangle recM1Face = {posM1.x, posM1.y, mirrorSize - 4, 4.0f};
|
||||
Vector2 originM1Face = {(mirrorSize - 4) / 2, 6.0f};
|
||||
DrawRectanglePro(recM1Face, originM1Face, mic->angleM1, WHITE);
|
||||
|
||||
DrawText("M1", posM1.x - 40, posM1.y - 30, 20, ORANGE);
|
||||
|
||||
float sepLen = 220.0f;
|
||||
Rectangle sepRec = {c.x, c.y, 4.0f, sepLen};
|
||||
Vector2 sepOrigin = {2.0f, sepLen / 2};
|
||||
DrawRectanglePro(sepRec, sepOrigin, -45.0f, Fade(SKYBLUE, 0.4f));
|
||||
DrawRectanglePro((Rectangle){c.x, c.y, 1.0f, sepLen}, (Vector2){0.5f, sepLen / 2}, -45.0f, Fade(WHITE, 0.5f));
|
||||
|
||||
DrawRectangle(c.x - 300, yScreen, 600, 15, DARKGRAY);
|
||||
DrawText("Ecran", c.x - 20, yScreen + 20, 20, GRAY);
|
||||
}
|
||||
|
||||
void DrawControlPanel(Michelson *mic) {
|
||||
DrawRectangle(0, 0, UI_WIDTH, GetScreenHeight(), (Color){30, 30, 30, 255});
|
||||
DrawLine(UI_WIDTH, 0, UI_WIDTH, GetScreenHeight(), WHITE);
|
||||
|
||||
int startX = 30;
|
||||
int startY = 30;
|
||||
|
||||
int buttonWidth = 60;
|
||||
int spacing = 20;
|
||||
int contentWidth = UI_WIDTH - 60;
|
||||
int sliderWidth = contentWidth - buttonWidth - spacing - 15;
|
||||
|
||||
GuiSetStyle(DEFAULT, TEXT_SIZE, 18);
|
||||
GuiSetStyle(DEFAULT, BASE_COLOR_NORMAL, 0x404040FF);
|
||||
GuiSetStyle(DEFAULT, BORDER_COLOR_NORMAL, 0x808080FF);
|
||||
GuiSetStyle(DEFAULT, TEXT_COLOR_NORMAL, 0xFFFFFFFF);
|
||||
|
||||
DrawText("PARAMETRES", startX, startY, 30, WHITE);
|
||||
|
||||
startY += 80;
|
||||
DrawText(TextFormat("Longueur d'onde: %.0f nm", mic->lambda), startX, startY, 20, LIGHTGRAY);
|
||||
GuiSlider((Rectangle){startX, startY + 30, contentWidth - 45, 30}, NULL, NULL, &mic->lambda, 380, 780);
|
||||
DrawRectangle(startX + contentWidth - 35, startY + 30, 35, 30, WavelengthToColor(mic->lambda));
|
||||
|
||||
startY += 100;
|
||||
DrawText(TextFormat("Position M1 (d1): %.1f", mic->d1), startX, startY, 20, ORANGE);
|
||||
|
||||
GuiSlider((Rectangle){startX, startY + 30, sliderWidth, 30}, NULL, NULL, &mic->d1, 100, 600);
|
||||
|
||||
if (GuiButton((Rectangle){startX + sliderWidth + spacing + 15, startY + 30, buttonWidth, 30}, "Egal")) {
|
||||
mic->d1 = mic->d2;
|
||||
}
|
||||
|
||||
startY += 100;
|
||||
DrawText(TextFormat("Inclinaison M1: %.2f deg", mic->angleM1), startX, startY, 20, ORANGE);
|
||||
|
||||
GuiSlider((Rectangle){startX, startY + 30, sliderWidth, 30}, "-5", "+5", &mic->angleM1, -5.0f, 5.0f);
|
||||
|
||||
if (GuiButton((Rectangle){startX + sliderWidth + spacing + 15, startY + 30, buttonWidth, 30}, "0.0")) {
|
||||
mic->angleM1 = 0.0f;
|
||||
}
|
||||
|
||||
const char* modeTxt = (fabs(mic->angleM1) < 0.01f) ? "MODE: LAME D'AIR" : "MODE: COIN D'AIR";
|
||||
Color modeColor = (fabs(mic->angleM1) < 0.01f) ? SKYBLUE : GREEN;
|
||||
DrawText(modeTxt, startX, startY + 75, 20, modeColor);
|
||||
|
||||
startY += 140;
|
||||
DrawRectangleLines(startX - 10, startY - 10, contentWidth + 20, 100, GRAY);
|
||||
DrawText("Données temps réel", startX, startY, 20, LIGHTGRAY);
|
||||
|
||||
float delta = 2 * (mic->d1 - mic->d2);
|
||||
DrawText(TextFormat("Delta (m) = %.2f", delta), startX, startY + 35, 22, WHITE);
|
||||
|
||||
float p = delta / (mic->lambda / 10.0f);
|
||||
DrawText(TextFormat("Ordre p = %.2f", p), startX, startY + 65, 22, LIGHTGRAY);
|
||||
}
|
||||
|
||||
int main () {
|
||||
InitWindow(1200, 800, "Interféromètre de Michelson");
|
||||
SetTextLineSpacing(144);
|
||||
SetConfigFlags(FLAG_MSAA_4X_HINT);
|
||||
InitWindow(1920, 1080, "Interferometre de Michelson - Full HD");
|
||||
SetTargetFPS(60);
|
||||
|
||||
Michelson *michelson = (Michelson*)malloc(sizeof(Michelson));
|
||||
michelson->d1 = 100;
|
||||
michelson->d2 = 100;
|
||||
michelson->lambda = 450;
|
||||
michelson->angleM2 = 45;
|
||||
Michelson mic = {0};
|
||||
mic.center = (Vector2){ UI_WIDTH + (1920 - UI_WIDTH) / 2.0f, 1080 / 2.0f };
|
||||
|
||||
mic.d1 = 250.0f;
|
||||
mic.d2 = 250.0f;
|
||||
|
||||
mic.lambda = 500.0f;
|
||||
mic.angleM1 = 0.0f;
|
||||
|
||||
while (!WindowShouldClose()) {
|
||||
BeginDrawing();
|
||||
ClearBackground(BLACK);
|
||||
DrawText("Interféromètre de Michelson", 100, 10, 25, WHITE);
|
||||
|
||||
DrawMichelsonSchema(michelson);
|
||||
|
||||
/*
|
||||
DrawLine(0, 0, 120 , 120, WHITE);
|
||||
Vector2 start = {120.0f, 120.0f};
|
||||
Vector2 end = {500.0f, 500.0f};
|
||||
DrawLineEx(start, end, 6.0f, WHITE);
|
||||
*/
|
||||
DrawMichelsonSchema(&mic);
|
||||
DrawControlPanel(&mic);
|
||||
EndDrawing();
|
||||
}
|
||||
CloseWindow();
|
||||
|
||||
Reference in New Issue
Block a user