多边形设门算法说明


title: 多边形设门算法说明 source: 流式细胞仪结题材料 author: 未知 size: 133.49 KB pages: 约1页 date: 2026-09-19 method: Python zipfile+XML解析 status: done original_path: /工作相关/液相芯片项目相关工作文档/流式细胞仪项目整理/11其他资料/流式结题材料/多边形设门算法说明.docx

核心内容

本文档说明了流式细胞仪中多边形设门(Polygon Gating)的算法实现,本质是判断点是否在多边形内部的几何计算问题。

算法用途

多边形设门用于细胞筛选,计算画布上代表细胞的点有哪些在多边形内部。

常用算法比较

算法适用范围特点
叉乘判别法仅凸多边形简单但受限
面积判别法仅凸多边形需计算面积和
角度和判别法任意多边形需三角函数运算
水平/垂直交叉点数判别法(射线法)任意多边形最广泛应用

扫描线法(射线法)原理

基本思想:判断由点P发出的射线与多边形边的交点个数:

  • 交点个数为奇数 → P点在多边形内
  • 交点个数为偶数 → P点在多边形外
  • 点在多边形边上 → 视为在多边形内部

特殊情况处理:

  1. 射线穿过顶点:交点会被算作2次,处理办法是如果P的纵坐标与P1,P2中较小的纵坐标相同,则直接忽略

  2. 射线与边平行:无交点或无数交点,直接忽略

  3. 射线与边竖直:若P的横坐标小于P1,P2的横坐标,则必然相交

  4. 点P在边上:直接得出结论——P在多边形内部

算法流程

已知点p(x,y)和多边形Polygon(x1,y1;x2,y2;…xn,yn)

① 以p为起点,以无穷远为终点作平行于X轴的直线line(x,y; -∞,y)

② 循环取得多边形的每一条边side(xi,yi;xi+1,yi+1)
   - 判断是否平行于X轴,如果平行则continue
   - 否则i++

③ 同时判断p(x,y)是否在边(P1,P2)上
   - 如果是,返回1(点在多边形上)
   - 否则继续

④ 判断线side与line是否有交点
   - 如果有则count++
   - 否则i++

⑤ 判断交点总数
   - 奇数 → 返回0(点在多边形内)
   - 偶数 → 返回2(点在多边形外)

直线平行判断简化

由于只涉及直线段(射线也被简化为长线段),判断直线是否水平只需比较线段起始点的y坐标是否相等;判断直线是否垂直只需比较x坐标是否相等,无需计算斜率。

应用效果

多边形设门筛选后可得到如图3所示的细胞分布图,用于进一步分析特定细胞群体。