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;
}
相关推荐
我不是程序猿儿17 分钟前
【C#】XtraMessageBox(DevExpress)与MessageBox(WinForms 标准库)的区别
开发语言·c#
玖笙&34 分钟前
✨WPF编程进阶【6.1】:图形原则(附源码)
c++·c#·wpf·visual studio
s砚山s1 小时前
代码随想录刷题——二叉树篇(一)
c++·算法·leetcode
含目的基因的质粒1 小时前
Python异常、模块、包
服务器·开发语言·python
AC是你的谎言2 小时前
HTTP和HTTPS
linux·网络·c++·网络协议·学习·http·https
千码君20162 小时前
Go语言:解决 “package xxx is not in std”的思路
开发语言·后端·golang
Ypuyu2 小时前
【GoLang】【框架学习】【GORM】4. 使用 BeforeUpdate hook 操作时,出现反射报错
开发语言·学习·golang
ZIM学编程3 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php
maizeman1263 小时前
用R语言生成指定品种与对照的一元回归直线(含置信区间)
开发语言·回归·r语言·置信区间·品种测试
代码AC不AC3 小时前
【C++】哈希表封装实现 unordered_map 和 unordered_set
c++·unordered_map·unordered_set·哈希表封装