Kreisbahn und Höhe in Grad berechnen

  • C#
  • .NET 7–8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Kreisbahn und Höhe in Grad berechnen

    Moin moin

    Ich habe mich nun mal in den letzten Wochen an C# gemacht.
    Bisher komme ich besser zurecht als gedacht. Außer das ich ständig diese ";" vergesse und mich diese "{ }" püühhhh Große Umstellung...

    Aufgabe ist es die Höhe einer Sonne in Grad in einem fiktiven System zu ermitteln. Diese zieht der Einfachheit halber eine Kreisbahn. Dazu gibt es bestimmte Vorgaben.

    Die Uhrzeit / Tageszeit / Wochentags Berechnungen funktionieren.
    Für den ersten "Halbkreis" ( Tagesseite ) klappt das fast mit dem Sonnenstand.

    Dann kommen die Probleme, wenn diese Sonne in den negativen Bereich (Nachtseite) laufen soll.
    Bzw der Tag/Nachtwechsel 20:00 Uhr / 00:00 Uhr. <==== Die müssten ja beide den selben Wert haben -90°
    Das bekomme ich nicht hin.

    Ich hoffe ihr habt verstanden :)

    Alten Code entfernt, das nicht mehr aktuell.
    Thema ist erledigt. ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()

    Zufälligerweise baue ich gerade eine Bibliothek, die mir ein bissle bei geometrischen Konstruktionen helfen soll. Allerdings in vb.net

    Da habe ich auch einiges mit Bögen und Kreisen zutun.
    Die Sonne hat eine Position, die Position x, y ist abhängig vom Winkel auf dem Kreis.
    x = R*Cos(phi)
    y = R*Cos(phi)

    Der Winkel phi ist nur eine Umwandlung der Uhrzeit. 1 Stunde = pi/12, 1 Sekunde = pi/43200

    Wie du drauf kommst dass 20:00 Uhr und 00:00Uhr auf 90° stehen, verstehe ich nicht. Wobei kommt ja auch drauf an, wo man 0 definiert.
    Schon gar nicht -90. Besser ist den Winkel von 0 bis 360 zu betrachten oder eben 0 bis 2Pi

    Aber nu seh ich wiederum hast du 40 Minuten in der Stunde und 20 Stunden im Tag? Was bedeutet das?

    VB.NET-Quellcode

    1. Public Function GetSunCoordinates(dat as Date, radius) as Double()
    2. Dim phi = (dat - dat.Date).TotalSeconds * Math.PI / 43200
    3. Return {radius * Math.Cos(phi), radius * Math.Sin(phi)}
    4. End Function

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Amelie schrieb:

    Außer das ich ständig diese ";" vergesse und mich diese "{ }" püühhhh Große Umstellung...


    upload.wikimedia.org/wikipedia…board_(105)_QWERTY_UK.svg

    Ich kann dir andere tastaturlayouts empfehlen. UK Querty z.B. siehe verlinktes Bild, da hat mans leicht mit dem ; und den Klammern. Hat aber den nachteil, das man keine Sonderzeichen hat, die Tippe ich immer via Alt-Code. ALT halten und dann aufm Numpad einen mehrstelligen Code eingeben. ALT und 0246 = ö, ALT und 3 = ♥ als Beispiele. Kannst aber auch 2 Tastaturen(UK-Querty und Deutsch) nehmen, dazu ALT + Space nutzen zum umschalten des Layouts. Jenachdem ob du Programmierst oder nicht, das Layout wählen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Kleines Update....
    So funktioniert es nun ;)

    Spoiler anzeigen

    C#-Quellcode

    1. // file: SolarSystemData.cs
    2. using System;
    3. using System.Collections.Generic;
    4. namespace Lib_SolarSystem
    5. .....
    6. ...
    7. // Verfeinerte Struktur für Himmelsrichtungen und Tageszeiten
    8. public struct DaySegment
    9. {
    10. public string Direction { get; }
    11. public double StartDegree { get; }
    12. public double EndDegree { get; }
    13. public string DayPeriod { get; }
    14. public double StartFraction { get; }
    15. public double EndFraction { get; }
    16. public DaySegment(string direction, double startDegree, double endDegree, string dayPeriod, double startFraction, double endFraction)
    17. {
    18. Direction = direction;
    19. StartDegree = startDegree;
    20. EndDegree = endDegree;
    21. DayPeriod = dayPeriod;
    22. StartFraction = startFraction;
    23. EndFraction = endFraction;
    24. }
    25. }
    26. public static readonly List<DaySegment> DaySegments = new List<DaySegment>
    27. {
    28. new DaySegment("Aurora", 315.0, 340.0, "Aurathos", 1.5, 3.0), // Nordwesten, Morgendämmerung
    29. new DaySegment("Caelum Solara", 340.0, 360.0, "Solarvion", 3.0, 5.0), // Westen, Sonnenaufgang, früher Morgen
    30. new DaySegment("Caelum Solara", 0.0, 20.0, "Solarvion", 3.0, 5.0), // Westen, Sonnenaufgang, früher Morgen
    31. new DaySegment("Luminor", 20.0, 70.0, "Umbrah", 5.0, 8.0), // Südwesten, Vormittag
    32. new DaySegment("Hyperion", 70.0, 110.0, "Zenithor", 8.0, 11.0), // Süden, Hochmittag (High Noon)
    33. new DaySegment("Ambriles", 110.0, 170.0, "Nyxvaris", 11.0, 13.0), // Südosten, Nachmittag
    34. new DaySegment("Nyx Vallis", 170.0, 200.0, "Umbrathor", 13.0, 15.0), // Osten, Sonnenuntergang, Abenddämmerung
    35. new DaySegment("Umbra Terra", 200.0, 250.0, "Noctaron", 15.0, 20.0), // Nordosten, Abend, Einbruch der Nacht
    36. new DaySegment("Noctis Apex", 250.0, 315.0, "Noctis", 0.0, 1.5) // Norden, Nacht
    37. };

    C#-Quellcode

    1. // file: SolarSystemSeasonManager.cs
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Linq;
    5. namespace Lib_SolarSystem
    6. {
    7. public class SolarSystemSeasonManager
    8. {
    9. private readonly int daysInYear;
    10. private const double PositionStep = 1.0; // Step size for sun position in degrees
    11. public SolarSystemSeasonManager(int daysInYear)
    12. {
    13. this.daysInYear = daysInYear;
    14. }
    15. // Returns the description of the current season based on the day of the year
    16. public string GetCurrentSeasonDescription(int dayOfYear)
    17. {
    18. double dayFraction = dayOfYear / (double)daysInYear;
    19. foreach (var season in SolarSystemData.SeasonNames)
    20. {
    21. if (dayFraction >= season.StartFraction && dayFraction < season.EndFraction)
    22. {
    23. return SolarSystemData.SeasonDescriptions[SolarSystemData.SeasonNames.IndexOf(season)];
    24. }
    25. }
    26. return SolarSystemData.SeasonDescriptions.Last();
    27. }
    28. // Calculates the sun's height based on the time of day
    29. private double CalculateSunHeight(int hour, int minute)
    30. {
    31. double dayLength = SolarSystemConfig.HoursInDay;
    32. double decimalTime = hour + (minute / (double)SolarSystemConfig.MinutesInHour);
    33. double noonHour = SolarSystemConfig.NoonHour;
    34. double maxSunAltitude = SolarSystemConfig.MaxSunAltitude;
    35. double timeFromNoon = (decimalTime - noonHour) / (dayLength / 2.0);
    36. double sunHeight = maxSunAltitude * Math.Cos(timeFromNoon * Math.PI);
    37. return sunHeight;
    38. }
    39. // Calculates the sun's position based on the time of day
    40. private double CalculateSunPosition(int hour, int minute)
    41. {
    42. double decimalTime = hour + (minute / (double)SolarSystemConfig.MinutesInHour);
    43. foreach (var segment in SolarSystemData.DaySegments)
    44. {
    45. if (decimalTime >= segment.StartFraction && decimalTime < segment.EndFraction)
    46. {
    47. double position = segment.StartDegree + (decimalTime - segment.StartFraction) / (segment.EndFraction - segment.StartFraction) * (segment.EndDegree - segment.StartDegree);
    48. return RoundToNearestStep(position);
    49. }
    50. }
    51. return 0.0;
    52. }
    53. // Rounds the position to the nearest step
    54. private double RoundToNearestStep(double position)
    55. {
    56. return Math.Round(position / PositionStep) * PositionStep;
    57. }
    58. // Determines the sun's direction based on the position
    59. private (string Direction, double Degree) GetSunDirection(double decimalTime)
    60. {
    61. foreach (var segment in SolarSystemData.DaySegments)
    62. {
    63. if (decimalTime >= segment.StartFraction && decimalTime < segment.EndFraction)
    64. {
    65. double degree = (segment.StartDegree + segment.EndDegree) / 2.0;
    66. return (segment.Direction, RoundToNearestStep(degree));
    67. }
    68. }
    69. return ("Unknown", 0.0);
    70. }
    71. // Calculates sun information based on the current day and time
    72. public (double Position, string Direction, double Height, string TimeDescription) GetSunInfo(int dayOfYear, SolarSystemTimeManager currentTime)
    73. {
    74. double decimalTime = currentTime.Hour + (currentTime.Minute / (double)SolarSystemConfig.MinutesInHour);
    75. string timeDescription = GetSunTimeDescription(decimalTime);
    76. var sunDirectionInfo = GetSunDirection(decimalTime);
    77. double sunPosition = CalculateSunPosition(currentTime.Hour, currentTime.Minute);
    78. double sunHeight = CalculateSunHeight(currentTime.Hour, currentTime.Minute);
    79. return (sunPosition, sunDirectionInfo.Direction, sunHeight, timeDescription);
    80. }
    81. // Returns a description of the current time of day
    82. public string GetSunTimeDescription(double decimalTime)
    83. {
    84. foreach (var segment in SolarSystemData.DaySegments)
    85. {
    86. if (decimalTime >= segment.StartFraction && decimalTime < segment.EndFraction)
    87. {
    88. return segment.DayPeriod;
    89. }
    90. }
    91. return "Invalid time.";
    92. }
    93. }
    94. }

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: