如何计算正方形顶点与任意点的归一化接近度(Proximity)
如何计算正方形顶点与任意点的归一化接近度(Proximity)
看起来你需要的是一种能平滑过渡的顶点接近度计算方式,完全贴合你给出的示例规则——顶点处对应值为1,对角顶点为0,中心四个值都是0.5,中间点呈现混合状态。下面我给你一步步拆解实现方法:
步骤1:明确正方形的顶点坐标定义
首先得把你的正方形四个顶点的坐标固定下来,方便后续计算。这里我们先采用你示例中的坐标系(你可以根据实际需求调整):
假设正方形是轴对齐的,范围为 x ∈ [-1, 1],y ∈ [-1, 1],四个顶点定义为:
- A:
(-1, -1)(左下) - B:
(-1, 1)(左上) - C:
(1, 1)(右上) - D:
(1, -1)(右下)
如果你的正方形实际范围不是[-1,1]×[-1,1](比如x ∈ [x_min, x_max],y ∈ [y_min, y_max]),先做坐标标准化,把输入点P(x,y)转换到[-1,1]的标准坐标系:
# 假设你的正方形实际边界是x_min, x_max, y_min, y_max x_norm = 2 * (x - x_min) / (x_max - x_min) - 1 y_norm = 2 * (y - y_min) / (y_max - y_min) - 1
转换后,原正方形的四个顶点就对应到上面的A、B、C、D了。
步骤2:用归一化切比雪夫距离计算接近度
你需要的规则刚好可以用反向的归一化切比雪夫距离来实现。切比雪夫距离的定义是两点在各坐标轴上距离的最大值,归一化后再用1减去这个值,就能得到0-1之间的接近度:
对于每个顶点,计算逻辑如下:
- 计算点
P(x_norm, y_norm)到目标顶点的x轴距离:dx = abs(x_norm - corner_x) - 计算y轴距离:
dy = abs(y_norm - corner_y) - 切比雪夫距离:
chebyshev_dist = max(dx, dy) - 归一化接近度:
proximity = 1 - chebyshev_dist / 2(因为正方形边长为2,最大切比雪夫距离是2,除以2后归一化到0-1)
具体公式(对应我们的标准顶点)
- 顶点A的接近度:
vA = 1 - max(abs(x_norm + 1), abs(y_norm + 1)) / 2 - 顶点B的接近度:
vB = 1 - max(abs(x_norm + 1), abs(y_norm - 1)) / 2 - 顶点C的接近度:
vC = 1 - max(abs(x_norm - 1), abs(y_norm - 1)) / 2 - 顶点D的接近度:
vD = 1 - max(abs(x_norm - 1), abs(y_norm + 1)) / 2
验证示例
我们来验证你给出的两个例子:
当P是B点
(-1, 1):- vA:
1 - max(0, 2)/2 = 1 -1 =0 - vB:
1 - max(0,0)/2=1 - vC:
1 - max(2,0)/2=0 - vD:
1 - max(2,2)/2=0
输出结果:[0,1,0,0],完全符合你的要求。
- vA:
当P是中心
(0,0):- 每个顶点的切比雪夫距离都是
max(1,1)=1 - 每个接近度:
1 -1/2=0.5
输出结果:[0.5,0.5,0.5,0.5],完美匹配。
- 每个顶点的切比雪夫距离都是
额外的混合场景示例
比如P是上边中点(0,1):
- vA:
1 - max(1,2)/2=0 - vB:
1 - max(1,0)/2=0.5 - vC:
1 - max(1,0)/2=0.5 - vD:
1 - max(1,2)/2=0
输出[0,0.5,0.5,0],呈现出B和C之间的混合状态,符合你“角落之间有混合值”的需求。
备注:内容来源于stack exchange,提问作者jml
相关产品推荐
相关产品推荐

