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

22 篇文章 1 订阅

计算两条直线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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要找到一点到两条相交直线距离相等的问题,可以使用以下方法: 1. 找到直线的交点; 2. 计算该点到两条直线的距离是否相等。 具体实现如下: ```c++ #include <QtWidgets> class GraphicsView : public QGraphicsView { public: GraphicsView(QWidget* parent = nullptr) : QGraphicsView(parent) { setRenderHint(QPainter::Antialiasing); setScene(new QGraphicsScene(this)); // 创建直线 QLineF line1(-50, 50, 50, 50); QLineF line2(0, -50, 0, 50); // 创建图形项 QGraphicsLineItem* item1 = new QGraphicsLineItem(line1); QGraphicsLineItem* item2 = new QGraphicsLineItem(line2); item1->setPen(QPen(Qt::blue, 2)); item2->setPen(QPen(Qt::green, 2)); // 添加图形项到场景 scene()->addItem(item1); scene()->addItem(item2); // 计算交点 QPointF intersection; if (line1.intersects(line2, &intersection) == QLineF::BoundedIntersection) { // 计算点到两条直线的距离 qreal distance1 = QLineF(intersection, line1.p1()).length(); qreal distance2 = QLineF(intersection, line2.p1()).length(); if (qFuzzyCompare(distance1, distance2)) { // 添加标记 QGraphicsEllipseItem* item = new QGraphicsEllipseItem(intersection.x() - 5, intersection.y() - 5, 10, 10); item->setBrush(QBrush(Qt::red)); scene()->addItem(item); } } } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); GraphicsView view; view.show(); return a.exec(); } ``` 在该示例中,我们创建两条直线并将它们添加到场景中。然后使用 `QLineF` 的 `intersects` 函数计算它们的交点。如果交点存在,则计算该点到两条直线的距离是否相等。如果是,则在该点处添加一个红色椭圆形作为标记。 注意,由于计算距离时使用了 `qFuzzyCompare` 函数,因此可能存在一定误差。如果需要更高的精度,请使用更精确的方法计算距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值