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

仅基于到区域划分曲线的最小距离判定平面点的区域归属

问题:仅靠点到划分曲线的最小距离能否判断所属区域?

现有平面上已知坐标的散点集,四条曲线C1-C4将平面划分为R1-R5五个区域,且已知每个点到每条曲线的最小距离数值。能否仅依靠这些信息判断点所属区域?希望用Python编写代码实现此功能。

目前的初步思路是:先找到每个点最小距离对应的曲线,以此缩小区域范围,但遇到核心问题——无法判断点处于曲线的哪一侧。例如点A、B到曲线C3的最小距离最小,但它们可能属于R3或R4,无法进一步区分。求可行解决方案,或确认是否需要补充更多信息。


简化示例代码

输入数据

import pandas as pd

columns = ['Point', 'x', 'y', 'd1','d2','R']
data = [("A",1.5, 3.5, 1.2, 2.8, "NA"), ("B",3.5, 2.5, 0.8, 0.7, "NA"), ("C", 3.0, 0.5, 2.1,0.5,"NA")]
df = pd.DataFrame(data, columns=columns)

区域名称列表

regions=["R1","R2","R3"]

预期输出

output_columns = ['Point', 'x', 'y', 'd1','d2','R']
output_data = [("A",1.5, 3.5, 1.2, 2.8, "R1"), ("B",3.5, 2.5, 0.8, 0.7, "R2"), ("C", 3.0, 0.5, 2.1,0.5,"R3")]
output_df = pd.DataFrame(output_data, columns=output_columns)

解决方案分析

核心结论

仅靠无符号的最小距离数值,无法确定点在曲线的哪一侧,因此无法唯一判断所属区域,必须补充额外信息。

可行方案

方案1:补充带符号的距离信息

给每条曲线定义「方向规则」:比如对曲线Ci,规定点在曲线某一侧时距离为正,另一侧为负(而非仅保留绝对值)。这样结合最小距离对应的曲线,再通过符号就能确定点所在的区域。

示例实现(基于补充符号距离的情况):

import pandas as pd

# 修改输入数据,加入带符号的距离s1、s2(代替原无符号d1、d2)
columns = ['Point', 'x', 'y', 's1','s2','R']
data = [("A",1.5, 3.5, 1.2, -2.8, "NA"), ("B",3.5, 2.5, -0.8, 0.7, "NA"), ("C", 3.0, 0.5, -2.1, -0.5,"NA")]
df = pd.DataFrame(data, columns=columns)

# 定义区域判断规则:根据符号距离的组合匹配区域
def determine_region(row):
    s1, s2 = row['s1'], row['s2']
    if s1 > 0:
        return "R1"
    elif s2 > 0:
        return "R2"
    else:
        return "R3"

df['R'] = df.apply(determine_region, axis=1)
print(df)

方案2:利用曲线方程计算侧别

如果能获取每条划分曲线的方程(比如f(x,y)=0),可以直接代入点的坐标计算f(x,y)的正负值:

  • 若f(x,y) > 0,点在曲线某一侧;
  • 若f(x,y) < 0,点在曲线另一侧。
    结合最小距离对应的曲线,即可锁定区域。

示例实现(假设曲线C1方程为x + y - 5 = 0,C2方程为y - x + 1 = 0):

import pandas as pd

columns = ['Point', 'x', 'y', 'd1','d2','R']
data = [("A",1.5, 3.5, 1.2, 2.8, "NA"), ("B",3.5, 2.5, 0.8, 0.7, "NA"), ("C", 3.0, 0.5, 2.1,0.5,"NA")]
df = pd.DataFrame(data, columns=columns)

# 定义曲线方程的侧别判断函数
def check_c1_side(x, y):
    # C1: x + y -5 =0,值>0表示一侧,<0表示另一侧
    return x + y -5

def check_c2_side(x, y):
    # C2: y -x +1 =0,值>0表示一侧,<0表示另一侧
    return y - x +1

def determine_region(row):
    x, y = row['x'], row['y']
    # 先找最小距离对应的曲线
    min_dist = min(row['d1'], row['d2'])
    if min_dist == row['d1']:
        # 靠近C1,判断侧别
        if check_c1_side(x,y) >0:
            return "R1"
        else:
            return "R2"
    else:
        # 靠近C2,判断侧别
        if check_c2_side(x,y) >0:
            return "R2"
        else:
            return "R3"

df['R'] = df.apply(determine_region, axis=1)
print(df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:27:28