Qt 计算两条直线QLineF的重叠部分,如何存在则返回该直线

计算两条直线QLineF的重叠部分

效果

在这里插入图片描述

使用示例

    QLineF intersection;
    bool isSuccess = GetOverlapSegment(line1, line2, intersection);

源码

// 判断两个QLineF对象在斜率相同时是否存在重叠部分
bool DoLineOverlapWithSameSlope(const QLineF& line1, const QLineF& line2)
{
	qreal slope1 = line1.dy() / line1.dx();
	qreal slope2 = line2.dy() / line2.dx();

	// 引入误差范围
	qreal epsilon = 1e-6;

	if (std::abs(slope1 - slope2) > epsilon) {
		return false; // 斜率不相等,直接返回false
	}

	qreal b1 = line1.p1().y() - slope1 * line1.p1().x();
	qreal b2 = line2.p1().y() - slope1 * line2.p1().x();

	qreal x_overlap = (b2 - b1) / (slope1 - slope2);

	if (x_overlap < qMin(line1.p1().x(), line1.p2().x()) ||
		x_overlap > qMax(line1.p1().x(), line1.p2().x()) ||
		x_overlap < qMin(line2.p1().x(), line2.p2().x()) ||
		x_overlap > qMax(line2.p1().x(), line2.p2().x())) {
		return false;
	}

	return true;
}

bool GetOverlapSegment(const QLineF& line1, const QLineF& line2, QLineF& overlap)
{
	bool is_overlap = DoLineOverlapWithSameSlope(line1, line2);
	if (!is_overlap) return false;

	qreal start1 = qMin(line1.p1().x(), line1.p2().x());
	qreal end1 = qMax(line1.p1().x(), line1.p2().x());
	qreal start2 = qMin(line2.p1().x(), line2.p2().x());
	qreal end2 = qMax(line2.p1().x(), line2.p2().x());

	qreal overlapStart = qMax(start1, start2);
	qreal overlapEnd = qMin(end1, end2);

	if (overlapStart <= overlapEnd) {
		qreal minY1 = qMin(line1.p1().y(), line1.p2().y());
		qreal maxY1 = qMax(line1.p1().y(), line1.p2().y());
		qreal minY2 = qMin(line2.p1().y(), line2.p2().y());
		qreal maxY2 = qMax(line2.p1().y(), line2.p2().y());

		qreal overlapMinY = qMax(minY1, minY2);
		qreal overlapMaxY = qMin(maxY1, maxY2);

		overlap.setP1(QPointF(overlapStart, overlapMinY));
		overlap.setP2(QPointF(overlapEnd, overlapMaxY));

		return true;
	}

	return false;
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 19:24:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 19:24:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 19:24:03       82 阅读
  4. Python语言-面向对象

    2024-03-26 19:24:03       91 阅读

热门阅读

  1. 使用alias定义命令别名

    2024-03-26 19:24:03       40 阅读
  2. C#实例:SQL如何添加数据

    2024-03-26 19:24:03       44 阅读
  3. 全球化航程中的网络技术与安全策略

    2024-03-26 19:24:03       38 阅读
  4. Mysql数据库SQL从一个表更新至另一个表

    2024-03-26 19:24:03       40 阅读
  5. RCC时钟代码详解<一步一注释>

    2024-03-26 19:24:03       42 阅读
  6. LEETCODE-DAY28

    2024-03-26 19:24:03       39 阅读
  7. 网络安全知识核心之RIP的工作原理

    2024-03-26 19:24:03       38 阅读
  8. Windows与Linux端口占用查看、杀死的方法

    2024-03-26 19:24:03       33 阅读
  9. # 15 React 使用useEffect获取网络数据

    2024-03-26 19:24:03       45 阅读
  10. C++中string容器的元素访问

    2024-03-26 19:24:03       44 阅读
  11. 6. C++ 内存分布

    2024-03-26 19:24:03       35 阅读
  12. 大数据中TopK问题

    2024-03-26 19:24:03       38 阅读