本文目录导读:

在篮球规则(FIBA、NBA、CBA)中,挡拆配合(Pick and Roll)本身是完全合法的,不存在“挡拆就是犯规”的说法,但在实际执行过程中,“挡拆”动作的细节直接决定了裁判是否吹罚犯规。
结合你提到的“PHP项目”(可能是指包含篮球视频分析、战术识别或Web开发的项目,或者是对误判的吐槽),我们需要区分代码逻辑/规则判定和实际裁判判罚的差异。
下面从技术规则(代码层面)和实际视觉(裁判尺度)两个维度来分析:
从规则(代码逻辑)角度判定
如果要在PHP项目中实现一个“是否犯规”的判定函数,你需要设定以下违规条件(任一为真,则犯规):
- 非法掩护(移动挡拆):掩护者在建立掩护后,双脚仍在移动,或通过躯干/臀部主动发力顶开防守人。
- PHP逻辑:判断掩护者是否处于静止(Static)状态。
- 掩护距离过近:掩护者在防守人视野之外(侧后方)进行掩护时,没有预留足够的缓冲距离(通常不足1步)。
- 侵犯圆柱体:掩护者张开手臂推搡、或者用膝盖顶撞防守人,超出了掩护者的圆柱体(身体垂直空间)。
如果掩护者双脚站定、双手抱胸或护住裆部、没有推搡动作,那么这次挡拆绝对不犯规。
从实际比赛(裁判视角)角度判定
这通常是PHP项目中最难用代码模拟的“模糊地带”:
- “主动撞” vs “被迫撞”:防守人如果选择绕过掩护,主动发力撞击掩护者导致其摔倒,裁判通常判防守人犯规(带球撞人)或不吹,因为掩护者是合法站位。
- “接触面积”:如果是躯干对躯干的接触,且掩护者站位未动,一般不吹;如果是侧身(肩部或臀部)发力,吹掩护犯规。
- 移动中的延误:如果掩护者在掩护瞬间有一个横移或后撤去拦截防守人路线,无论是否接触,都会被吹移动掩护。
结合PHP项目的具体场景
如果你正在开发一个篮球数据统计/评分库(如 steeze/statistics 或自研逻辑),建议将“挡拆犯规”的判断条件设置为:
// 伪代码逻辑
function isScreenFoul($screen_action, $defender_pos) {
$foul = false;
// 1. 判断是否为非法动作(腿部勾人、手臂推开)
if ($screen_action->leg_hook || $screen_action->arm_push) {
$foul = true; // 恶意推挤
}
// 2. 判断掩护者是否静止(动球)
if ($screen_action->speed > 0.5 && $screen_action->contact_time > 100) {
$foul = true; // 移动掩护,且有接触时间
}
// 3. 判断防守人距离(如果是背后掩护,距离过近)
if ($screen_action->position == 'hidden' && $defender_pos->distance < 1.0) {
$foul = true; // 视野外掩护且距离不足
}
return $foul;
}
注意: 在真实篮球规则中,判罚标准要求“接触必须导致身体失衡”,如果只是轻微的“擦碰”且没有影响防守人移动,即使发生侵犯圆柱体,裁判也可能不吹。
总结判断
- 如果动作是:双手抱胸、双脚定死、直上直下站立,挡在持球人防守者侧前方。 (\rightarrow) 不犯规(合法掩护)。
- 如果动作是:掩护时双脚动了,或者掩护人用膝盖顶了防守人大腿,或者掩护人后撤步撞倒防守人。 (\rightarrow) 犯规(非法掩护)。
如果在你的PHP项目中出现了“挡拆被吹犯规”的情况,大概率是项目里对“防守人路径”与“掩护者静止状态”的碰撞检测(Collision Detection)算法过于严格,导致把标准的“圆柱体接触”误判为了“推人”,建议在判定逻辑中加入 “接触时间(持续时间)” 和 “传导力量(速度差)” 作为权重,来减少误判。
如果这是你在比赛中遇到的实际争议,并且是在FIBA规则(CBA)下:只要掩护者没有横向移动,裁判响哨大概率是判防守方“阻挡犯规”。