Files
opennurbs/opennurbs_sun.h
2024-04-11 14:21:33 -07:00

325 lines
13 KiB
C++

//
// Copyright (c) 1993-2022 Robert McNeel & Associates. All rights reserved.
// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
// McNeel & Associates.
//
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
// MERCHANTABILITY ARE HEREBY DISCLAIMED.
//
// For complete openNURBS copyright information see <http://www.opennurbs.org>.
//
////////////////////////////////////////////////////////////////
#if !defined(ON_SUN_INC_)
#define ON_SUN_INC_
// Class ON_SunEngine is a sun astronomical calculation engine.
class ON_CLASS ON_SunEngine
{
public:
enum class Accuracy
{
Minimum, // Suitable for doing many calculations when you just need rough results quickly.
Maximum, // Suitable for generating accurate tables of sun positions (e.g., an ephemeris).
};
ON_SunEngine(Accuracy a);
ON_SunEngine(const ON_SunEngine&);
virtual ~ON_SunEngine();
const ON_SunEngine& operator = (const ON_SunEngine&);
bool operator == (const ON_SunEngine& e);
bool operator != (const ON_SunEngine& e);
// Return the latitude of the observer in degrees.
virtual double Latitude(void) const;
// Return the longitude of the observer in degrees.
virtual double Longitude(void) const;
// Set the latitude of the observer in degrees. Must be in the range -90 to +90.
// This value is used by the calculation of the sun's azimuth and altitude.
// Returns true if latitude is valid, else false.
virtual bool SetLatitude(double dLat);
// Set the longitude of the observer in degrees. Must be in the range -180 to +180.
// This value is used by the calculation of the sun's azimuth and altitude.
// Returns true if longitude is valid, else false.
virtual bool SetLongitude(double dLong);
// Set the time zone of the observer in hours. Must be in the range -12 to +13.
// Returns true if hours is valid, else false.
virtual bool SetTimeZoneHours(double dHours);
// Set the daylight saving of the observer in minutes. Must be in the range 0 to 120.
// Returns true if minutes is valid, else false.
virtual bool SetDaylightSavingMinutes(int iMinutes);
// Set the local date and time of the observer. The date must lie between 1800 and 2199 inclusive.
// The time is supplied as decimal hours which must be in the range 0 to 24.
// Returns true if date and time are valid, else false.
virtual bool SetLocalDateTime(int iYear, int iMonth, int iDay, double dHours);
// Set the local Julian Day of the observer. Optional alternative to calling SetLocalDateTime().
// Returns true if Julian Day is valid, else false.
virtual bool SetLocalJulianDay(double dLocalJulianDay);
// Returns The azimuth of the sun in degrees.
virtual double Azimuth(void) const;
// Returns The altitude of the sun in degrees.
virtual double Altitude(void) const;
// Returns The Julian Day corresponding to Universal Time (UT ~ GMT).
virtual double JulianDay(void) const;
// Returns The Julian Day corresponding to local time.
virtual double LocalJulianDay(void) const;
// Returns The time zone of the observer in hours.
virtual double TimeZoneHours(void) const;
// Returns The daylight saving of the observer in minutes.
virtual int DaylightSavingMinutes(void) const;
// Gets the local date and time of the observer.
// Param year accepts the year in the range 1800 to 2199.
// Param month accepts the month in the range 1 to 12.
// Param day accepts the day in the range 1 to 31.
// Param hours accepts the hour in the range 0 to 24.
virtual void LocalDateTime(int& year, int& month, int& day, double& hours) const;
// Helper function; returns the number of days in a month for a specific year.
static int DaysInMonth(int month, int year);
// Helper function; converts azimuth and altitude to unit vector.
static void ConvertHorizonCoordsToSolarVector(double dAzimuth, double dAltitude, double* dVector);
// Helper function; converts unit vector to azimuth and altitude.
static void ConvertSolarVectorToHorizonCoords(const double* dVector, double& dAzimuth, double& dAltitude);
// Helper function; gets the current local date and time.
static void GetCurrentLocalDateTime(int& y, int& m, int& d, double& h);
private:
class CImpl;
CImpl* _impl;
};
// Class ON_Sun represents a 'sun'. It can calculate the apparent position of the sun in the sky
// at a particular instant for a particular location on the Earth's surface. It can also be used
// to get the sun's color, a light representing the sun, or to generate an ephemeris.
class ON_CLASS ON_Sun
{
public:
ON_Sun();
ON_Sun(ON_EarthAnchorPoint& eap);
ON_Sun(ON_XMLNode& model_node);
ON_Sun(const ON_Sun& sun);
virtual ~ON_Sun();
// Returns the minimum allowed year for sun methods.
static int MinYear(void);
// Returns the maximum allowed year for sun methods.
static int MaxYear(void);
virtual const ON_Sun& operator = (const ON_Sun& sun);
virtual bool operator == (const ON_Sun& sun) const;
virtual bool operator != (const ON_Sun& sun) const;
// Returns true if enabling/disabling the sun is allowed, else false.
virtual bool EnableAllowed(void) const;
// Returns true if the sun is enabled, else false.
virtual bool EnableOn(void) const;
// Returns true if manual control of the sun position is allowed, else false.
virtual bool ManualControlAllowed(void) const;
// Returns true if manual control of the sun position is in effect, else false.
virtual bool ManualControlOn(void) const;
// Returns The world angle corresponding to North in degrees.
// This angle is zero along the x-axis and increases anticlockwise.
virtual double North(void) const;
// Returns the azimuth of the sun in degrees. The value increases Eastwards with North as zero.
// Note: This value is not affected by the direction of north. See North().
virtual double Azimuth(void) const;
// Returns the altitude of the sun in degrees.
virtual double Altitude(void) const;
// Returns the latitude of the observer.
virtual double Latitude(void) const;
// Returns the longitude of the observer.
virtual double Longitude(void) const;
// Returns the time zone of the observer in decimal hours.
virtual double TimeZone(void) const;
// Returns true if daylight saving is on, else false.
virtual bool DaylightSavingOn(void) const;
// Returns the daylight saving offset of the observer in minutes.
virtual int DaylightSavingMinutes(void) const;
// Retrieves the local date and time of the observer.
// Param year accepts the year in the range MinYear() to MaxYear().
// Param month accepts the month in the range 1 to 12.
// Param day accepts the day in the range 1 to 31.
// Param hours accepts the time expressed as decimal hours in the range 0 to 24.
// Returns The local date and time of the observer.
virtual void LocalDateTime(int& year, int& month, int& day, double& hours) const;
// Returns the intensity to be used for the sun. This is 1.0 by default.
virtual double Intensity(void) const;
// This is currently unused.
virtual double ShadowIntensity(void) const;
// Set whether or not enabling/disabling the sun is allowed.
virtual void SetEnableAllowed(bool allowed);
// Set whether or not the sun is enabled.
virtual void SetEnableOn(bool on);
// Set whether or not manual control of the sun position is allowed.
virtual void SetManualControlAllowed(bool allowed);
// Set whether or not manual control of the sun position is in effect.
virtual void SetManualControlOn(bool manual);
// Set the azimuth corresponding to North.
// north is the world angle corresponding to North in degrees in the range 0 to 360.
// This angle is zero along the x-axis and increases anticlockwise.
virtual void SetNorth(double north);
// Set the azimuth of the sun when manual control is in effect.
// Param azimuth is the sun's azimuth in degrees. The value increases Eastwards with North as zero.
// Note: This value is not affected by the direction of north.
virtual void SetAzimuth(double azimuth);
// Set the sun's altitude when manual control is in effect.
// Param altitude is the sun's altitude in degrees in the range -90 to +90.
virtual void SetAltitude(double altitude);
// Set the latitude of the observer.
// Param latitude is the observer's latitude in degrees in the range -90 to +90.
virtual void SetLatitude(double latitude);
// Set the longitude of the observer.
// Param longitude is the observer's longitude in degrees in the range -180 to +180.
virtual void SetLongitude(double longitude);
// Set the time zone of the observer in hours, in the range -12 to +13.
virtual void SetTimeZone(double hours);
// Set whether or not the observer is using daylight saving time.
virtual void SetDaylightSavingOn(bool on);
// Set the daylight saving of the observer in minutes, in the range 0 to 120.
virtual void SetDaylightSavingMinutes(int minutes);
// Set the local date and time of the observer.
// Param year is the year which must lie between MinYear() to MaxYear() inclusive.
// Param month is the month in the range 1 to 12.
// Param day is the day in the range 1 to 31.
// Param hours is the time expressed as decimal hours in the range 0 to 24.
// Returns true if successful, false if the date is out of range.
virtual bool SetLocalDateTime(int year, int month, int day, double hours);
// This is currently unused.
virtual void SetShadowIntensity(double intensity);
// Set the intensity to be used for the sun. This is 1.0 by default.
virtual void SetIntensity(double intensity);
// Returns the CRC of the sun state.
virtual ON__UINT32 DataCRC(ON__UINT32 current_remainder) const;
// Returns true if all the sun parameters are valid, or false if any value is invalid.
virtual bool IsValid(void) const;
// Load the sun properties from a 'sun' XML node.
virtual void LoadFromXMLNode(const ON_XMLNode& node);
// Save the sun properties to a 'sun' XML node.
virtual void SaveToXMLNode(ON_XMLNode& node) const;
// Write the sun properties to an archive.
virtual bool WriteToArchive(ON_BinaryArchive& archive) const;
// Read the sun properties from an archive that was created by WriteToArchive().
virtual bool ReadFromArchive(ON_BinaryArchive& archive);
// Emergency virtual function for future expansion.
virtual void* EVF(const wchar_t* func, void* data);
// For internal use only.
virtual void OnInternalXmlChanged(const ON_Sun*);
// Get the accuracy of the sun calculations. The default is minimum accuracy (for more speed).
virtual ON_SunEngine::Accuracy Accuracy(void) const;
// Set the accuracy of the sun calculations. The default is minimum accuracy (for more speed).
virtual void SetAccuracy(ON_SunEngine::Accuracy acc);
// Get a color for rendering a sun light when the sun is at a particular altitude in the sky.
static ON_4fColor SunColorFromAltitude(double altitude);
// Returns true if the specified time is within the range supported by ON_Sun.
static bool IsValidDateTime(int year, int month, int day, int hour, int min, int sec);
public: // These utility methods are provided for convenience and perform calculations by using ON_SunEngine.
// Get an ON_Light which represents the sun. Note that this does not actually calculate the sun's
// azimuth or altitude from the place and time. It merely uses the stored azimuth and altitude values.
virtual ON_Light Light(void) const;
// Retrieves the date and time of the observer expressed in Coordinated Universal Time. This is the same
// as the local date and time adjusted for the observer's time zone and daylight saving.
// Param year accepts the year in the range MinYear() to MaxYear().
// Param month accepts the month in the range 1 to 12.
// Param day accepts the day in the range 1 to 31.
// Param hours accepts the time expressed as decimal hours in the range 0 to 24.
// Returns The UTC date and time of the observer.
virtual void UTCDateTime(int& year, int& month, int& day, double& hours) const;
// Set the date and time of the observer expressed in Coordinated Universal Time. This is the same
// as the local date and time adjusted for the observer's time zone and daylight saving.
// Param year is the year which must lie between MinYear() to MaxYear() inclusive.
// Param month is the month in the range 1 to 12.
// Param day is the day in the range 1 to 31.
// Param hours is the time expressed as decimal hours in the range 0 to 24.
// Returns true if successful, false if the date is out of range.
virtual bool SetUTCDateTime(int year, int month, int day, double hours);
// Returns The sun's direction vector in world space, taking into account the sun's azimuth and
// altitude and the direction of north. Note that this does not actually calculate the azimuth or
// altitude from the place and time; it merely uses the stored azimuth and altitude values.
virtual ON_3dVector CalculateVectorFromAzimuthAndAltitude(void) const;
// Calculates and sets the sun's azimuth and altitude taking into account the direction of north.
virtual void SetAzimuthAndAltitudeFromVector(const ON_3dVector& v);
private: // For internal use only.
friend class ON_3dmRenderSettingsPrivate;
void SetXMLNode(ON_XMLNode& node) const;
friend class ONX_Model;
void UseEarthAnchorPoint(ON_EarthAnchorPoint& eap);
private:
class CImpl;
CImpl* _impl;
};
#endif