赞 | 15 |
VIP | 0 |
好人卡 | 0 |
积分 | 19 |
经验 | 16801 |
最后登录 | 2024-7-10 |
在线时间 | 403 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 1939
- 在线时间
- 403 小时
- 注册时间
- 2015-8-30
- 帖子
- 395
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 有丘直方 于 2018-9-9 20:40 编辑
这个东西貌似已经有人搞过了??# Color class Color # 根据HSL数据来生成颜色对象,第四个参数是不透明度 def self.hsl(hue, saturation, lightness, alpha = 1.0) saturation = saturation.clamp(0.0, 1.0) lightness = lightness.clamp(0.0, 1.0) alpha = alpha.clamp(0.0, 1.0) times = (hue * 3 / Math::PI).modulo(6) amount1 = (1 - (2 * lightness - 1).abs) * saturation amount2 = amount1 * (1 - (times % 2 - 1).abs) correction = lightness - amount1 / 2 translation = (times.to_i + 1) % 6 args = [0, 0, 0] args[translation / 2] = amount1 args[2 - translation % 3] = amount2 new(*args.map {|origin| (origin + correction) * 255 }, alpha * 255) end # 在此颜色之上按正常方式叠加另一个颜色时呈现的颜色 def blend(other) alpha1 = alpha / 255.0 alpha2 = other.alpha / 255.0 calc_blend = proc do |c1, c2| c1 /= 255.0 c2 /= 255.0 blend = c1 * alpha1 * (1 - alpha2) + c2 * alpha2 blend /= alpha1 + alpha2 - alpha1 * alpha2 blend *= 255 end result = Color.new result.alpha = (alpha1 + alpha2 - alpha1 * alpha2) * 255 result.red = calc_blend.call(red, other.red) result.green = calc_blend.call(green, other.green) result.blue = calc_blend.call(blue, other.blue) result end # blend的破坏型方法 def blend!(other) set(blend(other)) self end end # Comparable module Comparable # 返回在min和max的范围内最接近self的对象 def clamp(min, max) return min if self <=> min < 0 return max if self <=> max > 0 self end end # 关于x的以mean为期望,variance为方差的正态分布函数 # 不给出mean和variance参数时是标准正态分布函数 def Math.normal_distribution(x, mean = 0.0, variance = 1.0) exp(-(x - mean) ** 2 / (2 * variance)) / sqrt(2 * self::PI * variance) end # Complex class Complex # 获取此复数对应的定义域着色 # lightness_base: 用于计算亮度的函数中的底数,越小越亮,必须在0和1之间 # saturation: 饱和度 def to_color(lightness_base = 0.5, saturation = 1.0) raise unless lightness_base.between?(0, 1) exponent = abs hue = exponent == 0 ? 0.0 : arg lightness = 1 - lightness_base ** exponent Color.hsl(hue, saturation, lightness) end # 获取此复数对应的结构化的定义域着色 # 这种着色方案有特殊效果,具体看参数说明 # discontinuity_base: 当此复数的模是达到参数的整数次幂时,亮度骤然变为最低 # saturation: 饱和度 # min_lightness: 不考虑网格和射线时能达到的最低亮度 # lightness_range: 不考虑网格和射线时能达到的最高和最低亮度之差 # grid_hue: 网格的色相 # rays_hue: 射线的色相 # grid_lightness: 网格的亮度 # rays_lightness: 射线的亮度 # grid_density: 网格线的密度,复数的实部或虚部是参数的倒数的整数倍时出现网格 # rays_density: 射线的密度,复数的俯角是参数的倒数的整数倍时出现射线 # grid_radius: 网格线的宽度的一半,不包括扩散出去的部分 # rays_radius: 射线的宽度的一半,不包括扩散出去的部分 # grid_restraint: 网格线的扩散度,越大越模糊 # rays_restraint: 射线的扩散度,越大越模糊 # grid_opacity: 网格的不透明度,如果不想显示网格请设为0.0 # rays_opacity: 射线的不透明度,如果不想显示射线请设为0.0 def to_color_structured(discontinuity_base = 2.0, saturation = 1.0, min_lightness = 0.3, lightness_range = 0.4, grid_hue = 0.0, rays_hue = 0.0, grid_lightness = 0.0, rays_lightness = 1.0, grid_density = 1.0, rays_density = 6.0, grid_radius = 0.005, rays_radius = 0.01, grid_restraint = 60.0, rays_restraint = 50.0, grid_opacity = 0.2, rays_opacity = 0.8) antilog = abs hue = antilog == 0 ? 0.0 : arg lightness_phase = Math.log(antilog, discontinuity_base).modulo(1) lightness_phase = 0.0 if lightness_phase.nan? lightness = lightness_phase * lightness_range + min_lightness color = Color.hsl(hue, saturation, lightness) f = Math.sqrt(2 * Math::PI) dense_real = real * grid_density real_distance = (dense_real - dense_real.round).abs dense_imaginary = imaginary * grid_density imaginary_distance = (dense_imaginary - dense_imaginary.round).abs grid_distance = [[real_distance, imaginary_distance].min, grid_radius].max grid_excursion = (grid_distance - grid_radius) * grid_restraint grid_alpha = Math.normal_distribution(grid_excursion) * f * grid_opacity grid_color = Color.hsl(grid_hue, saturation, grid_lightness, grid_alpha) color.blend!(grid_color) rays_distances = Array.new(rays_density) do |i| slope = Math.tan(i / rays_density * Math::PI) (slope * real - imaginary).abs / Math.hypot(slope, -1) end rays_distance = [rays_distances.min, rays_radius].max rays_excursion = (rays_distance - rays_radius) * rays_restraint rays_alpha = Math.normal_distribution(rays_excursion) * f * rays_opacity rays_color = Color.hsl(rays_hue, saturation, rays_lightness, rays_alpha) color.blend!(rays_color) end end # Bitmap class Bitmap # 绘制复变函数的函数图像 # function: 需要绘制的函数,提供接受一个复数参数并返回复数的call方法 # delta_x: 图中1像素的距离代表的大小 # structured: 是否采用结构化的图像,见Complex#to_color_structured # ox: 自变量取0+0i时所在的位置的相对于位图的x坐标 # oy: 自变量取0+0i时所在的位置的相对于位图的y坐标 def draw_function(function, delta_x, structured = false, ox = Graphics.width / 2, oy = Graphics.height / 2) width.times do |x| height.times do |y| real = (x - ox) * delta_x imaginary = (oy - y) * delta_x complex = function.call(Complex(real, imaginary)) color = structured ? complex.to_color_structured : complex.to_color set_pixel(x, y, color) end end end end
# Color
class Color
# 根据HSL数据来生成颜色对象,第四个参数是不透明度
def self.hsl(hue, saturation, lightness, alpha = 1.0)
saturation = saturation.clamp(0.0, 1.0)
lightness = lightness.clamp(0.0, 1.0)
alpha = alpha.clamp(0.0, 1.0)
times = (hue * 3 / Math::PI).modulo(6)
amount1 = (1 - (2 * lightness - 1).abs) * saturation
amount2 = amount1 * (1 - (times % 2 - 1).abs)
correction = lightness - amount1 / 2
translation = (times.to_i + 1) % 6
args = [0, 0, 0]
args[translation / 2] = amount1
args[2 - translation % 3] = amount2
new(*args.map {|origin| (origin + correction) * 255 }, alpha * 255)
end
# 在此颜色之上按正常方式叠加另一个颜色时呈现的颜色
def blend(other)
alpha1 = alpha / 255.0
alpha2 = other.alpha / 255.0
calc_blend = proc do |c1, c2|
c1 /= 255.0
c2 /= 255.0
blend = c1 * alpha1 * (1 - alpha2) + c2 * alpha2
blend /= alpha1 + alpha2 - alpha1 * alpha2
blend *= 255
end
result = Color.new
result.alpha = (alpha1 + alpha2 - alpha1 * alpha2) * 255
result.red = calc_blend.call(red, other.red)
result.green = calc_blend.call(green, other.green)
result.blue = calc_blend.call(blue, other.blue)
result
end
# blend的破坏型方法
def blend!(other)
set(blend(other))
self
end
end
# Comparable
module Comparable
# 返回在min和max的范围内最接近self的对象
def clamp(min, max)
return min if self <=> min < 0
return max if self <=> max > 0
self
end
end
# 关于x的以mean为期望,variance为方差的正态分布函数
# 不给出mean和variance参数时是标准正态分布函数
def Math.normal_distribution(x, mean = 0.0, variance = 1.0)
exp(-(x - mean) ** 2 / (2 * variance)) / sqrt(2 * self::PI * variance)
end
# Complex
class Complex
# 获取此复数对应的定义域着色
# lightness_base: 用于计算亮度的函数中的底数,越小越亮,必须在0和1之间
# saturation: 饱和度
def to_color(lightness_base = 0.5, saturation = 1.0)
raise unless lightness_base.between?(0, 1)
exponent = abs
hue = exponent == 0 ? 0.0 : arg
lightness = 1 - lightness_base ** exponent
Color.hsl(hue, saturation, lightness)
end
# 获取此复数对应的结构化的定义域着色
# 这种着色方案有特殊效果,具体看参数说明
# discontinuity_base: 当此复数的模是达到参数的整数次幂时,亮度骤然变为最低
# saturation: 饱和度
# min_lightness: 不考虑网格和射线时能达到的最低亮度
# lightness_range: 不考虑网格和射线时能达到的最高和最低亮度之差
# grid_hue: 网格的色相
# rays_hue: 射线的色相
# grid_lightness: 网格的亮度
# rays_lightness: 射线的亮度
# grid_density: 网格线的密度,复数的实部或虚部是参数的倒数的整数倍时出现网格
# rays_density: 射线的密度,复数的俯角是参数的倒数的整数倍时出现射线
# grid_radius: 网格线的宽度的一半,不包括扩散出去的部分
# rays_radius: 射线的宽度的一半,不包括扩散出去的部分
# grid_restraint: 网格线的扩散度,越大越模糊
# rays_restraint: 射线的扩散度,越大越模糊
# grid_opacity: 网格的不透明度,如果不想显示网格请设为0.0
# rays_opacity: 射线的不透明度,如果不想显示射线请设为0.0
def to_color_structured(discontinuity_base = 2.0, saturation = 1.0,
min_lightness = 0.3, lightness_range = 0.4, grid_hue = 0.0,
rays_hue = 0.0, grid_lightness = 0.0, rays_lightness = 1.0,
grid_density = 1.0, rays_density = 6.0, grid_radius = 0.005,
rays_radius = 0.01, grid_restraint = 60.0, rays_restraint = 50.0,
grid_opacity = 0.2, rays_opacity = 0.8)
antilog = abs
hue = antilog == 0 ? 0.0 : arg
lightness_phase = Math.log(antilog, discontinuity_base).modulo(1)
lightness_phase = 0.0 if lightness_phase.nan?
lightness = lightness_phase * lightness_range + min_lightness
color = Color.hsl(hue, saturation, lightness)
f = Math.sqrt(2 * Math::PI)
dense_real = real * grid_density
real_distance = (dense_real - dense_real.round).abs
dense_imaginary = imaginary * grid_density
imaginary_distance = (dense_imaginary - dense_imaginary.round).abs
grid_distance = [[real_distance, imaginary_distance].min, grid_radius].max
grid_excursion = (grid_distance - grid_radius) * grid_restraint
grid_alpha = Math.normal_distribution(grid_excursion) * f * grid_opacity
grid_color = Color.hsl(grid_hue, saturation, grid_lightness, grid_alpha)
color.blend!(grid_color)
rays_distances = Array.new(rays_density) do |i|
slope = Math.tan(i / rays_density * Math::PI)
(slope * real - imaginary).abs / Math.hypot(slope, -1)
end
rays_distance = [rays_distances.min, rays_radius].max
rays_excursion = (rays_distance - rays_radius) * rays_restraint
rays_alpha = Math.normal_distribution(rays_excursion) * f * rays_opacity
rays_color = Color.hsl(rays_hue, saturation, rays_lightness, rays_alpha)
color.blend!(rays_color)
end
end
# Bitmap
class Bitmap
# 绘制复变函数的函数图像
# function: 需要绘制的函数,提供接受一个复数参数并返回复数的call方法
# delta_x: 图中1像素的距离代表的大小
# structured: 是否采用结构化的图像,见Complex#to_color_structured
# ox: 自变量取0+0i时所在的位置的相对于位图的x坐标
# oy: 自变量取0+0i时所在的位置的相对于位图的y坐标
def draw_function(function, delta_x, structured = false,
ox = Graphics.width / 2, oy = Graphics.height / 2)
width.times do |x|
height.times do |y|
real = (x - ox) * delta_x
imaginary = (oy - y) * delta_x
complex = function.call(Complex(real, imaginary))
color = structured ? complex.to_color_structured : complex.to_color
set_pixel(x, y, color)
end
end
end
end
一个简单的用于玩耍的代码(依赖这玩意)(由于我用了RGD所以无视分辨率限制了)(虽然不用多线程能画得更快,但是那样就看不到图像慢慢绘制出来的过程了):# 玩耍方法:在控制台输入你想要画的函数,然后等待即可 Graphics.resize_screen(1024, 768) sprite = Sprite.new sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height) Thread.start do loop do print("f(z) = ") string = $stdin.gets function = eval("->(z) { #{string} }") puts("Please wait...") time = Time.now sprite.bitmap.draw_function(function, 0.008, true) rescue puts($!.message) printf("Completed after %d seconds.\n", Time.now - time) end end rgss_stop
# 玩耍方法:在控制台输入你想要画的函数,然后等待即可
Graphics.resize_screen(1024, 768)
sprite = Sprite.new
sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
Thread.start do
loop do
print("f(z) = ")
string = $stdin.gets
function = eval("->(z) { #{string} }")
puts("Please wait...")
time = Time.now
sprite.bitmap.draw_function(function, 0.008, true) rescue puts($!.message)
printf("Completed after %d seconds.\n", Time.now - time)
end
end
rgss_stop
配上CMath后玩耍体验更佳:#============================================================================== # * CMath #------------------------------------------------------------------------------ # Trigonometric and transcendental functions for complex numbers. # CMath is a library that provides trigonometric and transcendental functions # for complex numbers. The functions in this module accept integers, floating- # point numbers or complex numbers as arguments. # Note that the selection of functions is similar, but not identical, to that # in module math. The reason for having two modules is that some users aren't # interested in complex numbers, and perhaps don't even know what they are. They # would rather have Math.sqrt(-1) raise an exception than return a complex # number. # For more information you can see Complex class. #============================================================================== module CMath include Math alias exp! exp alias log! log alias log2! log2 alias log10! log10 alias sqrt! sqrt alias cbrt! cbrt alias sin! sin alias cos! cos alias tan! tan alias sinh! sinh alias cosh! cosh alias tanh! tanh alias asin! asin alias acos! acos alias atan! atan alias atan2! atan2 alias asinh! asinh alias acosh! acosh alias atanh! atanh #-------------------------------------------------------------------------- # * exp(z) #-------------------------------------------------------------------------- # Math::E raised to the z power #-------------------------------------------------------------------------- def exp(z) if z.real? exp!(z) else ere = exp!(z.real) Complex(ere * cos!(z.imag), ere * sin!(z.imag)) end end #-------------------------------------------------------------------------- # * log(z, b=::Math::E) #-------------------------------------------------------------------------- # Returns the natural logarithm of Complex. If a second argument is given, # it will be the base of logarithm. #-------------------------------------------------------------------------- def log(*args) z, b = args if z.real? and z >= 0 and (b.nil? or b >= 0) log!(*args) else a = Complex(log!(z.abs), z.arg) if b a /= log(b) end a end end #-------------------------------------------------------------------------- # * log2(z) #-------------------------------------------------------------------------- # Returns the base 2 logarithm of z #-------------------------------------------------------------------------- def log2(z) if z.real? and z >= 0 log2!(z) else log(z) / log!(2) end end #-------------------------------------------------------------------------- # * log10(z) #-------------------------------------------------------------------------- # Returns the base 10 logarithm of z #-------------------------------------------------------------------------- def log10(z) if z.real? and z >= 0 log10!(z) else log(z) / log!(10) end end #-------------------------------------------------------------------------- # * sqrt(z) #-------------------------------------------------------------------------- # Returns the non-negative square root of Complex. #-------------------------------------------------------------------------- def sqrt(z) if z.real? if z < 0 Complex(0, sqrt!(-z)) else sqrt!(z) end else if z.imag < 0 || (z.imag == 0 && z.imag.to_s[0] == '-') sqrt(z.conjugate).conjugate else r = z.abs x = z.real Complex(sqrt!((r + x) / 2), sqrt!((r - x) / 2)) end end end #-------------------------------------------------------------------------- # * cbrt(z) #-------------------------------------------------------------------------- # Returns the principal value of the cube root of z #-------------------------------------------------------------------------- def cbrt(z) if z.real? cbrt!(z) else Complex(z) ** (1.0/3) end end #-------------------------------------------------------------------------- # * sin(z) #-------------------------------------------------------------------------- # Returns the sine of z, where z is given in radians #-------------------------------------------------------------------------- def sin(z) if z.real? sin!(z) else Complex(sin!(z.real) * cosh!(z.imag), cos!(z.real) * sinh!(z.imag)) end end #-------------------------------------------------------------------------- # * cos(z) #-------------------------------------------------------------------------- # Returns the cosine of z, where z is given in radians #-------------------------------------------------------------------------- def cos(z) if z.real? cos!(z) else Complex(cos!(z.real) * cosh!(z.imag), -sin!(z.real) * sinh!(z.imag)) end end #-------------------------------------------------------------------------- # * tan(z) #-------------------------------------------------------------------------- # Returns the tangent of z, where z is given in radians #-------------------------------------------------------------------------- def tan(z) if z.real? tan!(z) else sin(z) / cos(z) end end #-------------------------------------------------------------------------- # * sinh(z) #-------------------------------------------------------------------------- # Returns the hyperbolic sine of z, where z is given in radians #-------------------------------------------------------------------------- def sinh(z) if z.real? sinh!(z) else Complex(sinh!(z.real) * cos!(z.imag), cosh!(z.real) * sin!(z.imag)) end end #-------------------------------------------------------------------------- # * cos(z) #-------------------------------------------------------------------------- # Returns the hyperbolic cosine of z, where z is given in radians #-------------------------------------------------------------------------- def cosh(z) if z.real? cosh!(z) else Complex(cosh!(z.real) * cos!(z.imag), sinh!(z.real) * sin!(z.imag)) end end #-------------------------------------------------------------------------- # * tanh(z) #-------------------------------------------------------------------------- # Returns the hyperbolic tangent of z, where z is given in radians #-------------------------------------------------------------------------- def tanh(z) if z.real? tanh!(z) else sinh(z) / cosh(z) end end #-------------------------------------------------------------------------- # * asin(z) #-------------------------------------------------------------------------- # Returns the arc sine of z #-------------------------------------------------------------------------- def asin(z) if z.real? and z >= -1 and z <= 1 asin!(z) else (-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z)) end end #-------------------------------------------------------------------------- # * acos(z) #-------------------------------------------------------------------------- # Returns the arc cosine of z #-------------------------------------------------------------------------- def acos(z) if z.real? and z >= -1 and z <= 1 acos!(z) else (-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z)) end end #-------------------------------------------------------------------------- # * atan(z) #-------------------------------------------------------------------------- # Returns the arc tangent of z #-------------------------------------------------------------------------- def atan(z) if z.real? atan!(z) else 1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0 end end #-------------------------------------------------------------------------- # * atan2(z) #-------------------------------------------------------------------------- # returns the arc tangent of y divided by x using the signs of y and x to # determine the quadrant #-------------------------------------------------------------------------- def atan2(y,x) if y.real? and x.real? atan2!(y,x) else (-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y)) end end #-------------------------------------------------------------------------- # * asinh(z) #-------------------------------------------------------------------------- # returns the inverse hyperbolic sine of z #-------------------------------------------------------------------------- def asinh(z) if z.real? asinh!(z) else log(z + sqrt(1.0 + z * z)) end end #-------------------------------------------------------------------------- # * acosh(z) #-------------------------------------------------------------------------- # returns the inverse hyperbolic cosine of z #-------------------------------------------------------------------------- def acosh(z) if z.real? and z >= 1 acosh!(z) else log(z + sqrt(z * z - 1.0)) end end #-------------------------------------------------------------------------- # * atanh(z) #-------------------------------------------------------------------------- # returns the inverse hyperbolic tangent of z #-------------------------------------------------------------------------- def atanh(z) if z.real? and z >= -1 and z <= 1 atanh!(z) else log((1.0 + z) / (1.0 - z)) / 2.0 end end module_function :exp! module_function :exp module_function :log! module_function :log module_function :log2! module_function :log2 module_function :log10! module_function :log10 module_function :sqrt! module_function :sqrt module_function :cbrt! module_function :cbrt module_function :sin! module_function :sin module_function :cos! module_function :cos module_function :tan! module_function :tan module_function :sinh! module_function :sinh module_function :cosh! module_function :cosh module_function :tanh! module_function :tanh module_function :asin! module_function :asin module_function :acos! module_function :acos module_function :atan! module_function :atan module_function :atan2! module_function :atan2 module_function :asinh! module_function :asinh module_function :acosh! module_function :acosh module_function :atanh! module_function :atanh module_function :frexp module_function :ldexp module_function :hypot module_function :erf module_function :erfc module_function :gamma module_function :lgamma end
#==============================================================================
# * CMath
#------------------------------------------------------------------------------
# Trigonometric and transcendental functions for complex numbers.
# CMath is a library that provides trigonometric and transcendental functions
# for complex numbers. The functions in this module accept integers, floating-
# point numbers or complex numbers as arguments.
# Note that the selection of functions is similar, but not identical, to that
# in module math. The reason for having two modules is that some users aren't
# interested in complex numbers, and perhaps don't even know what they are. They
# would rather have Math.sqrt(-1) raise an exception than return a complex
# number.
# For more information you can see Complex class.
#==============================================================================
module CMath
include Math
alias exp! exp
alias log! log
alias log2! log2
alias log10! log10
alias sqrt! sqrt
alias cbrt! cbrt
alias sin! sin
alias cos! cos
alias tan! tan
alias sinh! sinh
alias cosh! cosh
alias tanh! tanh
alias asin! asin
alias acos! acos
alias atan! atan
alias atan2! atan2
alias asinh! asinh
alias acosh! acosh
alias atanh! atanh
#--------------------------------------------------------------------------
# * exp(z)
#--------------------------------------------------------------------------
# Math::E raised to the z power
#--------------------------------------------------------------------------
def exp(z)
if z.real?
exp!(z)
else
ere = exp!(z.real)
Complex(ere * cos!(z.imag),
ere * sin!(z.imag))
end
end
#--------------------------------------------------------------------------
# * log(z, b=::Math::E)
#--------------------------------------------------------------------------
# Returns the natural logarithm of Complex. If a second argument is given,
# it will be the base of logarithm.
#--------------------------------------------------------------------------
def log(*args)
z, b = args
if z.real? and z >= 0 and (b.nil? or b >= 0)
log!(*args)
else
a = Complex(log!(z.abs), z.arg)
if b
a /= log(b)
end
a
end
end
#--------------------------------------------------------------------------
# * log2(z)
#--------------------------------------------------------------------------
# Returns the base 2 logarithm of z
#--------------------------------------------------------------------------
def log2(z)
if z.real? and z >= 0
log2!(z)
else
log(z) / log!(2)
end
end
#--------------------------------------------------------------------------
# * log10(z)
#--------------------------------------------------------------------------
# Returns the base 10 logarithm of z
#--------------------------------------------------------------------------
def log10(z)
if z.real? and z >= 0
log10!(z)
else
log(z) / log!(10)
end
end
#--------------------------------------------------------------------------
# * sqrt(z)
#--------------------------------------------------------------------------
# Returns the non-negative square root of Complex.
#--------------------------------------------------------------------------
def sqrt(z)
if z.real?
if z < 0
Complex(0, sqrt!(-z))
else
sqrt!(z)
end
else
if z.imag < 0 ||
(z.imag == 0 && z.imag.to_s[0] == '-')
sqrt(z.conjugate).conjugate
else
r = z.abs
x = z.real
Complex(sqrt!((r + x) / 2), sqrt!((r - x) / 2))
end
end
end
#--------------------------------------------------------------------------
# * cbrt(z)
#--------------------------------------------------------------------------
# Returns the principal value of the cube root of z
#--------------------------------------------------------------------------
def cbrt(z)
if z.real?
cbrt!(z)
else
Complex(z) ** (1.0/3)
end
end
#--------------------------------------------------------------------------
# * sin(z)
#--------------------------------------------------------------------------
# Returns the sine of z, where z is given in radians
#--------------------------------------------------------------------------
def sin(z)
if z.real?
sin!(z)
else
Complex(sin!(z.real) * cosh!(z.imag),
cos!(z.real) * sinh!(z.imag))
end
end
#--------------------------------------------------------------------------
# * cos(z)
#--------------------------------------------------------------------------
# Returns the cosine of z, where z is given in radians
#--------------------------------------------------------------------------
def cos(z)
if z.real?
cos!(z)
else
Complex(cos!(z.real) * cosh!(z.imag),
-sin!(z.real) * sinh!(z.imag))
end
end
#--------------------------------------------------------------------------
# * tan(z)
#--------------------------------------------------------------------------
# Returns the tangent of z, where z is given in radians
#--------------------------------------------------------------------------
def tan(z)
if z.real?
tan!(z)
else
sin(z) / cos(z)
end
end
#--------------------------------------------------------------------------
# * sinh(z)
#--------------------------------------------------------------------------
# Returns the hyperbolic sine of z, where z is given in radians
#--------------------------------------------------------------------------
def sinh(z)
if z.real?
sinh!(z)
else
Complex(sinh!(z.real) * cos!(z.imag),
cosh!(z.real) * sin!(z.imag))
end
end
#--------------------------------------------------------------------------
# * cos(z)
#--------------------------------------------------------------------------
# Returns the hyperbolic cosine of z, where z is given in radians
#--------------------------------------------------------------------------
def cosh(z)
if z.real?
cosh!(z)
else
Complex(cosh!(z.real) * cos!(z.imag),
sinh!(z.real) * sin!(z.imag))
end
end
#--------------------------------------------------------------------------
# * tanh(z)
#--------------------------------------------------------------------------
# Returns the hyperbolic tangent of z, where z is given in radians
#--------------------------------------------------------------------------
def tanh(z)
if z.real?
tanh!(z)
else
sinh(z) / cosh(z)
end
end
#--------------------------------------------------------------------------
# * asin(z)
#--------------------------------------------------------------------------
# Returns the arc sine of z
#--------------------------------------------------------------------------
def asin(z)
if z.real? and z >= -1 and z <= 1
asin!(z)
else
(-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
end
end
#--------------------------------------------------------------------------
# * acos(z)
#--------------------------------------------------------------------------
# Returns the arc cosine of z
#--------------------------------------------------------------------------
def acos(z)
if z.real? and z >= -1 and z <= 1
acos!(z)
else
(-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
end
end
#--------------------------------------------------------------------------
# * atan(z)
#--------------------------------------------------------------------------
# Returns the arc tangent of z
#--------------------------------------------------------------------------
def atan(z)
if z.real?
atan!(z)
else
1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
end
end
#--------------------------------------------------------------------------
# * atan2(z)
#--------------------------------------------------------------------------
# returns the arc tangent of y divided by x using the signs of y and x to
# determine the quadrant
#--------------------------------------------------------------------------
def atan2(y,x)
if y.real? and x.real?
atan2!(y,x)
else
(-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
end
end
#--------------------------------------------------------------------------
# * asinh(z)
#--------------------------------------------------------------------------
# returns the inverse hyperbolic sine of z
#--------------------------------------------------------------------------
def asinh(z)
if z.real?
asinh!(z)
else
log(z + sqrt(1.0 + z * z))
end
end
#--------------------------------------------------------------------------
# * acosh(z)
#--------------------------------------------------------------------------
# returns the inverse hyperbolic cosine of z
#--------------------------------------------------------------------------
def acosh(z)
if z.real? and z >= 1
acosh!(z)
else
log(z + sqrt(z * z - 1.0))
end
end
#--------------------------------------------------------------------------
# * atanh(z)
#--------------------------------------------------------------------------
# returns the inverse hyperbolic tangent of z
#--------------------------------------------------------------------------
def atanh(z)
if z.real? and z >= -1 and z <= 1
atanh!(z)
else
log((1.0 + z) / (1.0 - z)) / 2.0
end
end
module_function :exp!
module_function :exp
module_function :log!
module_function :log
module_function :log2!
module_function :log2
module_function :log10!
module_function :log10
module_function :sqrt!
module_function :sqrt
module_function :cbrt!
module_function :cbrt
module_function :sin!
module_function :sin
module_function :cos!
module_function :cos
module_function :tan!
module_function :tan
module_function :sinh!
module_function :sinh
module_function :cosh!
module_function :cosh
module_function :tanh!
module_function :tanh
module_function :asin!
module_function :asin
module_function :acos!
module_function :acos
module_function :atan!
module_function :atan
module_function :atan2!
module_function :atan2
module_function :asinh!
module_function :asinh
module_function :acosh!
module_function :acosh
module_function :atanh!
module_function :atanh
module_function :frexp
module_function :ldexp
module_function :hypot
module_function :erf
module_function :erfc
module_function :gamma
module_function :lgamma
end
顺便一提,虽然绘制速度慢到让人吐血,但是由于不支持后台运行,请将焦点保持在窗口上,慢慢看着它画完;我也不是很清楚为什么RGD不支持这个
再顺便一提,要是RGD有更高的Ruby版本就好了,我就不用写Complex(1, 2),直接写1+2i了 |
评分
-
查看全部评分
|