如何在Julia语言中绘制扇形并输出为布尔或整数数组?
Julia绘制扇形掩码数组的实现方法
方法1:直接生成布尔掩码(推荐,无需额外适配,效率高)
你需要的本质是符合「在半径范围内+角度区间内」的坐标集合,直接按几何规则遍历计算即可,不需要依赖绘图库的API,生成的结果直接就是布尔数组,完全匹配你做掩码的需求。
示例实现代码如下:
function generate_sector_mask(img_size::Tuple{Int,Int}, cx::Int, cy::Int, r::Int, start_angle::Real, end_angle::Real; use_degree::Bool=true) # img_size为输入图像尺寸,格式为(高度, 宽度),和Images.jl的数组维度对应 # cx、cy为扇形圆心坐标,r为半径 # start_angle、end_angle为起始/终止角度,默认输入为角度,设置use_degree=false则输入为弧度 # 角度正方向默认和数学坐标系一致:0度为x轴正方向,逆时针为正,可根据需求调整计算逻辑 if use_degree start_angle = deg2rad(start_angle) end_angle = deg2rad(end_angle) end mask = falses(img_size) h, w = img_size for x in 1:w for y in 1:h # 计算当前点到圆心的相对坐标 dx = x - cx dy = y - cy # 条件1:距离小于等于半径 dist_sq = dx^2 + dy^2 if dist_sq > r^2 continue end # 条件2:角度在指定区间内 angle = atan(dy, dx) # 处理角度跨0的特殊情况,比如起始350度、终止10度的区间 if start_angle <= end_angle angle_in = (angle >= start_angle) && (angle <= end_angle) else angle_in = (angle >= start_angle) || (angle <= end_angle) end if angle_in mask[y, x] = true end end end return mask end
使用示例:
要在尺寸为500×500的图像上生成圆心(350,200)、半径100、角度从0度到90度的扇形掩码,直接调用:mask = generate_sector_mask((500,500), 350, 200, 100, 0, 90)
生成的mask是布尔数组,可直接用来索引其他数组,需要转整型的话执行UInt8.(mask)即可。
方法2:基于ImageDraw的多边形近似实现
如果要复用ImageDraw的绘图逻辑,可以把扇形拆解为「圆心+圆弧采样点」组成的多边形,填充后即可得到扇形:
示例实现代码如下:
using ImageDraw function draw_sector!(img, cx::Int, cy::Int, r::Int, start_angle::Real, end_angle::Real; use_degree::Bool=true, n_arc_points::Int=100) if use_degree start_angle = deg2rad(start_angle) end_angle = deg2rad(end_angle) end # 生成圆弧采样点 angles = range(start_angle, end_angle, length=n_arc_points) points = [Point(cx, cy)] # 第一个点为圆心 for a in angles x = cx + round(Int, r * cos(a)) y = cy + round(Int, r * sin(a)) push!(points, Point(x, y)) end push!(points, Point(cx, cy)) # 闭合多边形 # 填充绘制,你原示例中的fill = tue是笔误,正确应为fill = true draw!(img, Polygon(points), fill=true) return img end
使用时先初始化一个全false的布尔数组传入即可得到掩码:
mask = falses(500,500) draw_sector!(mask, 350, 200, 100, 0, 90)
内容的提问来源于stack exchange,提问作者Antonio Serrano
相关产品推荐
相关产品推荐

