直线(二维)的表达方式及其相互转化 c++

这篇具有很好参考价值的文章主要介绍了直线(二维)的表达方式及其相互转化 c++。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录关于二维直线代码的时候遇到的一些常见的问题

直线表达方式有三种如下:
1) a x + b y + c = 0    ( 1 ) ax+by+c=0 \space \space(1) ax+by+c=0  (1) 这是代数表达方式,也是通用的表达方式,其中法向量为 s = ( − b , a ) s=(-b, a) s=(b,a)
2) y = k x + b y=kx+b y=kx+b 这是点斜方式。它很好理解,但是它不能表达垂直于 x x x轴的直线。这个特例用 x = b x=b x=b 表示,会特殊处理。它也有一通用方式。就是点和方向表示法: ( x 0 + y 0 ) + t ( d 0 , d 1 ) = ( x , y )    ( 2 ) (x_0 + y_0) + t(d_0, d_1)=(x,y) \space\space (2) (x0+y0)+t(d0,d1)=(x,y)  (2), 其中 ( x 0 + y 0 ) (x_0 + y_0) (x0+y0)为直线上的一个顶点, ( d 0 , d 1 ) (d_0, d_1) (d0,d1)为直线的方向。
3) S ( x 0 , y 0 ) , E ( x 1 , y 1 )    ( 3 ) S(x_0,y_0), E(x_1,y_1) \space \space (3) S(x0,y0),E(x1,y1)  (3) 这是两点表达方式。它也是通用的表达方式。

下面是它们的相互表达以及c++源码。
常用到的是 ( 1 ) (1) (1) ( 2 ) ( 3 ) (2)(3) (2)(3)的转化,

( 3 ) − > ( 1 ) (3)->(1) (3)>(1)
设置 A , B , C A,B,C A,B,C的值使得 ( 3 ) (3) (3)在两个 S , E S,E S,E恒成立。通过简单的转换得到:
A = ( y 1 − y 0 ) ; B = ( x 0 − x 1 ) ; C = x 1 ∗ y 0 − x 0 ∗ y 1 A=(y_1-y_0); B=(x_0-x_1); C=x_1*y_0-x_0*y1 A=(y1y0);B=(x0x1);C=x1y0x0y1
C++代码实现如下:

const float KMIN_FLOAT_THRESHOLD_REFINED = 1e-8;
bool  ConvertEndPntsToLineFun2D(const Eigen::Vector2f& ls2d, const Eigen::Vector2f& le2d, Eigen::Vector3f& line_fun)
	{
		if (std::abs((le2d - ls2d).norm()) < KMIN_FLOAT_THRESHOLD_REFINED)
			return false;
		line_fun[0] = le2d[1] - ls2d[1];
		line_fun[1] = ls2d[0] - le2d[0];
		line_fun[2] = le2d[0] * ls2d[1] - ls2d[0] * le2d[1];
		return true;
	}

( 3 ) − > ( 2 ) (3)->(2) (3)>(2)
它很简单,直接通过两个端点计算直线的方向,然后将其中的一个点作为直线上的点。本篇文章使用 ( d 0 , d 1 ) = E − S (d_0,d_1) = E-S (d0,d1)=ES; ( x 0 , y 0 ) = S (x_0,y_0) = S (x0,y0)=S
C++代码如下:

bool ConvertEndPntsToSPntLineDir2D(const Eigen::Vector2f& ls2d, const Eigen::Vector2f& le2d,
		Eigen::Vector2f& lpnt, Eigen::Vector2f& ldir)
	{
		if ((le2d - ls2d).norm() < KMIN_FLOAT_THRESHOLD_REFINED)
		{
			ldir = Eigen::Vector2f(0.0, 0.0);
			lpnt = Eigen::Vector2f(0.0, 0.0);
			return false;
		}
		ldir = le2d - ls2d;
		ldir.normalize();
		lpnt = ls2d;
		return true;
	}

( 1 ) − > ( 2 ) (1)->(2) (1)>(2)
它也很简单,通过 ( 1 ) (1) (1)的表示方式直接计算直线的法线,然后将直线上取一点。

bool ComputeLineFunLinedir2D(const Eigen::Vector3f& line_fun, Eigen::Vector2f& ldir)
	{
		Eigen::Vector2f line_normal = Eigen::Vector2f(line_fun[0], line_fun[1]);
		float line_denom = line_normal.norm();
		if (line_denom < KMIN_FLOAT_THRESHOLD_REFINED)
		{
			return false;
		}
		line_normal.normalize();
		ldir[0] = -line_normal[1];
		ldir[1] = line_normal[0];
		return true;
	}

	bool SampleSpntFromFunLineFun2D(const Eigen::Vector3f& line_fun, Eigen::Vector2f& lpnt)
	{
		if (std::abs(line_fun[0]) < KMIN_FLOAT_THRESHOLD_REFINED
			&& std::abs(line_fun[1]) < KMIN_FLOAT_THRESHOLD_REFINED)
		{
			return false;
		}
		if (std::abs(line_fun[0]) > std::abs(line_fun[1]))
		{
			lpnt[0] = -line_fun[2] / line_fun[0];
			lpnt[1] = 0;
		}
		else
		{
			lpnt[0] = 0;
			lpnt[1] = -line_fun[2] / line_fun[1];
		}
		return true;
	}

