如何按y=mx+c线性方程分组直线?求垂直直线处理方案
直线分组实现方案(兼容垂直直线)
核心思路
把直线拆分为垂直直线和非垂直直线两类分别处理,给每类直线生成唯一标识,再基于标识完成分组:
- 非垂直直线:用「斜率m + 截距c」作为唯一标识
- 垂直直线:用「固定x值k」作为唯一标识(因为垂直直线方程是
x=k,无斜率和截距)
具体步骤
1. 识别直线类型并生成标识
对于任意由两点[x1,y1]、[x2,y2]定义的直线:
- 当
x1 === x2时,判定为垂直直线,标识采用vertical_${x1}(字符串形式方便作为分组键) - 非垂直直线:计算斜率
m = (y2 - y1)/(x2 - x1),截距c = y1 - m*x1,标识采用${m}_${c}(注意处理浮点精度问题)
2. 浮点精度处理提示
直接计算的m和c可能出现浮点误差(比如0.1+0.2=0.30000000000000004),导致本该同组的直线被拆分,建议两种处理方式:
- 将m和c转换为分数形式存储(用分子分母表示,避免浮点运算)
- 对m和c进行四舍五入,保留足够多的小数位(比如6位)
3. 分组实现代码(JavaScript)
function groupLines(lines) { const groupMap = {}; lines.forEach(line => { const [[x1, y1], [x2, y2]] = line; let groupKey; // 处理垂直直线 if (x1 === x2) { groupKey = `vertical_${x1}`; } else { // 计算斜率和截距,处理浮点精度 const slope = Number(((y2 - y1) / (x2 - x1)).toFixed(6)); const intercept = Number((y1 - slope * x1).toFixed(6)); groupKey = `${slope}_${intercept}`; } // 填充分组 if (!groupMap[groupKey]) { groupMap[groupKey] = []; } groupMap[groupKey].push(line); }); // 将分组映射转为嵌套数组返回 return Object.values(groupMap); } // 测试示例 const sampleLines = [ [[1,4],[40,4]], // y=0x+4 [[2,5],[3,5]], // y=0x+5 [[4,2],[4,10]], // x=4 [[4,0],[4,5]], // x=4 [[0,3],[2,7]] // y=2x+3 ]; console.log(groupLines(sampleLines));
代码说明
- 垂直直线通过判断两点x坐标是否相等快速识别,用固定格式的字符串作为分组键
- 非垂直直线对斜率和截距做了
toFixed(6)处理,规避浮点精度导致的分组错误 - 最终返回的是嵌套数组结构,每个子数组包含所有属于同一线性方程的直线
内容的提问来源于stack exchange,提问作者Theodore John
相关产品推荐
相关产品推荐

