angle and eyefish render

This commit is contained in:
Technoduck 2024-11-10 18:39:34 -05:00
parent 7c7f109a69
commit bb618cff88
2 changed files with 38 additions and 12 deletions

33
app.py
View file

@ -2,6 +2,7 @@ import tkinter
import tkintermapview import tkintermapview
import requests import requests
import skydome import skydome
import math
from PIL import Image, ImageTk from PIL import Image, ImageTk
@ -128,9 +129,18 @@ class renderedImageZoom:
p_frame.grid(column=0,row=8,columnspan=2,padx=20) p_frame.grid(column=0,row=8,columnspan=2,padx=20)
s_frame = tkinter.Frame(self.aerosol_window)
text_s = tkinter.Text(s_frame,height=1,width=10)
submit_s_button = tkinter.Button(s_frame,text="set direction of the sun",command=lambda: self.set_sun(text_s.get("1.0","end-1c")))
text_s.pack(side=tkinter.LEFT)
submit_s_button.pack(side=tkinter.RIGHT)
s_frame.grid(column=0,row=9,columnspan=2,padx=20)
testing_info_text = tkinter.Label(self.aerosol_window, text="Change y heights between which average redness and blueness will be calculated") testing_info_text = tkinter.Label(self.aerosol_window, text="Change y heights between which average redness and blueness will be calculated")
testing_info_text.grid(column=0,row=9,columnspan=2,pady=20,padx=10) testing_info_text.grid(column=0,row=10,columnspan=2,pady=20,padx=10)
r_frame = tkinter.Frame(self.aerosol_window) r_frame = tkinter.Frame(self.aerosol_window)
text_r_l = tkinter.Text(r_frame,height=1,width=10) text_r_l = tkinter.Text(r_frame,height=1,width=10)
@ -142,7 +152,7 @@ class renderedImageZoom:
text_r_u.pack(side=tkinter.LEFT) text_r_u.pack(side=tkinter.LEFT)
average_r_label.pack(side=tkinter.RIGHT) average_r_label.pack(side=tkinter.RIGHT)
submit_r_button.pack(side=tkinter.RIGHT) submit_r_button.pack(side=tkinter.RIGHT)
r_frame.grid(column=0,row=10,columnspan=2,padx=20) r_frame.grid(column=0,row=11,columnspan=2,padx=20)
b_frame = tkinter.Frame(self.aerosol_window) b_frame = tkinter.Frame(self.aerosol_window)
@ -155,7 +165,7 @@ class renderedImageZoom:
text_b_u.pack(side=tkinter.LEFT) text_b_u.pack(side=tkinter.LEFT)
average_b_label.pack(side=tkinter.RIGHT) average_b_label.pack(side=tkinter.RIGHT)
submit_b_button.pack(side=tkinter.RIGHT) submit_b_button.pack(side=tkinter.RIGHT)
b_frame.grid(column=0,row=11,columnspan=2,padx=20) b_frame.grid(column=0,row=12,columnspan=2,padx=20)
#self.img = Image.fromarray(image,mode="RGB") #self.img = Image.fromarray(image,mode="RGB")
#self.tk_image = ImageTk.PhotoImage(width=256,height=256,image=self.img) #self.tk_image = ImageTk.PhotoImage(width=256,height=256,image=self.img)
@ -181,6 +191,20 @@ class renderedImageZoom:
else: else:
self.temperature = int(temp) self.temperature = int(temp)
def set_sun(self,angle):
if angle is None:
angle_degrees:cython.int = 90 # Sun direction in degrees (0 to 90, noon to sunset)
elif int(angle) > 90 or int(angle) < 0:
angle_degrees:cython.int = 90 # Sun direction in degrees (0 to 90, noon to sunset)
else:
angle_degrees:cython.int = int(angle) # Sun direction in degrees (0 to 90, noon to sunset)
angle_radians:cython.double = math.radians(angle_degrees) # Convert to radians
sunDir:skydome.Vec3 = skydome.Vec3(0, math.cos(angle_radians), -math.sin(angle_radians))
self.sunDir = sunDir
def set_press(self,press): def set_press(self,press):
if press is None: if press is None:
self.pressure = 720 self.pressure = 720
@ -206,7 +230,8 @@ class renderedImageZoom:
self.g = g self.g = g
def render(self): def render(self):
self.image = skydome.renderFromCamera(self.coords,self.betaM,self.g,self.altitude,self.temperature,self.pressure) #self.image = skydome.renderFromCamera(self.coords,self.betaM,self.g,self.altitude,self.temperature,self.pressure,self.sunDir)
self.image = skydome.renderSkydome(self.coords,self.betaM,self.g,self.altitude,self.temperature,self.pressure,self.sunDir)
self.img = Image.fromarray(self.image,mode="RGB") self.img = Image.fromarray(self.image,mode="RGB")
self.tk_image = ImageTk.PhotoImage(width=256,height=256,image=self.img) self.tk_image = ImageTk.PhotoImage(width=256,height=256,image=self.img)
#img = ImageTk.PhotoImage(Image.open("highpress_camera.png")) #img = ImageTk.PhotoImage(Image.open("highpress_camera.png"))

