已知矩形一条边的两点x1、x2及宽度,求另外两点以构成矩形
解决矩形平行边点计算的问题
我明白你现在卡在这个矩形点计算的问题上了——尤其是涉及到图像到现实世界的投影,这种场景下坐标转换的细节很容易坑人。之前的方案没用可能是因为没考虑到向量单位化或者坐标系方向的问题,我给你梳理一下靠谱的步骤:
核心思路
要构建和x1-x2直线平行的矩形,关键是找到垂直于x1-x2方向的偏移向量,把x1和x2沿着这个方向偏移指定宽度,就能得到另外两个顶点。
具体计算步骤(以2D坐标为例,3D场景见末尾补充)
假设x1=(x1_x, x1_y),x2=(x2_x, x2_y),指定宽度为w:
计算x1到x2的方向向量
这个向量代表了原始直线的走向:vec = (x2_x - x1_x, x2_y - x1_y)生成垂直于方向向量的偏移向量
矩形的边必须和原始直线垂直,所以需要两个相反方向的垂直向量(对应矩形在原始直线的两侧):# 方向1:顺时针旋转90度 perp_vec_clockwise = (-vec[1], vec[0]) # 方向2:逆时针旋转90度 perp_vec_counterclockwise = (vec[1], -vec[0])注意:如果你的坐标系是图像坐标系(y轴向下),顺时针/逆时针的方向可能和现实世界坐标系相反,需要根据实际情况调整
将垂直向量单位化
因为我们需要的是精确的宽度偏移,必须把垂直向量转换成长度为1的单位向量:vec_length = sqrt(vec[0]**2 + vec[1]**2) unit_perp_clockwise = (perp_vec_clockwise[0]/vec_length, perp_vec_clockwise[1]/vec_length) unit_perp_counterclockwise = (perp_vec_counterclockwise[0]/vec_length, perp_vec_counterclockwise[1]/vec_length)计算偏移后的两个顶点
用单位向量乘以指定宽度,加到x1和x2上,就能得到平行边上的两个点:# 顺时针方向偏移的点 x1_clockwise = (x1_x + unit_perp_clockwise[0]*w, x1_y + unit_perp_clockwise[1]*w) x2_clockwise = (x2_x + unit_perp_clockwise[0]*w, x2_y + unit_perp_clockwise[1]*w) # 逆时针方向偏移的点 x1_counterclockwise = (x1_x + unit_perp_counterclockwise[0]*w, x1_y + unit_perp_counterclockwise[1]*w) x2_counterclockwise = (x2_x + unit_perp_counterclockwise[0]*w, x2_y + unit_perp_counterclockwise[1]*w)此时,
x1, x2, x2_clockwise, x1_clockwise或者x1, x2, x2_counterclockwise, x1_counterclockwise就构成了你需要的矩形。
3D投影场景的补充
如果是3D现实世界坐标,你需要先确定矩形所在的平面(比如地面、墙面),然后计算在该平面内垂直于x1-x2的向量:
- 先获取平面的法向量
n - 用叉乘计算
vec和n的叉乘,得到平面内的垂直向量:perp_vec = cross(vec, n) - 后续的单位化和偏移步骤和2D一致
为什么之前的方案可能失效?
- 没有对垂直向量进行单位化:如果直接用原始垂直向量偏移,得到的宽度会和实际需求不符(因为垂直向量的长度等于原始直线的长度)
- 坐标系方向混淆:图像坐标系和现实世界坐标系的y轴方向相反,导致垂直向量的方向错误,生成的矩形位置不对
内容的提问来源于stack exchange,提问作者benjist
相关产品推荐
相关产品推荐

