不依赖SEP Core运行,所以独立发一下
但是……谢谢大家的测试我只能说[泪目]……看来这个功能做出来终究还是有它的可取之处的,那就后续再更新一下吧~
就是写着顺手就写出来了……
RUBY 代码
[code]#==============================================================================
# ■ [Bitmap Canvas] 位图画布处理核心 v1.0 by SailCat
#------------------------------------------------------------------------------
# 方法:本脚本插入Main之前使用
# 依赖:无
# 版本:v1.0 (Build 220228)
# 效果:
# 1. 可以用简单指令在位图对象上画图
# 配置:画笔线形的配置
# 冲突:无
# 说明:
# 1. 绘制直线:
# draw_line(起始x, 起始y, 结束x, 结束y, 颜色, 线形)
# 2. 绘制渐变色直线:
# gradient_draw_line(起始x, 起始y, 结束x, 结束y, 颜色1, 颜色2)
# 3. 绘制路径(连续直线):
# draw_path(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 颜色)
# 4. 绘制多边形(连续封闭直线):
# draw_polygon(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 颜色)
# 5. 绘制正多边形:
# draw_isogon(外接圆心x, 外接圆心y, 半径, 边数, 旋转角, 颜色)
# 6. 绘制椭圆:
# draw_ellipse(圆心x, 圆心y, 半横径,半纵径, 颜色)
# 7. 绘制圆:
# draw_circle(圆心x, 圆心y, 半径,颜色)
# 8. 填涂多边形:
# fill_polygon(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 边框颜色[,
# 填充颜色1[, 填充颜色2]])
# 9. 填涂正多边形:
# fill_isogon(外接圆心x, 外接圆心y, 半径, 边数, 旋转角, 边框颜色[,
# 填充颜色1[, 填充颜色2]])
# 10.填涂椭圆:
# fill_ellipse(圆心x, 圆心y, 半横径,半纵径, 边框颜色[, 填充颜色1[,
# 填充颜色2]])
# 11.填涂圆:
# fill_circle(圆心x, 圆心y, 半径,边框颜色[, 填充颜色1[, 填充颜色2]])
# 12.传送多边形:
# blt_polygon(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 源位图,
# 参考点1, 参考点1y[, 不透明度])
# 13.传送正多边形:
# blt_isogon(外接圆心x, 外接圆心y, 半径, 边数, 旋转角, 源位图, 参考心x,
# 参考心y[, 不透明度])
# 14.传送椭圆:
# blt_ellipse(圆心x, 圆心y, 半横径,半纵径, 源位图, 参考心x, 参考心y[,
# 不透明度])
# 15.传送圆:
# blt_circle(圆心x, 圆心y, 半径,源位图, 参考心x, 参考心y[, 不透明度])
#==============================================================================
#==============================================================================
# ■ SailCat's 插件公用
#==============================================================================
module SailCat
#--------------------------------------------------------------------------
# ● 脚本配置区
#--------------------------------------------------------------------------
module Canvas_Config
CANVAS_LINE_DOTTED = [1, 0] # 点线画笔
CANVAS_LINE_DASHED = [1, 1, 0, 1] # 短虚线画笔
CANVAS_LINE_LONGDASH = [1, 1, 0, 0, 1, 1]# 长虚线画笔
CANVAS_LINE_DASHDOT = [1, 0, 1, 1, 1, 0] # 点划线画笔
CANVAS_LINE_BROKEN = [1, 0, 0] # 散点画笔
end
end
#==============================================================================
# ■ Bitmap
#==============================================================================
class Bitmap
includeSailCat::Canvas_Config
#--------------------------------------------------------------------------
# ● 常量
#--------------------------------------------------------------------------
CANVAS_LINE_SOLID = [1] # 实心画笔,该常量禁止修改配置
#--------------------------------------------------------------------------
# ● 绘制直线
# x1 : 起始的 X 坐标
# y1 : 起始的 Y 坐标
# x2 : 结束的 X 坐标
# y2 : 结束的 Y 坐标
# color : 直线的颜色 (Color)
# style : 直线的线型
#--------------------------------------------------------------------------
def draw_line(x1, y1, x2, y2, color, style = CANVAS_LINE_SOLID)
return set_pixel(x1, y1, color)if x1 == x2 and y1 == y2
dx = (x2 - x1).abs
dy = (y2 - y1).abs
x = x1
y = y1
rx = x2 - x1 0
ry = y2 - y1 0
b_index = 0
b_size = style.size
if dx == 0and style == CANVAS_LINE_SOLID
fill_rect(x1, [y1, y2].min, 1, dy + 1, color)
elsif dy == 0and style == CANVAS_LINE_SOLID
fill_rect([x1, x2].min, y1, dx + 1, 1, color)
elsif dx yk
yj += 1
xj += dx
end
edges[yj] ||= []
edges[yj].push([xj, dx, yi])
end
end
returnunless max_y - min_y > 1
aet = edges[min_y]
aet.each{|edge| edge[0] += edge[1]}
aet.sort!
if fill1 != fill2
dh = max_y - min_y - 1
dr = (fill2.red - fill1.red) / dh
dg = (fill2.green - fill1.green) / dh
db = (fill2.blue - fill1.blue) / dh
da = (fill2.alpha - fill1.alpha) / dh
gradient = true
end
f = fill1.clone
for y in min_y + 1..max_y - 1
if edges[y]
aet.concat(edges[y])
aet.sort!
end
0.step(aet.size - 1, 2)do |i|
xi = aet[0].round
xj = aet[i + 1][0].round
xi += 1until xi == width - 1or get_pixel(xi, y) != color
xj -= 1until xj == 0or get_pixel(xj, y) != color
if xj >= xi
fill_rect(xi, y, xj - xi + 1, 1, f)
end
aet.reject! {|edge| edge[2] == y}
aet.each{|edge| edge[0] += edge[1]}
aet.sort!
f.set(f.red + dr, f.green + dg, f.blue + db, f.alpha + da)if gradient
end
end
end
#--------------------------------------------------------------------------
# ● 传送位图多边形
# x1 : 第一点的 X 坐标
# y1 : 第一点的 Y 坐标
# x2 : 第二点的 X 坐标
# y2 : 第二点的 Y 坐标
# x3 : 第三点的 X 坐标
# y3 : 第三点的 Y 坐标
# args : 后续的参数(加多个点,最后是位图, 偏移x,偏移y,(可选)不透明度)
# 偏移x和偏移y的位置参考第一个点
#--------------------------------------------------------------------------
def blt_polygon(x1, y1, x2, y2, x3, y3, *args)
if args[-3].is_a?(Bitmap)
src, x0, y0 = args[-3, 3]
opacity = 255
nodes = [x1, y1, x2, y2, x3, y3].concat(args[0...-3])
elsif args[-4].is_a?(Bitmap)
src, x0, y0, opacity = args[-4, 4]
nodes = [x1, y1, x2, y2, x3, y3].concat(args[0...-4])
else
raiseArgumentError
end
raiseArgumentErrorunless nodes.size[0] == 0
edges = {}
min_y = height
max_y = 0
ox = x0 - x1
oy = y0 - y1
0.step(nodes.size - 2, 2)do |i|
xi, yi = nodes[i, 2]
min_y = [min_y, yi].min
max_y = [max_y, yi].max
xj, yj = nodes[(i + 2) % nodes.size, 2]
dx = 1.0 * (xi - xj) / (yi - yj)
if yi < yj
yh = nodes[i - 1]
if yh < yi
yi += 1
xi += dx
end
edges[yi] ||= []
edges[yi].push([xi, dx, yj])
elsif yi > yj
yk = nodes[(i + 5) % nodes.size]
if yj > yk
yj += 1
xj += dx
end
edges[yj] ||= []
edges[yj].push([xj, dx, yi])
end
end
aet = []
for y in min_y..max_y
if edges[y]
aet.concat(edges[y])
aet.sort!
end
0.step(aet.size - 1, 2)do |i|
xi = aet[0].round
xj = aet[i + 1][0].round
blt(xi, y, src, Rect.new(xi + ox, y + oy, xj - xi + 1, 1), opacity)
aet.reject! {|edge| edge[2] == y}
aet.each{|edge| edge[0] += edge[1]}
aet.sort!
end
end
end
#--------------------------------------------------------------------------
# ● 绘制正多边形
# x : 正多边形外接圆心 X 坐标
# y : 正多边形外接圆心 Y 坐标
# rad : 正多边形外接圆 半径
# edges : 正多边形的边数
# angle : 正多边形旋转角度
# color : 正多边形的颜色 (Color)
#--------------------------------------------------------------------------
def draw_isogon(x, y, rad, edges, angle, color)
raiseArgumentErrorif edges < 3
step = Math::PI * 2 / edges
args = []
angle_i = Math::PI * (270 + angle) / 180
edges.timesdo
args.push((x + rad * Math.cos(angle_i)).round,
(y + rad * Math.sin(angle_i)).round)
angle_i += step
end
args.push(color)
draw_polygon(*args)
end
#--------------------------------------------------------------------------
# ● 绘制实心正多边形
# x : 正多边形外接圆心 X 坐标
# y : 正多边形外接圆心 Y 坐标
# rad : 正多边形外接圆 半径
# edges : 正多边形的边数
# angle : 正多边形旋转角度
# border_color : 正多边形的边框颜色 (Color)
# fill_color1 : 填充渐变的上颜色 (Color)
# fill_color2 : 填充渐变的下颜色 (Color)
#--------------------------------------------------------------------------
def fill_isogon(x, y, rad, edges, angle, border_color, fill_color1 =
border_color, fill_color2 = fill_color1)
raiseArgumentErrorif edges < 3
step = Math::PI * 2 / edges
args = []
angle_i = Math::PI * (270 + angle) / 180
edges.timesdo
args.push((x + rad * Math.cos(angle_i)).round,
(y + rad * Math.sin(angle_i)).round)
angle_i += step
end
args.push(border_color, fill_color1, fill_color2)
fill_polygon(*args)
end
#--------------------------------------------------------------------------
# ● 传送位图正多边形
# x : 正多边形外接圆心 X 坐标
# y : 正多边形外接圆心 Y 坐标
# rad : 正多边形外接圆 半径
# edges : 正多边形的边数
# angle : 正多边形旋转角度
# src_bitmap : 传送元位图
# x0 : 传送圆心 X 坐标
# y0 : 传送圆心 Y 坐标
# opacity : 不透明度
#--------------------------------------------------------------------------
def blt_isogon(x, y, rad, edges, angle, src_bitmap, x0, y0, opacity = 255)
raiseArgumentErrorif edges < 3
step = Math::PI * 2 / edges
args = []
angle_i = Math::PI * (270 + angle) / 180
edges.timesdo
args.push((x + rad * Math.cos(angle_i)).round,
(y + rad * Math.sin(angle_i)).round)
angle_i += step
end
args.push(src_bitmap, x0 - x + args[0], y0 - y + args[1], opacity)
blt_polygon(*args)
end
#--------------------------------------------------------------------------
# ● 绘制圆
# x : 圆心 X 坐标
# y : 圆心 Y 坐标
# rad : 半径
# color : 圆的颜色 (Color)
#--------------------------------------------------------------------------
def draw_circle(x, y, rad, color)
raiseArgumentErrorif rad < 0
return set_pixel(x, y, color)if rad == 0
draw_ellipse(x, y, rad, rad, color)
end
#--------------------------------------------------------------------------
# ● 绘制椭圆
# x : 圆心 X 坐标
# y : 圆心 Y 坐标
# rad_x : 水平半径
# rad_y : 垂直半径
# color : 椭圆的颜色 (Color)
# fill1 : 填充的颜色1 (Color)
# fill2 : 填充的颜色2 (Color)
#--------------------------------------------------------------------------
def draw_ellipse(x, y, rad_x, rad_y, color, fill1 = nil, fill2 = nil)
raiseArgumentErrorif rad_x < 0or rad_y < 0
return set_pixel(x, y, color)if rad_x == 0and rad_y == 0
return fill_rect(x - rad_x, y, rad_x |