diff --git a/prettypretty/observer.py b/prettypretty/observer.py new file mode 100644 index 0000000..43b1002 --- /dev/null +++ b/prettypretty/observer.py @@ -0,0 +1,503 @@ +from collections.abc import Iterator +from dataclasses import dataclass +from typing import TypeAlias + +XYZ: TypeAlias = tuple[float, float, float] +Wavelength: TypeAlias = int + +@dataclass(frozen=True, slots=True) +class Pulse: + range: range + data: tuple[tuple[float, float, float], ...] + + +@dataclass(frozen=True, slots=True) +class StandardObserver: + year: int + angle: float + range: range + data: tuple[tuple[float, float, float], ...] + + def __iter__(self) -> Iterator[tuple[Wavelength, XYZ]]: + for λ in self.range: + yield λ, self.data[λ - self.range.start] + + +STANDARD_OBSERVER_1931 = StandardObserver( + 1931, + 2, + range(360, 831), + tuple([ + (0.000129900000, 0.000003917000, 0.000606100000), + (0.000145847000, 0.000004393581, 0.000680879200), + (0.000163802100, 0.000004929604, 0.000765145600), + (0.000184003700, 0.000005532136, 0.000860012400), + (0.000206690200, 0.000006208245, 0.000966592800), + (0.000232100000, 0.000006965000, 0.001086000000), + (0.000260728000, 0.000007813219, 0.001220586000), + (0.000293075000, 0.000008767336, 0.001372729000), + (0.000329388000, 0.000009839844, 0.001543579000), + (0.000369914000, 0.000011043230, 0.001734286000), + (0.000414900000, 0.000012390000, 0.001946000000), + (0.000464158700, 0.000013886410, 0.002177777000), + (0.000518986000, 0.000015557280, 0.002435809000), + (0.000581854000, 0.000017442960, 0.002731953000), + (0.000655234700, 0.000019583750, 0.003078064000), + (0.000741600000, 0.000022020000, 0.003486000000), + (0.000845029600, 0.000024839650, 0.003975227000), + (0.000964526800, 0.000028041260, 0.004540880000), + (0.001094949000, 0.000031531040, 0.005158320000), + (0.001231154000, 0.000035215210, 0.005802907000), + (0.001368000000, 0.000039000000, 0.006450001000), + (0.001502050000, 0.000042826400, 0.007083216000), + (0.001642328000, 0.000046914600, 0.007745488000), + (0.001802382000, 0.000051589600, 0.008501152000), + (0.001995757000, 0.000057176400, 0.009414544000), + (0.002236000000, 0.000064000000, 0.010549990000), + (0.002535385000, 0.000072344210, 0.011965800000), + (0.002892603000, 0.000082212240, 0.013655870000), + (0.003300829000, 0.000093508160, 0.015588050000), + (0.003753236000, 0.000106136100, 0.017730150000), + (0.004243000000, 0.000120000000, 0.020050010000), + (0.004762389000, 0.000134984000, 0.022511360000), + (0.005330048000, 0.000151492000, 0.025202880000), + (0.005978712000, 0.000170208000, 0.028279720000), + (0.006741117000, 0.000191816000, 0.031897040000), + (0.007650000000, 0.000217000000, 0.036210000000), + (0.008751373000, 0.000246906700, 0.041437710000), + (0.010028880000, 0.000281240000, 0.047503720000), + (0.011421700000, 0.000318520000, 0.054119880000), + (0.012869010000, 0.000357266700, 0.060998030000), + (0.014310000000, 0.000396000000, 0.067850010000), + (0.015704430000, 0.000433714700, 0.074486320000), + (0.017147440000, 0.000473024000, 0.081361560000), + (0.018781220000, 0.000517876000, 0.089153640000), + (0.020748010000, 0.000572218700, 0.098540480000), + (0.023190000000, 0.000640000000, 0.110200000000), + (0.026207360000, 0.000724560000, 0.124613300000), + (0.029782480000, 0.000825500000, 0.141701700000), + (0.033880920000, 0.000941160000, 0.161303500000), + (0.038468240000, 0.001069880000, 0.183256800000), + (0.043510000000, 0.001210000000, 0.207400000000), + (0.048995600000, 0.001362091000, 0.233692100000), + (0.055022600000, 0.001530752000, 0.262611400000), + (0.061718800000, 0.001720368000, 0.294774600000), + (0.069212000000, 0.001935323000, 0.330798500000), + (0.077630000000, 0.002180000000, 0.371300000000), + (0.086958110000, 0.002454800000, 0.416209100000), + (0.097176720000, 0.002764000000, 0.465464200000), + (0.108406300000, 0.003117800000, 0.519694800000), + (0.120767200000, 0.003526400000, 0.579530300000), + (0.134380000000, 0.004000000000, 0.645600000000), + (0.149358200000, 0.004546240000, 0.718483800000), + (0.165395700000, 0.005159320000, 0.796713300000), + (0.181983100000, 0.005829280000, 0.877845900000), + (0.198611000000, 0.006546160000, 0.959439000000), + (0.214770000000, 0.007300000000, 1.039050100000), + (0.230186800000, 0.008086507000, 1.115367300000), + (0.244879700000, 0.008908720000, 1.188497100000), + (0.258777300000, 0.009767680000, 1.258123300000), + (0.271807900000, 0.010664430000, 1.323929600000), + (0.283900000000, 0.011600000000, 1.385600000000), + (0.294943800000, 0.012573170000, 1.442635200000), + (0.304896500000, 0.013582720000, 1.494803500000), + (0.313787300000, 0.014629680000, 1.542190300000), + (0.321645400000, 0.015715090000, 1.584880700000), + (0.328500000000, 0.016840000000, 1.622960000000), + (0.334351300000, 0.018007360000, 1.656404800000), + (0.339210100000, 0.019214480000, 1.685295900000), + (0.343121300000, 0.020453920000, 1.709874500000), + (0.346129600000, 0.021718240000, 1.730382100000), + (0.348280000000, 0.023000000000, 1.747060000000), + (0.349599900000, 0.024294610000, 1.760044600000), + (0.350147400000, 0.025610240000, 1.769623300000), + (0.350013000000, 0.026958570000, 1.776263700000), + (0.349287000000, 0.028351250000, 1.780433400000), + (0.348060000000, 0.029800000000, 1.782600000000), + (0.346373300000, 0.031310830000, 1.782968200000), + (0.344262400000, 0.032883680000, 1.781699800000), + (0.341808800000, 0.034521120000, 1.779198200000), + (0.339094100000, 0.036225710000, 1.775867100000), + (0.336200000000, 0.038000000000, 1.772110000000), + (0.333197700000, 0.039846670000, 1.768258900000), + (0.330041100000, 0.041768000000, 1.764039000000), + (0.326635700000, 0.043766000000, 1.758943800000), + (0.322886800000, 0.045842670000, 1.752466300000), + (0.318700000000, 0.048000000000, 1.744100000000), + (0.314025100000, 0.050243680000, 1.733559500000), + (0.308884000000, 0.052573040000, 1.720858100000), + (0.303290400000, 0.054980560000, 1.705936900000), + (0.297257900000, 0.057458720000, 1.688737200000), + (0.290800000000, 0.060000000000, 1.669200000000), + (0.283970100000, 0.062601970000, 1.647528700000), + (0.276721400000, 0.065277520000, 1.623412700000), + (0.268917800000, 0.068042080000, 1.596022300000), + (0.260422700000, 0.070911090000, 1.564528000000), + (0.251100000000, 0.073900000000, 1.528100000000), + (0.240847500000, 0.077016000000, 1.486111400000), + (0.229851200000, 0.080266400000, 1.439521500000), + (0.218407200000, 0.083666800000, 1.389879900000), + (0.206811500000, 0.087232800000, 1.338736200000), + (0.195360000000, 0.090980000000, 1.287640000000), + (0.184213600000, 0.094917550000, 1.237422300000), + (0.173327300000, 0.099045840000, 1.187824300000), + (0.162688100000, 0.103367400000, 1.138761100000), + (0.152283300000, 0.107884600000, 1.090148000000), + (0.142100000000, 0.112600000000, 1.041900000000), + (0.132178600000, 0.117532000000, 0.994197600000), + (0.122569600000, 0.122674400000, 0.947347300000), + (0.113275200000, 0.127992800000, 0.901453100000), + (0.104297900000, 0.133452800000, 0.856619300000), + (0.095640000000, 0.139020000000, 0.812950100000), + (0.087299550000, 0.144676400000, 0.770517300000), + (0.079308040000, 0.150469300000, 0.729444800000), + (0.071717760000, 0.156461900000, 0.689913600000), + (0.064580990000, 0.162717700000, 0.652104900000), + (0.057950010000, 0.169300000000, 0.616200000000), + (0.051862110000, 0.176243100000, 0.582328600000), + (0.046281520000, 0.183558100000, 0.550416200000), + (0.041150880000, 0.191273500000, 0.520337600000), + (0.036412830000, 0.199418000000, 0.491967300000), + (0.032010000000, 0.208020000000, 0.465180000000), + (0.027917200000, 0.217119900000, 0.439924600000), + (0.024144400000, 0.226734500000, 0.416183600000), + (0.020687000000, 0.236857100000, 0.393882200000), + (0.017540400000, 0.247481200000, 0.372945900000), + (0.014700000000, 0.258600000000, 0.353300000000), + (0.012161790000, 0.270184900000, 0.334857800000), + (0.009919960000, 0.282293900000, 0.317552100000), + (0.007967240000, 0.295050500000, 0.301337500000), + (0.006296346000, 0.308578000000, 0.286168600000), + (0.004900000000, 0.323000000000, 0.272000000000), + (0.003777173000, 0.338402100000, 0.258817100000), + (0.002945320000, 0.354685800000, 0.246483800000), + (0.002424880000, 0.371698600000, 0.234771800000), + (0.002236293000, 0.389287500000, 0.223453300000), + (0.002400000000, 0.407300000000, 0.212300000000), + (0.002925520000, 0.425629900000, 0.201169200000), + (0.003836560000, 0.444309600000, 0.190119600000), + (0.005174840000, 0.463394400000, 0.179225400000), + (0.006982080000, 0.482939500000, 0.168560800000), + (0.009300000000, 0.503000000000, 0.158200000000), + (0.012149490000, 0.523569300000, 0.148138300000), + (0.015535880000, 0.544512000000, 0.138375800000), + (0.019477520000, 0.565690000000, 0.128994200000), + (0.023992770000, 0.586965300000, 0.120075100000), + (0.029100000000, 0.608200000000, 0.111700000000), + (0.034814850000, 0.629345600000, 0.103904800000), + (0.041120160000, 0.650306800000, 0.096667480000), + (0.047985040000, 0.670875200000, 0.089982720000), + (0.055378610000, 0.690842400000, 0.083845310000), + (0.063270000000, 0.710000000000, 0.078249990000), + (0.071635010000, 0.728185200000, 0.073208990000), + (0.080462240000, 0.745463600000, 0.068678160000), + (0.089739960000, 0.761969400000, 0.064567840000), + (0.099456450000, 0.777836800000, 0.060788350000), + (0.109600000000, 0.793200000000, 0.057250010000), + (0.120167400000, 0.808110400000, 0.053904350000), + (0.131114500000, 0.822496200000, 0.050746640000), + (0.142367900000, 0.836306800000, 0.047752760000), + (0.153854200000, 0.849491600000, 0.044898590000), + (0.165500000000, 0.862000000000, 0.042160000000), + (0.177257100000, 0.873810800000, 0.039507280000), + (0.189140000000, 0.884962400000, 0.036935640000), + (0.201169400000, 0.895493600000, 0.034458360000), + (0.213365800000, 0.905443200000, 0.032088720000), + (0.225749900000, 0.914850100000, 0.029840000000), + (0.238320900000, 0.923734800000, 0.027711810000), + (0.251066800000, 0.932092400000, 0.025694440000), + (0.263992200000, 0.939922600000, 0.023787160000), + (0.277101700000, 0.947225200000, 0.021989250000), + (0.290400000000, 0.954000000000, 0.020300000000), + (0.303891200000, 0.960256100000, 0.018718050000), + (0.317572600000, 0.966007400000, 0.017240360000), + (0.331438400000, 0.971260600000, 0.015863640000), + (0.345482800000, 0.976022500000, 0.014584610000), + (0.359700000000, 0.980300000000, 0.013400000000), + (0.374083900000, 0.984092400000, 0.012307230000), + (0.388639600000, 0.987418200000, 0.011301880000), + (0.403378400000, 0.990312800000, 0.010377920000), + (0.418311500000, 0.992811600000, 0.009529306000), + (0.433449900000, 0.994950100000, 0.008749999000), + (0.448795300000, 0.996710800000, 0.008035200000), + (0.464336000000, 0.998098300000, 0.007381600000), + (0.480064000000, 0.999112000000, 0.006785400000), + (0.495971300000, 0.999748200000, 0.006242800000), + (0.512050100000, 1.000000000000, 0.005749999000), + (0.528295900000, 0.999856700000, 0.005303600000), + (0.544691600000, 0.999304600000, 0.004899800000), + (0.561209400000, 0.998325500000, 0.004534200000), + (0.577821500000, 0.996898700000, 0.004202400000), + (0.594500000000, 0.995000000000, 0.003900000000), + (0.611220900000, 0.992600500000, 0.003623200000), + (0.627975800000, 0.989742600000, 0.003370600000), + (0.644760200000, 0.986444400000, 0.003141400000), + (0.661569700000, 0.982724100000, 0.002934800000), + (0.678400000000, 0.978600000000, 0.002749999000), + (0.695239200000, 0.974083700000, 0.002585200000), + (0.712058600000, 0.969171200000, 0.002438600000), + (0.728828400000, 0.963856800000, 0.002309400000), + (0.745518800000, 0.958134900000, 0.002196800000), + (0.762100000000, 0.952000000000, 0.002100000000), + (0.778543200000, 0.945450400000, 0.002017733000), + (0.794825600000, 0.938499200000, 0.001948200000), + (0.810926400000, 0.931162800000, 0.001889800000), + (0.826824800000, 0.923457600000, 0.001840933000), + (0.842500000000, 0.915400000000, 0.001800000000), + (0.857932500000, 0.907006400000, 0.001766267000), + (0.873081600000, 0.898277200000, 0.001737800000), + (0.887894400000, 0.889204800000, 0.001711200000), + (0.902318100000, 0.879781600000, 0.001683067000), + (0.916300000000, 0.870000000000, 0.001650001000), + (0.929799500000, 0.859861300000, 0.001610133000), + (0.942798400000, 0.849392000000, 0.001564400000), + (0.955277600000, 0.838622000000, 0.001513600000), + (0.967217900000, 0.827581300000, 0.001458533000), + (0.978600000000, 0.816300000000, 0.001400000000), + (0.989385600000, 0.804794700000, 0.001336667000), + (0.999548800000, 0.793082000000, 0.001270000000), + (1.009089200000, 0.781192000000, 0.001205000000), + (1.018006400000, 0.769154700000, 0.001146667000), + (1.026300000000, 0.757000000000, 0.001100000000), + (1.033982700000, 0.744754100000, 0.001068800000), + (1.040986000000, 0.732422400000, 0.001049400000), + (1.047188000000, 0.720003600000, 0.001035600000), + (1.052466700000, 0.707496500000, 0.001021200000), + (1.056700000000, 0.694900000000, 0.001000000000), + (1.059794400000, 0.682219200000, 0.000968640000), + (1.061799200000, 0.669471600000, 0.000929920000), + (1.062806800000, 0.656674400000, 0.000886880000), + (1.062909600000, 0.643844800000, 0.000842560000), + (1.062200000000, 0.631000000000, 0.000800000000), + (1.060735200000, 0.618155500000, 0.000760960000), + (1.058443600000, 0.605314400000, 0.000723680000), + (1.055224400000, 0.592475600000, 0.000685920000), + (1.050976800000, 0.579637900000, 0.000645440000), + (1.045600000000, 0.566800000000, 0.000600000000), + (1.039036900000, 0.553961100000, 0.000547866700), + (1.031360800000, 0.541137200000, 0.000491600000), + (1.022666200000, 0.528352800000, 0.000435400000), + (1.013047700000, 0.515632300000, 0.000383466700), + (1.002600000000, 0.503000000000, 0.000340000000), + (0.991367500000, 0.490468800000, 0.000307253300), + (0.979331400000, 0.478030400000, 0.000283160000), + (0.966491600000, 0.465677600000, 0.000265440000), + (0.952847900000, 0.453403200000, 0.000251813300), + (0.938400000000, 0.441200000000, 0.000240000000), + (0.923194000000, 0.429080000000, 0.000229546700), + (0.907244000000, 0.417036000000, 0.000220640000), + (0.890502000000, 0.405032000000, 0.000211960000), + (0.872920000000, 0.393032000000, 0.000202186700), + (0.854449900000, 0.381000000000, 0.000190000000), + (0.835084000000, 0.368918400000, 0.000174213300), + (0.814946000000, 0.356827200000, 0.000155640000), + (0.794186000000, 0.344776800000, 0.000135960000), + (0.772954000000, 0.332817600000, 0.000116853300), + (0.751400000000, 0.321000000000, 0.000100000000), + (0.729583600000, 0.309338100000, 0.000086133330), + (0.707588800000, 0.297850400000, 0.000074600000), + (0.685602200000, 0.286593600000, 0.000065000000), + (0.663810400000, 0.275624500000, 0.000056933330), + (0.642400000000, 0.265000000000, 0.000049999990), + (0.621514900000, 0.254763200000, 0.000044160000), + (0.601113800000, 0.244889600000, 0.000039480000), + (0.581105200000, 0.235334400000, 0.000035720000), + (0.561397700000, 0.226052800000, 0.000032640000), + (0.541900000000, 0.217000000000, 0.000030000000), + (0.522599500000, 0.208161600000, 0.000027653330), + (0.503546400000, 0.199548800000, 0.000025560000), + (0.484743600000, 0.191155200000, 0.000023640000), + (0.466193900000, 0.182974400000, 0.000021813330), + (0.447900000000, 0.175000000000, 0.000020000000), + (0.429861300000, 0.167223500000, 0.000018133330), + (0.412098000000, 0.159646400000, 0.000016200000), + (0.394644000000, 0.152277600000, 0.000014200000), + (0.377533300000, 0.145125900000, 0.000012133330), + (0.360800000000, 0.138200000000, 0.000010000000), + (0.344456300000, 0.131500300000, 0.000007733333), + (0.328516800000, 0.125024800000, 0.000005400000), + (0.313019200000, 0.118779200000, 0.000003200000), + (0.298001100000, 0.112769100000, 0.000001333333), + (0.283500000000, 0.107000000000, 0.000000000000), + (0.269544800000, 0.101476200000, 0.000000000000), + (0.256118400000, 0.096188640000, 0.000000000000), + (0.243189600000, 0.091122960000, 0.000000000000), + (0.230727200000, 0.086264850000, 0.000000000000), + (0.218700000000, 0.081600000000, 0.000000000000), + (0.207097100000, 0.077120640000, 0.000000000000), + (0.195923200000, 0.072825520000, 0.000000000000), + (0.185170800000, 0.068710080000, 0.000000000000), + (0.174832300000, 0.064769760000, 0.000000000000), + (0.164900000000, 0.061000000000, 0.000000000000), + (0.155366700000, 0.057396210000, 0.000000000000), + (0.146230000000, 0.053955040000, 0.000000000000), + (0.137490000000, 0.050673760000, 0.000000000000), + (0.129146700000, 0.047549650000, 0.000000000000), + (0.121200000000, 0.044580000000, 0.000000000000), + (0.113639700000, 0.041758720000, 0.000000000000), + (0.106465000000, 0.039084960000, 0.000000000000), + (0.099690440000, 0.036563840000, 0.000000000000), + (0.093330610000, 0.034200480000, 0.000000000000), + (0.087400000000, 0.032000000000, 0.000000000000), + (0.081900960000, 0.029962610000, 0.000000000000), + (0.076804280000, 0.028076640000, 0.000000000000), + (0.072077120000, 0.026329360000, 0.000000000000), + (0.067686640000, 0.024708050000, 0.000000000000), + (0.063600000000, 0.023200000000, 0.000000000000), + (0.059806850000, 0.021800770000, 0.000000000000), + (0.056282160000, 0.020501120000, 0.000000000000), + (0.052971040000, 0.019281080000, 0.000000000000), + (0.049818610000, 0.018120690000, 0.000000000000), + (0.046770000000, 0.017000000000, 0.000000000000), + (0.043784050000, 0.015903790000, 0.000000000000), + (0.040875360000, 0.014837180000, 0.000000000000), + (0.038072640000, 0.013810680000, 0.000000000000), + (0.035404610000, 0.012834780000, 0.000000000000), + (0.032900000000, 0.011920000000, 0.000000000000), + (0.030564190000, 0.011068310000, 0.000000000000), + (0.028380560000, 0.010273390000, 0.000000000000), + (0.026344840000, 0.009533311000, 0.000000000000), + (0.024452750000, 0.008846157000, 0.000000000000), + (0.022700000000, 0.008210000000, 0.000000000000), + (0.021084290000, 0.007623781000, 0.000000000000), + (0.019599880000, 0.007085424000, 0.000000000000), + (0.018237320000, 0.006591476000, 0.000000000000), + (0.016987170000, 0.006138485000, 0.000000000000), + (0.015840000000, 0.005723000000, 0.000000000000), + (0.014790640000, 0.005343059000, 0.000000000000), + (0.013831320000, 0.004995796000, 0.000000000000), + (0.012948680000, 0.004676404000, 0.000000000000), + (0.012129200000, 0.004380075000, 0.000000000000), + (0.011359160000, 0.004102000000, 0.000000000000), + (0.010629350000, 0.003838453000, 0.000000000000), + (0.009938846000, 0.003589099000, 0.000000000000), + (0.009288422000, 0.003354219000, 0.000000000000), + (0.008678854000, 0.003134093000, 0.000000000000), + (0.008110916000, 0.002929000000, 0.000000000000), + (0.007582388000, 0.002738139000, 0.000000000000), + (0.007088746000, 0.002559876000, 0.000000000000), + (0.006627313000, 0.002393244000, 0.000000000000), + (0.006195408000, 0.002237275000, 0.000000000000), + (0.005790346000, 0.002091000000, 0.000000000000), + (0.005409826000, 0.001953587000, 0.000000000000), + (0.005052583000, 0.001824580000, 0.000000000000), + (0.004717512000, 0.001703580000, 0.000000000000), + (0.004403507000, 0.001590187000, 0.000000000000), + (0.004109457000, 0.001484000000, 0.000000000000), + (0.003833913000, 0.001384496000, 0.000000000000), + (0.003575748000, 0.001291268000, 0.000000000000), + (0.003334342000, 0.001204092000, 0.000000000000), + (0.003109075000, 0.001122744000, 0.000000000000), + (0.002899327000, 0.001047000000, 0.000000000000), + (0.002704348000, 0.000976589600, 0.000000000000), + (0.002523020000, 0.000911108800, 0.000000000000), + (0.002354168000, 0.000850133200, 0.000000000000), + (0.002196616000, 0.000793238400, 0.000000000000), + (0.002049190000, 0.000740000000, 0.000000000000), + (0.001910960000, 0.000690082700, 0.000000000000), + (0.001781438000, 0.000643310000, 0.000000000000), + (0.001660110000, 0.000599496000, 0.000000000000), + (0.001546459000, 0.000558454700, 0.000000000000), + (0.001439971000, 0.000520000000, 0.000000000000), + (0.001340042000, 0.000483913600, 0.000000000000), + (0.001246275000, 0.000450052800, 0.000000000000), + (0.001158471000, 0.000418345200, 0.000000000000), + (0.001076430000, 0.000388718400, 0.000000000000), + (0.000999949300, 0.000361100000, 0.000000000000), + (0.000928735800, 0.000335383500, 0.000000000000), + (0.000862433200, 0.000311440400, 0.000000000000), + (0.000800750300, 0.000289165600, 0.000000000000), + (0.000743396000, 0.000268453900, 0.000000000000), + (0.000690078600, 0.000249200000, 0.000000000000), + (0.000640515600, 0.000231301900, 0.000000000000), + (0.000594502100, 0.000214685600, 0.000000000000), + (0.000551864600, 0.000199288400, 0.000000000000), + (0.000512429000, 0.000185047500, 0.000000000000), + (0.000476021300, 0.000171900000, 0.000000000000), + (0.000442453600, 0.000159778100, 0.000000000000), + (0.000411511700, 0.000148604400, 0.000000000000), + (0.000382981400, 0.000138301600, 0.000000000000), + (0.000356649100, 0.000128792500, 0.000000000000), + (0.000332301100, 0.000120000000, 0.000000000000), + (0.000309758600, 0.000111859500, 0.000000000000), + (0.000288887100, 0.000104322400, 0.000000000000), + (0.000269539400, 0.000097335600, 0.000000000000), + (0.000251568200, 0.000090845870, 0.000000000000), + (0.000234826100, 0.000084800000, 0.000000000000), + (0.000219171000, 0.000079146670, 0.000000000000), + (0.000204525800, 0.000073858000, 0.000000000000), + (0.000190840500, 0.000068916000, 0.000000000000), + (0.000178065400, 0.000064302670, 0.000000000000), + (0.000166150500, 0.000060000000, 0.000000000000), + (0.000155023600, 0.000055981870, 0.000000000000), + (0.000144621900, 0.000052225600, 0.000000000000), + (0.000134909800, 0.000048718400, 0.000000000000), + (0.000125852000, 0.000045447470, 0.000000000000), + (0.000117413000, 0.000042400000, 0.000000000000), + (0.000109551500, 0.000039561040, 0.000000000000), + (0.000102224500, 0.000036915120, 0.000000000000), + (0.000095394450, 0.000034448680, 0.000000000000), + (0.000089023900, 0.000032148160, 0.000000000000), + (0.000083075270, 0.000030000000, 0.000000000000), + (0.000077512690, 0.000027991250, 0.000000000000), + (0.000072313040, 0.000026113560, 0.000000000000), + (0.000067457780, 0.000024360240, 0.000000000000), + (0.000062928440, 0.000022724610, 0.000000000000), + (0.000058706520, 0.000021200000, 0.000000000000), + (0.000054770280, 0.000019778550, 0.000000000000), + (0.000051099180, 0.000018452850, 0.000000000000), + (0.000047676540, 0.000017216870, 0.000000000000), + (0.000044485670, 0.000016064590, 0.000000000000), + (0.000041509940, 0.000014990000, 0.000000000000), + (0.000038733240, 0.000013987280, 0.000000000000), + (0.000036142030, 0.000013051550, 0.000000000000), + (0.000033723520, 0.000012178180, 0.000000000000), + (0.000031464870, 0.000011362540, 0.000000000000), + (0.000029353260, 0.000010600000, 0.000000000000), + (0.000027375730, 0.000009885877, 0.000000000000), + (0.000025524330, 0.000009217304, 0.000000000000), + (0.000023793760, 0.000008592362, 0.000000000000), + (0.000022178700, 0.000008009133, 0.000000000000), + (0.000020673830, 0.000007465700, 0.000000000000), + (0.000019272260, 0.000006959567, 0.000000000000), + (0.000017966400, 0.000006487995, 0.000000000000), + (0.000016749910, 0.000006048699, 0.000000000000), + (0.000015616480, 0.000005639396, 0.000000000000), + (0.000014559770, 0.000005257800, 0.000000000000), + (0.000013573870, 0.000004901771, 0.000000000000), + (0.000012654360, 0.000004569720, 0.000000000000), + (0.000011797230, 0.000004260194, 0.000000000000), + (0.000010998440, 0.000003971739, 0.000000000000), + (0.000010253980, 0.000003702900, 0.000000000000), + (0.000009559646, 0.000003452163, 0.000000000000), + (0.000008912044, 0.000003218302, 0.000000000000), + (0.000008308358, 0.000003000300, 0.000000000000), + (0.000007745769, 0.000002797139, 0.000000000000), + (0.000007221456, 0.000002607800, 0.000000000000), + (0.000006732475, 0.000002431220, 0.000000000000), + (0.000006276423, 0.000002266531, 0.000000000000), + (0.000005851304, 0.000002113013, 0.000000000000), + (0.000005455118, 0.000001969943, 0.000000000000), + (0.000005085868, 0.000001836600, 0.000000000000), + (0.000004741466, 0.000001712230, 0.000000000000), + (0.000004420236, 0.000001596228, 0.000000000000), + (0.000004120783, 0.000001488090, 0.000000000000), + (0.000003841716, 0.000001387314, 0.000000000000), + (0.000003581652, 0.000001293400, 0.000000000000), + (0.000003339127, 0.000001205820, 0.000000000000), + (0.000003112949, 0.000001124143, 0.000000000000), + (0.000002902121, 0.000001048009, 0.000000000000), + (0.000002705645, 0.000000977058, 0.000000000000), + (0.000002522525, 0.000000910930, 0.000000000000), + (0.000002351726, 0.000000849251, 0.000000000000), + (0.000002192415, 0.000000791721, 0.000000000000), + (0.000002043902, 0.000000738090, 0.000000000000), + (0.000001905497, 0.000000688110, 0.000000000000), + (0.000001776509, 0.000000641530, 0.000000000000), + (0.000001656215, 0.000000598090, 0.000000000000), + (0.000001544022, 0.000000557575, 0.000000000000), + (0.000001439440, 0.000000519808, 0.000000000000), + (0.000001341977, 0.000000484612, 0.000000000000), + (0.000001251141, 0.000000451810, 0.000000000000), + ]) +) diff --git a/prettypretty/plot.py b/prettypretty/plot.py index 81eb480..fabc2aa 100644 --- a/prettypretty/plot.py +++ b/prettypretty/plot.py @@ -16,13 +16,16 @@ import argparse import math import pathlib -from typing import Any, cast +from typing import Any, cast, TypeAlias from .terminal import Terminal from .color import close_enough, Color, ColorSpace, ThemeEntry +from .observer import STANDARD_OBSERVER_1931 from .theme import current_translator, VGA +ChromaHue: TypeAlias = tuple[float, float] + def create_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( description=""" @@ -119,6 +122,7 @@ def __init__( self._gamut_step = gamut_step or 1 self._gamut_range = gamut_range or 20 self._largest_gamut: None | ColorSpace = None + self._with_spectrum = False self._volume = volume @@ -202,7 +206,9 @@ def format_counts(self) -> str: return counts def effective_max_chroma(self) -> float: - if self._largest_gamut in (ColorSpace.Srgb, ColorSpace.DisplayP3): + if self._with_spectrum: + return 0.6 + elif self._largest_gamut in (ColorSpace.Srgb, ColorSpace.DisplayP3): return 0.4 elif self._largest_gamut is ColorSpace.Rec2020: return 0.5 @@ -239,7 +245,7 @@ def to_point_and_color(self, color: Color) -> tuple[float, float, str]: def generate_boundary_points( self, space: ColorSpace, template: list[int], index: int, sign: Literal[1, -1] - ) -> tuple[list[tuple[float, float]], list[str]]: + ) -> tuple[list[ChromaHue], list[str]]: """ Generate points on the boundary of the given RGB color space. @@ -372,12 +378,66 @@ def add_gamut_label( ), ) - def trace_spectrum_boundary(self) -> list[tuple[float, float]]: + def trace_spectrum_locus(self) -> tuple[list[ChromaHue], list[ChromaHue]]: points: list[tuple[float, float]] = [] - # FIXME + # Collect the points for the entire standard observer data. + for λ, (x, y, z) in STANDARD_OBSERVER_1931: + _, c, h = Color(ColorSpace.Xyz, [x, y, z]).to(ColorSpace.Oklch) + radian = h * math.pi / 180 + points.append((c, radian)) + + self.detail(f"spectrum locus λ={λ}: {c:.5f}, {h:5.1f}º") + + # Find local chroma maximum from start. + start_index = None + max_chroma = None + for index, (c, h) in enumerate(points): + if max_chroma is not None and max_chroma > c: + break + + start_index = index + max_chroma = c + + # Find local chroma maximum from stop. + stop_index = None + max_chroma = None + for index, (c, h) in enumerate(reversed(points)): + if max_chroma is not None and max_chroma > c: + break + + stop_index = index + max_chroma = c - return points + assert start_index is not None and stop_index is not None + return points, [points[start_index - 1], points[-stop_index]] + + def add_spectrum_locus(self, axes: Any) -> None: + self._with_spectrum = True + + points, more_points = self.trace_spectrum_locus() + + previous_chroma: None | float = None + previous_hue: None | float = None + for chroma, hue in points: + if previous_chroma is not None: + assert previous_hue is not None + axes.plot( # type: ignore + [previous_hue, hue], + [previous_chroma, chroma], + c = "#aa0000", + lw = 1.5, + ) + + previous_chroma = chroma + previous_hue = hue + + axes.plot( + [more_points[0][1], more_points[1][1]], + [more_points[0][0], more_points[1][0]], + c = "#aa0000", + lw = 1.5, + ) def create_figure( self, @@ -395,6 +455,9 @@ def create_figure( for space in gamuts: self.add_gamut(axes, space) + if spectrum: + self.add_spectrum_locus(axes) + # Since markers are shared for all marks in a series, we use a new # series for every single color. for hue, chroma, color, marker in zip(