bool ConvertLineFunToSPntLineDir2D(const Eigen::Vector3f& line_fun, Eigen::Vector2f& lpnt, Eigen::Vector2f& ldir)
	{
		//SamplePntsFromLineEndPnts2D
	 	bool lp_flag = SampleSpntFromFunLineFun2D(line_fun, lpnt);
		bool ld_flag = ComputeLineFunLinedir2D(line_fun, ldir);
		if (lp_flag&&ld_flag)
		{
			return true;
		}
		return false;
	}

( 2 ) − > ( 1 ) (2)->(1) (2)>(1)
这个更加简单,直接先转化为两点表示法,然后再转化为 ( 1 ) (1) (1)的表达方式

bool ConvertSPntLineToLineFun2D(const Eigen::Vector2f& lpnt, const Eigen::Vector2f& ldir, Eigen::Vector3f& line_fun)
	{
		if (ldir[0] < KMIN_FLOAT_THRESHOLD_REFINED
			&& ldir[1] < KMIN_FLOAT_THRESHOLD_REFINED)
		{
			return false;
		}
		Eigen::Vector2f end_pnt = lpnt + ldir;
		bool line_flag = ConvertEndPntsToLineFun2D(lpnt, end_pnt, line_fun);
		return line_flag;
	}

这是直线在各个表达方式的相互转化,如果在项目中使用的话,尽量全部统一为一种表达方式。便于计算。文章来源地址https://www.toymoban.com/news/detail-532433.html

到了这里,关于直线(二维)的表达方式及其相互转化 c++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高德地图与百度地图坐标相互转化

    1. WGS-84原始坐标系 ,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用; 2. GCJ-02坐标系 ,又名“火星坐标系

    2024年02月16日
    浏览(41)
  • Java中LocalDateTime/DateTime与Date相互转化(java中时间转化)

    LocalDateTime是JDK1.8出现的新特性,解决线程不安全的问题,但是当前很多的相关插件或者使用较低版本的时候,会依旧使用Date的情况,这个时候就需要两者之间的相互转化 新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。 其次,新AP

    2024年02月15日
    浏览(43)
  • liftOver 不同版本基因组文件相互转化

    大家好,我是邓飞。前一段时间有小伙伴在星球提问:想将不同版本的SNP数据合并,不想重新call snp,想把绵羊的V2和V4版本的数据合并,具体来说,是V2转为V4然后与V4合并。 我建议用 liftOver 软件进行处理,并许诺写篇博客介绍一下。 还有小伙伴想把1.2的参考基因组,变为

    2024年02月07日
    浏览(31)
  • Android中本地图片和bitmap的相互转化

    将Bitmap转换为图片 将本地图片转为bitmap 通过流的方式 通过图片路径的方式 该方法直接传文件路径的字符串,即可将指定路径的图片读取到Bitmap对象。 如果是资源文件的话

    2024年02月12日
    浏览(32)
  • Java中List,Set,数组Arrays相互转化

    很多场合需要进行转换( 例如力扣中 ) 数组转换其他时比较容易,反过来就需要操作一番 以下转换的方法并不唯一,但确保简洁易懂 常规的方法:从数组中拿出元素放进list 用工具类或者库函数: 这个比较容易,从数组中拿出元素放进set(同时会自动去重) 这个需要操作

    2024年02月11日
    浏览(41)
  • javascript中json 对象 数组之间相互转化的示例

    在JavaScript中,你可以使用 JSON.stringify() 将JSON对象转换为JSON字符串,使用 JSON.parse() 将JSON字符串转换为JSON对象。而要将JSON对象转换为数组,可以使用 Object.values() 方法,而要将数组转换为JSON对象,可以使用 Array.reduce() 方法。下面是这些转换的示例代码: 将JSON对象转换为J

    2024年02月16日
    浏览(39)
  • 【数学基础】直线点法式方程表达

    直线和坐标系可以画图为如图所示的形式: 直线 l l l 法线过原点,法线与直线相交于定点 P P P ,法线长度为 ρ ρ ρ ,法线方向矢量为 n n n ,法线和横轴夹角为 θ θ θ 。根据参考资料,直线的“点法式”表达式为: A ( X − X 0 ) + B ( Y − Y 0 ) = 0 A(X-X_0)+B(Y-Y_0)=0 A ( X − X 0 ​

    2024年02月07日
    浏览(53)
  • unity将结构体/列表与json字符串相互转化

    编写Unity程序时,面对大量需要传输或者保存的数据时,为了避免编写重复的代码,故采用NewtonJson插件来将定义好的结构体以及列表等转为json字符串来进行保存和传输。 具体代码如下: 将代码中的结构体换为列表即可将对应的列表输出为json结构的字符串。

    2024年02月05日
    浏览(43)
  • JAVA中int与string相互转化的几种方法

    1、String.valueOf(int i) 2、Integer.toString(int i) 3、i + “”; //i 为 int类型,int+string型就是先将int型的i转为string然后跟上后面的空string。 三种方法效率排序为: Integer.toString(int i) String.valueOf(int i) i+“” 1、Integer.parseInt(String)方法 parseInt()是Integer包装类里的一个方法,可以将字符串解

    2023年04月23日
    浏览(49)
  • 深度学习必备知识——模型数据集Yolo与Voc格式文件相互转化

    在深度学习中,第一步要做的往往就是 处理数据集 ,尤其是学习百度飞桨PaddlePaddle的小伙伴,数据集经常要用Voc格式的,比如性能突出的ppyolo等模型。所以学会 数据集转化 的本领是十分必要的。这篇博客就带你一起进行Yolo与Voc格式的相互转化,附详细代码! Yolo数据集主要

    2024年01月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包