You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:24:05