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

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

效果

使用示例

cpp 复制代码
    QLineF intersection;
    bool isSuccess = GetOverlapSegment(line1, line2, intersection);

源码

cpp 复制代码
// 判断两个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;
}
相关推荐
超级土豆粉2 分钟前
Turndown.js: 优雅地将 HTML 转换为 Markdown
开发语言·javascript·html
wei_shuo1 小时前
飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式
java·开发语言·飞算javaai
熊猫钓鱼>_>1 小时前
用Python解锁图像处理之力:从基础到智能应用的深度探索
开发语言·图像处理·python
小小小小王王王1 小时前
求猪肉价格最大值
数据结构·c++·算法
GO兔1 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go
好开心啊没烦恼1 小时前
Python 数据分析:numpy,抽提,整数数组索引与基本索引扩展(元组传参)。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy·pandas
岁忧2 小时前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
future14123 小时前
C#学习日记
开发语言·学习·c#
码农编程录3 小时前
【c/c++3】类和对象,vector容器,类继承和多态,systemd,std&boost
c++
king_harry3 小时前
Java程序-OceanBase Connector/J 示例
开发语言