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

如何在Mathematica中实现液滴内正圆自动调整与数值计算

Mathematica 液滴轮廓内正圆超出区域面积计算实现

参考效果示意图:
液滴正圆计算参考示意图

实现步骤

  • 第一步:提取/定义液滴轮廓区域
    如果是从示例这类图像导入,直接用内置图像处理函数提取闭合液滴区域:

    (* 替换成你的液滴图像本地路径 *)
    img = Import["path/to/your/droplet/image.png"];
    (* 二值化去噪后提取液滴闭合区域 *)
    dropletRegion = Binarize[img]//DeleteSmallComponents//EdgeDetect//ImageGraphics//First//DiscretizeGraphics
    

    如果你已经有液滴轮廓的参数化方程,直接替换成自定义的参数区域/隐式区域即可,不需要走图像提取流程。

  • 第二步:确定正圆参数遍历规则
    正圆共3个可调参数:圆心坐标{cx, cy}、半径r。如果不需要移动圆心,直接取液滴质心作为固定圆心即可:

    (* 取液滴质心为固定圆心,需要移动圆心可把cx、cy加入遍历列表 *)
    {cx0, cy0} = RegionCentroid[dropletRegion];
    (* 按需求设置半径遍历范围、步长,步长越小精度越高 *)
    radiusRange = Range[0, Max[Subtract@@@RegionBounds[dropletRegion]]/2, 0.5];
    
  • 第三步:逐组参数计算超出区域面积
    不需要手动逐块累加面积,直接用Mathematica原生区域运算求交集即可得到正圆超出液滴的部分,直接调用Area得到计算值:

    (* 遍历所有半径,返回{半径值, 对应超出面积}的结果列表 *)
    calcResult = Table[
        circle = DiscretizeRegion[Disk[{cx0, cy0}, r], AccuracyGoal -> 3];
        (* 超出区域=正圆和液滴外部区域的交集 *)
        outsidePart = RegionIntersection[circle, RegionComplement[dropletRegion]];
        {r, Area[outsidePart]},
        {r, radiusRange}
      ];
    

可选扩展功能

  • 自动找液滴最大内切圆:直接调用优化函数求解超出面积为0时的最大半径和对应圆心位置
    maxInscribedCircle = NMaximize[
      {r, Area[RegionIntersection[Disk[{cx, cy}, r], RegionComplement[dropletRegion]]] < 10^-3},
      {cx, cy, r}
    ]
    
  • 结果可视化校验:将液滴、不同半径的正圆叠加显示,核对超出区域计算是否符合预期
    Show[
      Graphics[{LightBlue, Opacity[0.7], dropletRegion}],
      Graphics[{Red, Opacity[0.3], Disk[{cx0, cy0}, #]& /@ radiusRange[[;; ;;10]]}],
      PlotRange -> All, Axes -> True
    ]
    

注意:如果图像分辨率较高,可适当调低DiscretizeRegion的精度目标提升计算速度,精度要求高时再调高参数即可。

内容的提问来源于stack exchange,提问作者Hinata Shoyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:12:16