Updating .gitignore
This commit is contained in:
@@ -3,3 +3,7 @@ nob
|
|||||||
nob.old
|
nob.old
|
||||||
|
|
||||||
|
|
||||||
|
Doppelspaltapp-Linux-x86-64
|
||||||
|
main
|
||||||
|
Makefile
|
||||||
|
|
||||||
|
|||||||
@@ -1,351 +0,0 @@
|
|||||||
// DoppelspaltApp.c
|
|
||||||
#include <raylib.h>
|
|
||||||
|
|
||||||
#define RAYGUI_IMPLEMENTATION
|
|
||||||
#include <raygui.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int lambda;
|
|
||||||
int gitterD;
|
|
||||||
int winkel;
|
|
||||||
float dLambda;
|
|
||||||
int amplitude;
|
|
||||||
} AppState;
|
|
||||||
|
|
||||||
AppState state = {50, 75, 90, 1.5, 40};
|
|
||||||
|
|
||||||
void DrawKugelwelle(int x, int y, int breite, int hoehe, AppState* state, Color color) {
|
|
||||||
const int apertur = 90;
|
|
||||||
int s0;
|
|
||||||
double phi = (state->winkel - 90) * PI / 180.0;
|
|
||||||
|
|
||||||
if (y > hoehe / 2) {
|
|
||||||
s0 = (int)((double) state->gitterD / 2.0 * sin(phi)) % state->lambda;
|
|
||||||
} else {
|
|
||||||
s0 = -(int)((double) state->gitterD / 2.0 * sin(phi)) % state->lambda;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i * state->lambda + s0 < breite; i++) {
|
|
||||||
int radius = i * state->lambda + s0;
|
|
||||||
|
|
||||||
if (radius > 0) {
|
|
||||||
DrawCircleLines(x, y, radius, color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawWavesFromSlits(int screenWidth, int screenHeight, AppState* state) {
|
|
||||||
int xSpalt = screenWidth / 3;
|
|
||||||
int ySpalt1 = (screenHeight - state->gitterD) / 2;
|
|
||||||
int ySpalt2 = (screenHeight + state->gitterD) / 2;
|
|
||||||
|
|
||||||
int sizeFeld = sqrt((screenWidth - xSpalt) * (screenWidth - xSpalt) + screenHeight * screenHeight);
|
|
||||||
|
|
||||||
DrawKugelwelle(xSpalt, ySpalt1, sizeFeld, screenHeight, state, BLACK);
|
|
||||||
|
|
||||||
DrawKugelwelle(xSpalt, ySpalt2, sizeFeld, screenHeight, state, BLACK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DrawInterferencePoints(int breite, int hoehe, Color color) {
|
|
||||||
double phi = (state.winkel - 90) * M_PI / 180.0;
|
|
||||||
double s0 = fmod((double) state.gitterD / 2.0 * sin(phi), state.lambda);
|
|
||||||
int nWellen = breite / state.lambda;
|
|
||||||
//int tempR3 = (breite / hoehe) * 10;
|
|
||||||
int tempR3 = 12;
|
|
||||||
if (state.lambda <= 20) tempR3 = 8;
|
|
||||||
if (state.lambda <= 15) tempR3 = 4;
|
|
||||||
|
|
||||||
if (tempR3 < 5) tempR3 = 5;
|
|
||||||
|
|
||||||
for (int i1 = 0; i1 < nWellen; i1++) {
|
|
||||||
for (int i2 = 0; i2 < nWellen; i2++) {
|
|
||||||
double tempR1 = i1 * state.lambda - s0;
|
|
||||||
double tempR2 = i2 * state.lambda + s0;
|
|
||||||
|
|
||||||
if (tempR1 + tempR2 > state.gitterD && tempR1 <= tempR2 + state.gitterD && tempR2 <= tempR1 + state.gitterD) {
|
|
||||||
if (state.gitterD != 0) {
|
|
||||||
double tempY = (tempR1 * tempR1 - tempR2 * tempR2 + state.gitterD * state.gitterD) / (2.0 * state.gitterD);
|
|
||||||
double tempX = sqrt(tempR1 * tempR1 - tempY * tempY);
|
|
||||||
|
|
||||||
//int circleX = breite / 16 + (int)tempX - tempR3 / 2 + 480;
|
|
||||||
int circleX = breite / 3 + (int)tempX;
|
|
||||||
int circleY = (hoehe - state.gitterD) / 2 + ((int)tempY - tempR3 / 2) + 10;
|
|
||||||
//int circleY = centerYBar + (int)tempY - state.lambda / 2;
|
|
||||||
|
|
||||||
DrawCircle(circleX, circleY, tempR3, color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DrawSphericalWave(int x, int y, int width, int height) {
|
|
||||||
const int apertur = 90;
|
|
||||||
double phi = (state.winkel - 90) * PI / 180.0;
|
|
||||||
int s0;
|
|
||||||
|
|
||||||
if (y > height / 2) {
|
|
||||||
s0 = (int)((double)state.gitterD / 2.0 * sin(phi)) % state.lambda;
|
|
||||||
} else {
|
|
||||||
s0 = -(int)((double)state.gitterD / 2.0 * sin(phi)) % state.lambda;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i * state.lambda + s0 < width; i++) {
|
|
||||||
int circleX = x - i * state.lambda - s0;
|
|
||||||
int circleY = y - i * state.lambda - s0;
|
|
||||||
int diameter = 2 * (i * state.lambda + s0);
|
|
||||||
|
|
||||||
DrawEllipseLines(circleX, circleY, diameter, diameter, BLACK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DrawPlaneWave(int width, int height) {
|
|
||||||
double dWinkel = state.winkel * PI / 180.0;
|
|
||||||
double nX = sin(dWinkel);
|
|
||||||
double nY = cos(dWinkel);
|
|
||||||
|
|
||||||
double d0, d1, dMin, dMax;
|
|
||||||
if (state.winkel < 90) {
|
|
||||||
dMin = 0.0;
|
|
||||||
d1 = (double)width * nX + (double)height / 2.0 * nY;
|
|
||||||
dMax = (double)width * nX + (double)height * nY;
|
|
||||||
} else {
|
|
||||||
dMin = (double)height * nY;
|
|
||||||
d1 = (double)width * nX + (double)height / 2.0 * nY;
|
|
||||||
dMax = (double)width * nX;
|
|
||||||
}
|
|
||||||
|
|
||||||
d0 = dMin + fmod(d1 - dMin, (double)state.lambda);
|
|
||||||
for (double d = d0; d < dMax; d += (double)state.lambda) {
|
|
||||||
int x0, y0;
|
|
||||||
|
|
||||||
double schnittX_Achse = d / nY;
|
|
||||||
double schnittY_Achse = d / nX;
|
|
||||||
double schnittX_breite = (d - (double)width * nX) / nY;
|
|
||||||
double schnittY_hoehe = (d - (double)height * nY) / nX;
|
|
||||||
|
|
||||||
if (schnittY_Achse < 0.0) {
|
|
||||||
x0 = 0;
|
|
||||||
y0 = (int)schnittX_Achse;
|
|
||||||
} else if (schnittY_Achse < (double)width) {
|
|
||||||
x0 = (int)schnittY_Achse;
|
|
||||||
y0 = 0;
|
|
||||||
} else {
|
|
||||||
x0 = width;
|
|
||||||
y0 = (int)schnittX_breite;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawVerticalLines(int breite, int hoehe, int lambda, int winkel) {
|
|
||||||
double dWinkel = winkel * PI / 180.0;
|
|
||||||
|
|
||||||
if (winkel == 90) {
|
|
||||||
for (int i = breite; i > 0; i -= lambda)
|
|
||||||
DrawLine(i, 0, i, hoehe, BLACK);
|
|
||||||
} else if (winkel == 0 || winkel == 180) {
|
|
||||||
for (int i = (hoehe / 2) % lambda; i <= hoehe; i += lambda)
|
|
||||||
DrawLine(0, i, breite, i, BLACK);
|
|
||||||
} else {
|
|
||||||
double nX = sin(dWinkel);
|
|
||||||
double nY = cos(dWinkel);
|
|
||||||
|
|
||||||
double d0, d1, dMin, dMax;
|
|
||||||
if (winkel < 90) {
|
|
||||||
dMin = 0.0;
|
|
||||||
d1 = (double)breite * nX + (double)hoehe / 2.0 * nY;
|
|
||||||
dMax = (double)breite * nX + (double)hoehe * nY;
|
|
||||||
} else {
|
|
||||||
dMin = (double)hoehe * nY;
|
|
||||||
d1 = (double)breite * nX + (double)hoehe / 2.0 * nY;
|
|
||||||
dMax = (double)breite * nX;
|
|
||||||
}
|
|
||||||
|
|
||||||
d0 = dMin + fmod(d1 - dMin, (double)lambda);
|
|
||||||
for (double d = d0; d < dMax; d += (double)lambda) {
|
|
||||||
int x0, y0, x1, y1;
|
|
||||||
|
|
||||||
double schnittX_Achse = d / nY;
|
|
||||||
double schnittY_Achse = d / nX;
|
|
||||||
double schnittX_breite = (d - (double)breite * nX) / nY;
|
|
||||||
double schnittY_hoehe = (d - (double)hoehe * nY) / nX;
|
|
||||||
|
|
||||||
if (schnittY_Achse < 0.0) {
|
|
||||||
x0 = 0;
|
|
||||||
y0 = (int)schnittX_Achse;
|
|
||||||
} else if (schnittY_Achse < (double)breite) {
|
|
||||||
x0 = (int)schnittY_Achse;
|
|
||||||
y0 = 0;
|
|
||||||
} else {
|
|
||||||
x0 = breite;
|
|
||||||
y0 = (int)schnittX_breite;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (schnittY_hoehe < 0.0) {
|
|
||||||
x1 = 0;
|
|
||||||
y1 = (int)schnittX_Achse;
|
|
||||||
} else if (schnittY_hoehe < (double)breite) {
|
|
||||||
x1 = (int)schnittY_hoehe;
|
|
||||||
y1 = hoehe;
|
|
||||||
} else {
|
|
||||||
x1 = breite;
|
|
||||||
y1 = (int)schnittX_breite;
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawLine(x0, y0, x1, y1, BLACK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawSinAndWall(int width, int height, AppState* state) {
|
|
||||||
int xSpalt = width / 3;
|
|
||||||
int ySpalt1 = (height - state->gitterD) / 2;
|
|
||||||
int ySpalt2 = (height + state->gitterD) / 2;
|
|
||||||
|
|
||||||
double phi = (state->winkel - 90) * PI / 180.0;
|
|
||||||
int lSinus;
|
|
||||||
|
|
||||||
if (fabs(phi) < atan((double)(0.5 * height) / (double)xSpalt)) {
|
|
||||||
lSinus = (int)((double)xSpalt / cos(phi));
|
|
||||||
} else {
|
|
||||||
lSinus = (int)(0.5 * height / fabs(sin(phi)));
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector2* points = (Vector2*)malloc(lSinus * sizeof(Vector2));
|
|
||||||
|
|
||||||
for (int i = 0; i < lSinus; i++) {
|
|
||||||
double x = (double)(i);
|
|
||||||
double y = (state->amplitude * sin(1.5 * PI + 2 * PI * (double)(i % state->lambda) / (double)state->lambda));
|
|
||||||
|
|
||||||
points[i].x = xSpalt - (x * cos(phi) - y * sin(phi));
|
|
||||||
points[i].y = x * sin(phi) + y * cos(phi) + height / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < lSinus - 1; i++) {
|
|
||||||
DrawLineV(points[i], points[i + 1], RED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int RectWidth = 5;
|
|
||||||
int loch = 5;
|
|
||||||
|
|
||||||
DrawRectangle(xSpalt - 2, 0, RectWidth, ySpalt1 - loch, BLACK);
|
|
||||||
DrawRectangle(xSpalt - 2, ySpalt1 + loch, RectWidth, ySpalt2 - ySpalt1 - (loch * 2), BLACK);
|
|
||||||
DrawRectangle(xSpalt - 2, ySpalt2 + loch, RectWidth, height - ySpalt2 - loch, BLACK);
|
|
||||||
|
|
||||||
|
|
||||||
DrawVerticalLines(xSpalt, height, state->lambda, state->winkel);
|
|
||||||
|
|
||||||
/*
|
|
||||||
DrawText(TextFormat("Wavelength (lambda): %d", state->lambda), 10, 10, 20, DARKGRAY);
|
|
||||||
DrawText(TextFormat("Slit Distance (d): %d", state->gitterD), 10, 40, 20, DARKGRAY);
|
|
||||||
DrawText(TextFormat("Angle of Incidence: %d", state->winkel), 10, 70, 20, DARKGRAY);
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
free(points);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
// Initialization
|
|
||||||
int screenWidth = 9 * 1920 / 10;
|
|
||||||
int screenHeight = 9 * 1080 / 10;
|
|
||||||
|
|
||||||
|
|
||||||
SetConfigFlags(FLAG_WINDOW_RESIZABLE); // Window configuration flags
|
|
||||||
InitWindow(screenWidth, screenHeight, "Doppelspaltenapp in C - Raylib / Raygui");
|
|
||||||
|
|
||||||
// Define initial values and bounds for sliders
|
|
||||||
float valueLambda = 50;
|
|
||||||
float valueD = 75;
|
|
||||||
float valueWinkel = 90;
|
|
||||||
|
|
||||||
// Define the height of the window box and sliders
|
|
||||||
int windowBoxHeight = GetScreenHeight() / 8 ;
|
|
||||||
int sliderHeight = GetScreenHeight() / 50;
|
|
||||||
int sliderSpacing = GetScreenHeight() / 100;
|
|
||||||
int sliderBeginY = GetScreenHeight() / 20;
|
|
||||||
int displayText = GetScreenHeight() / 25;
|
|
||||||
int Scale = GetScreenHeight() / 3;
|
|
||||||
|
|
||||||
|
|
||||||
SetTargetFPS(60);
|
|
||||||
|
|
||||||
while (!WindowShouldClose()) {
|
|
||||||
|
|
||||||
|
|
||||||
// Define bounds for the window box (bottom of the screen)
|
|
||||||
Rectangle windowBoxBounds = { 0, GetScreenHeight() - windowBoxHeight - sliderHeight, GetScreenWidth() , windowBoxHeight + sliderHeight};
|
|
||||||
|
|
||||||
// Define bounds for the sliders inside the window box
|
|
||||||
Rectangle boundsLambda = { sliderBeginY, windowBoxBounds.y + 10, windowBoxBounds.width - displayText - sliderBeginY, sliderHeight };
|
|
||||||
Rectangle boundsD = { sliderBeginY, boundsLambda.y + sliderHeight + sliderSpacing, windowBoxBounds.width - displayText - sliderBeginY, sliderHeight };
|
|
||||||
Rectangle boundsWinkel = { sliderBeginY, boundsD.y + sliderHeight + sliderSpacing, windowBoxBounds.width - displayText - sliderBeginY, sliderHeight };
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Werte in AppState aktualisieren
|
|
||||||
state.lambda = (int)valueLambda;
|
|
||||||
state.gitterD = (int)valueD;
|
|
||||||
state.winkel = (int)valueWinkel;
|
|
||||||
|
|
||||||
|
|
||||||
screenWidth = GetScreenWidth();
|
|
||||||
screenHeight = GetScreenHeight();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Rectangle whiteRect = {
|
|
||||||
.x = 0,
|
|
||||||
.y = 0,
|
|
||||||
.height = GetScreenHeight(),
|
|
||||||
.width = GetScreenWidth() / 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
BeginDrawing();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
|
||||||
|
|
||||||
|
|
||||||
DrawWavesFromSlits(GetScreenWidth(), GetScreenHeight(), &state);
|
|
||||||
//DrawInterferencePoints(GetScreenWidth() / 16, GetScreenWidth(), GetScreenHeight(), RED);
|
|
||||||
DrawInterferencePoints(GetScreenWidth(), GetScreenHeight(), RED);
|
|
||||||
|
|
||||||
DrawRectangleRec(whiteRect, RAYWHITE);
|
|
||||||
DrawSinAndWall(GetScreenWidth(), GetScreenHeight(), &state);
|
|
||||||
|
|
||||||
|
|
||||||
GuiPanel(windowBoxBounds, "");
|
|
||||||
|
|
||||||
boundsLambda.y = windowBoxBounds.y + displayText;
|
|
||||||
boundsD.y = boundsLambda.y + sliderHeight + sliderSpacing;
|
|
||||||
boundsWinkel.y = boundsD.y + sliderHeight + sliderSpacing;
|
|
||||||
|
|
||||||
//GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider Bar control
|
|
||||||
GuiSlider(boundsLambda, "Lambda", TextFormat("%2.2f", valueLambda), &valueLambda, 10, 85);
|
|
||||||
GuiSlider(boundsD, "D", TextFormat("%2.2f", valueD), &valueD, 0, 150);
|
|
||||||
GuiSlider(boundsWinkel, "Winkel", TextFormat("%2.2f", valueWinkel), &valueWinkel, 0, 180);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EndDrawing();
|
|
||||||
}
|
|
||||||
|
|
||||||
// De-Initialization
|
|
||||||
CloseWindow();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
Binary file not shown.
Reference in New Issue
Block a user