View file

@ -127,9 +127,9 @@ beta_values = beta(n_values)
# We will have a scattering enhancement factor for our scattering values # We will have a scattering enhancement factor for our scattering values
kInfinity = float('inf') kInfinity = float('inf')
angle_degrees:cython.int = 90 # Sun direction in degrees (0 to 90, noon to sunset) angle_degrees:cython.int = 0 # Sun direction in degrees (0 to 90, noon to sunset)
angle_radians:cython.double = math.radians(angle_degrees) # Convert to radians angle_radians:cython.double = math.radians(angle_degrees) # Convert to radians
sunDir:Vec3 = Vec3(0, math.cos(angle_radians), -math.sin(angle_radians)) #sunDir:Vec3 = Vec3(0, math.cos(angle_radians), -math.sin(angle_radians))
""" """
The values for betaR depend on many things The values for betaR depend on many things
@ -180,7 +180,7 @@ Hm:cython.int = 1200
# The direction will change for each pixel # The direction will change for each pixel
@cython.cfunc @cython.cfunc
def computeIncidentLight(direction:Vec3,betaM,g,observerEarthRadius) -> tuple[float,float,float]: def computeIncidentLight(direction:Vec3,betaM,g,observerEarthRadius,sunDir) -> tuple[float,float,float]:
tmin:cython.float=0 tmin:cython.float=0
tmax:cython.float=kInfinity tmax:cython.float=kInfinity
@ -289,7 +289,7 @@ def solveQuadratic(a:cython.float, b:cython.float, c:cython.float) -> tuple[cyth
@cython.cfunc @cython.cfunc
def renderSkydome(filename,betaM,g,altitude): def renderSkydome(filename,betaM,g,altitude,T,P,sunDir):
width:cython.int width:cython.int
height:cython.int height:cython.int
width, height = 256,256 width, height = 256,256
@ -316,7 +316,7 @@ def renderSkydome(filename,betaM,g,altitude):
theta = math.acos(1 - z2) theta = math.acos(1 - z2)
# This changes for each pixel # This changes for each pixel
direction = Vec3(math.sin(theta) * math.cos(phi), math.cos(theta), math.sin(theta) * math.sin(phi)) direction = Vec3(math.sin(theta) * math.cos(phi), math.cos(theta), math.sin(theta) * math.sin(phi))
color = computeIncidentLight(direction,betaM,g,observerEarthRadius) color = computeIncidentLight(direction,betaM,g,observerEarthRadius,sunDir)
#color = computeIncidentLight(direction) #color = computeIncidentLight(direction)
@ -332,11 +332,12 @@ def renderSkydome(filename,betaM,g,altitude):
# Save result to a PNG image # Save result to a PNG image
image = np.clip(image, 0, 1) * 255 # change 255 image = np.clip(image, 0, 1) * 255 # change 255
imageio.imwrite(filename, image.astype(np.uint8)) return image.astype(np.uint8)
#imageio.imwrite(filename, image.astype(np.uint8))
def renderFromCamera(filename,betaM,g,altitude,T,P): def renderFromCamera(filename,betaM,g,altitude,T,P,sunDir):
print(wavelengths) print(wavelengths)
n_s_values, n_values = refraction_calculator(T, P) n_s_values, n_values = refraction_calculator(T, P)
@ -374,7 +375,7 @@ def renderFromCamera(filename,betaM,g,altitude,T,P):
#This changes for each pixel, it is the direction we are looking in #This changes for each pixel, it is the direction we are looking in
direction = Vec3(rayx, rayy, -1).normalize() direction = Vec3(rayx, rayy, -1).normalize()
color = computeIncidentLight(direction,betaM,g,observerEarthRadius) color = computeIncidentLight(direction,betaM,g,observerEarthRadius,sunDir)
#image[y, x] = np.array(color) #image[y, x] = np.array(color)
image[y][x] = np.clip(color, 0, 1) image[y][x] = np.clip(color, 0, 1)