平行线判断函数+求平行线之间的距离

struct LINE
{
	CvPoint pt0;
	CvPoint pt1;
	LINE( CvPoint pta, CvPoint ptb )
	{
		pt0 = pta;
		pt1 = ptb;
	}
	LINE()
	{
		pt0.x = pt0.y = 0;
		pt1.x = pt1.y = 0;
	}
};

// 得到直线的tan斜率
double GetTanOfLine( LINE line )
{
	double x_dis = line.pt0.x - line.pt1.x;
	if ( x_dis == 0.0 ) return 10e9;
	return (line.pt0.y - line.pt1.y) / x_dis;
}


// 得到两条平行线之间的距离
double GetDisOfParallelLines( LINE line0, LINE line1 )
{
	CvPoint midPoint = cvPoint( (line0.pt0.x + line0.pt1.x)/2, (line0.pt0.y + line0.pt1.y)/2 ); // 中点
	double x_dis = line1.pt0.x - line1.pt1.x;
	if ( x_dis == 0.0 ) return fabs((double)(midPoint.x - line0.pt0.x)); // 如果line1 垂直x轴

	double a = (line1.pt0.y - line1.pt1.y) / x_dis;
	double b = line1.pt0.y - (line1.pt0.x * a);
	return fabs(a * midPoint.x - midPoint.y + b) / sqrt(a * a + 1);
}


// 判断两直线是否平行
bool IsParallelLines( LINE line0, LINE line1 )
{
#define LIMIT (1.1547 / 3) #近似平行线的斜率之差的范围

	double angleTan0 = GetTanOfLine( line0 );
	double angleTan1 = GetTanOfLine( line1 );
	if ( fabs(angleTan0 - angleTan1) < (double)LIMIT )
	{
		return 1;
	}
	return 0;
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 首先,我们需要定义一个直线段类型的属性,可以在头文件中定义一个类,例如: ``` // LineSegment.h class LineSegment { public: LineSegment(); LineSegment(Point3D start, Point3D end); double length() const; Point3D midpoint() const; bool intersects(const LineSegment& other) const; double distance(const Point3D& point) const; private: Point3D m_start; Point3D m_end; }; ``` 其中,`Point3D` 是一个三维空间中的点类型,可以在同一个头文件中定义。这个类定义了直线段的起点和终点,并提供了一些常用的操作函数,如计算直线段长度、中点、是否与另一条直线段相交以及任意点到直线段的距离。 接下来,我们需要在 CPP 文件中实现这个类的函数。例如: ``` // LineSegment.cpp #include "LineSegment.h" LineSegment::LineSegment() : m_start(0,0,0), m_end(0,0,0) { } LineSegment::LineSegment(Point3D start, Point3D end) : m_start(start), m_end(end) { } double LineSegment::length() const { return m_start.distance(m_end); } Point3D LineSegment::midpoint() const { return Point3D((m_start.x() + m_end.x()) / 2, (m_start.y() + m_end.y()) / 2, (m_start.z() + m_end.z()) / 2); } bool LineSegment::intersects(const LineSegment& other) const { // 判断两条线段是否相交 // ... } double LineSegment::distance(const Point3D& point) const { // 计算任意点到当前直线的距离 // ... } ``` 其中,`Point3D` 类型的函数需要在 CPP 文件中实现。例如: ``` // Point3D.h class Point3D { public: Point3D(); Point3D(double x, double y, double z); double x() const; double y() const; double z() const; double distance(const Point3D& other) const; private: double m_x; double m_y; double m_z; }; // Point3D.cpp #include "Point3D.h" #include <cmath> Point3D::Point3D() : m_x(0), m_y(0), m_z(0) { } Point3D::Point3D(double x, double y, double z) : m_x(x), m_y(y), m_z(z) { } double Point3D::x() const { return m_x; } double Point3D::y() const { return m_y; } double Point3D::z() const { return m_z; } double Point3D::distance(const Point3D& other) const { double dx = m_x - other.m_x; double dy = m_y - other.m_y; double dz = m_z - other.m_z; return std::sqrt(dx * dx + dy * dy + dz * dz); } ``` 最后,在需要使用这个类的文件中,只需要包含头文件 `LineSegment.h`,然后就可以使用其中定义的类了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值