精华内容
下载资源
问答
  • 前面有介绍过两种CAD画两条样条线的中心线的方法,分别是用三维曲面提取中心线和画辅助取中心线,这两种方法。其实还有更简单的方法,就是用插件,感兴趣的可以自己找有相关功能的插件来使用。这里提供一个。(defun ...

    前面有介绍过两种CAD画两条样条线的中心线的方法,分别是用三维曲面提取中心线和画辅助取中心线,这两种方法。其实还有更简单的方法,就是用插件,感兴趣的可以自己找有相关功能的插件来使用。

    这里提供一个。

    (defun c:zx( / ent1 ent2 num p1list p2list p3list i cp p1 cv1 cv2 stp endp) (setq ent1 (car (entsel "\n选择第1对象:")))

    (setq ent2 (car (entsel"\n选择第2对象:")))

    (setq cv1 ent1 cv2 ent2)

    (setq num (getint "\n控制点数量(越多效果越好:"))

    (if (ssget "x" (list (cons 0 "POINT"))) (command "erase" (ssget "x" (list (cons 0 "POINT"))) ""))

    (command "divide" ent1 num)

    (setq ent1 (ssget "x" (list (cons 0 "POINT"))))

    (setq p1list nil i 0)

    (while (setq cp (ssname ent1 i))

    (setq p1list (append p1list (list (cdr (assoc 10 (entget cp))))))

    (setq i (1+ i))

    )

    (setq stp (vlax-curve-getStartPoint cv1) endp (vlax-curve-getEndPoint cv1))

    (if (> (distance stp (nth 0 p1list)) (distance endp (nth 0 p1list)))

    (setq p1list (append (list endp) p1list (list stp)))

    (setq p1list (append (list stp) p1list (list endp)))

    )

    (command "erase" ent1 "")

    (command "divide" ent2 num)

    (setq ent2 (ssget "x" (list (cons 0 "POINT"))))

    (setq p2list nil i 0)

    (while (setq cp (ssname ent2 i))

    (setq p2list (append p2list (list (cdr (assoc 10 (entget cp))))))

    (setq i (1+ i))

    )

    (setq stp (vlax-curve-getStartPoint cv2) endp (vlax-curve-getEndPoint cv2))

    (if (> (distance stp (nth 0 p2list)) (distance endp (nth 0 p2list)))

    (setq p2list (append (list endp) p2list (list stp)))

    (setq p2list (append (list stp) p2list (list endp)))

    )

    (command "erase" ent2 "")

    (if (> (distance (nth 0 p1list) (nth 0 p2list)) (distance (nth 0 p1list) (nth (- num 2) p2list)))

    (setq p2list (reverse p2list))

    )

    (setq i 0 p3list nil)

    (while (and (setq cp (nth i p1list)) (setq cp1 (nth i p2list)))

    (setq p3 (list (* (+ (car cp) (car cp1)) 0.5) (* (+ (cadr cp) (cadr cp1)) 0.5)))

    (setq p3list (append p3list (list p3)) i (1+ i))

    )(command "undo" "be")

    (setq temposm (getvar "osmode"))

    (setvar "osmode" 0)

    (setq i 2 p1 (nth 0 p3list) cp (nth 1 p3list))

    (command "pline" (trans p1 0 1) (trans cp 0 1) "")

    (setq ent1 (entlast) p1 cp)

    (while (setq cp (nth i p3list))

    (command "line" (trans p1 0 1) (trans cp 0 1) "")

    (command "pedit" ent1 "J" (entlast) "" "")

    (setq p1 cp i (1+ i))

    )

    (setvar "osmode" temposm)(command "undo" "e")

    (princ)

    )

    这种方法相对来说更简单,能很快生成一个近似中心线来,这段代码生成的是一个多段线。

    谈家具【微信公众号:H90TJJ】采用BY-NC-SA协议进行授权 , 转载请注明:来自谈家具(www.9tjj.com):如何画两条样条线间中心线之三:CAD插件/Lisp编程法!

    展开全文
  • 下面学习啦小编给大家整理了更关于cad画两条平行线中线的方法,希望大家喜欢。cad画两条平行线中线的方法步骤:cad画两条平行线中线的方法一1、很简单,在两条平行线之间再“offset”一条平行线,与俩条平行...

    在CAD中,如何画两条平行线的中心线?下面学习啦小编给大家整理了更多关于cad画两条平行线的中线的方法,希望大家喜欢。

    cad画两条平行线的中线的方法步骤:

    cad画两条平行线的中线的方法一

    1、很简单,在两条平行线之间再“offset”一条平行线,与俩条平行线等距。

    2、在中间平行线上任一点为圆心,定距离为直径做圆,圆与两条平行线的交点形成圆之直径,该直径就是你需要的线段。

    cad画两条平行线的中线的方法二

    在任意一条线上定一点为圆心,定距离为半径做圆,与另一条线的两个交点与圆心的连线就是定距离半径,同样是你所需要的线段

    扩展1:cad画两条平行线的的方法步骤

    1,如果是和已存在的一条线平行,就用偏移、复制这些命令,都能绘制出跟开始那条线平行的线 2,如果重新绘制平行线,方法就很多了。

    一,你可以用多线命令 ML,设置好比例,绘制的就是平行线。

    二,绘制第一条线时,先指定和坐标轴的角度,然后绘制第二条线也指定一样的角度,两条线就是平行的。

    三,转到1去。

    扩展2:用cad快速画连接两条平行直线的半圆弧

    1运行cad,在图框内任意画两条相离且不平行的线段。

    2点击图框右侧工具栏中倒角图标。

    3然后在图框中依次选中两条直线。

    4点击完两条直线后,一个连接两条平行线的半圆弧就完成了

    w完成

    展开全文
  • 计算空间中两线段之间的距离

    千次阅读 2020-01-22 21:37:33
    最近在建立气凝胶的有限元模型中需要计算每根纤维之间的距离,最初参考的篇文章... 文章2),但忽略了理论推导,导致在用参数 ttt 描述两线段的地方出现了一些错误!篇文章都不能很好的准确表示直线。 ...

    最近在建立气凝胶的有限元模型中需要计算每两根纤维(线段)之间的距离,最初参考的两篇文章确实提供了关于一些数值方法的计算思路(文章1 && 文章2),但忽略了线段距离问题的理论推导,导致无法用参数 t t t 正确描述两目标线段!所求得的结果错误。本文从理论推导和程序实现两方面来说明求空间线段之间距离的方法。

    理论推导

    空间直线的参数方程

    如果一个非零向量平行于一条已知直线,这个向量就叫做这条直线的方向向量
    由于过空间一点可作而且只能作一条直线平行于一已知直线,所以当直线 L L L上一点 M 0 ( x 0 , y 0 , z 0 ) M_{0}\left(x_{0},y_{0},z_{0}\right) M0(x0,y0,z0)和它的一方向向量 s = ( m , n , p ) \boldsymbol{s}=\left(m,n,p\right) s=(m,n,p)为已知时,直线 L L L的位置就完全确定了。下面我们来建立这直线的方程。图1
    设点 M ( x , y , z ) M\left(x,y,z\right) M(x,y,z)是直线 L L L上的任意一点,那么向量 M 0 M → \overrightarrow{M_{0}M} M0M L L L的方向向量 s \boldsymbol{s} s平行(如上图所示)。所以两向量的对应坐标成比例,由于 M 0 M → = ( x − x 0 , y − y 0 , z − z 0 ) , s = ( m , n , p ) \overrightarrow{M_{0}M}=\left(x-x_{0},y-y_{0},z-z_{0}\right),\boldsymbol{s}=\left(m,n,p\right) M0M =(xx0,yy0,zz0)s=(m,n,p),从而有
    x − x 0 m = y − y 0 n = z − z 0 p \frac{x-x_{0}}{m}=\frac{y-y_{0}}{n}=\frac{z-z_{0}}{p} mxx0=nyy0=pzz0

    反过来,如果点 M M M不在直线上,那么由于 M 0 M → \overrightarrow{M_{0}M} M0M s \boldsymbol{s} s不平行,这两向量的对应坐标就不成比例。因此上式方程组就是直线L的方程,叫做直线的对称式方程点向式方程

    由直线的对称式方程容易导出直线的参数方程。如设

    x − x 0 m = y − y 0 n = z − z 0 p = t \frac{x-x_{0}}{m}=\frac{y-y_{0}}{n}=\frac{z-z_{0}}{p}=t mxx0=nyy0=pzz0=t

    那么
    { x = x 0 + m t y = y 0 + n t z = z 0 + p t t ∈ ( − ∞ , + ∞ ) \begin{cases} \begin{array}{c} x=x_{0}+mt\\ y=y_{0}+nt\\ z=z_{0}+pt \end{array} & t\in\left(-\infty,+\infty\right)\end{cases} x=x0+mty=y0+ntz=z0+ptt(,+)

    上式就是直线的参数方程

    线段的参数方程

    A ( x 1 , y 1 , z 1 ) A\left(x_{1},y_{1},z_{1}\right) A(x1,y1,z1) B ( x 2 , y 2 , z 2 ) B\left(x_{2},y_{2},z_{2}\right) B(x2,y2,z2)为线段 L L L的两端点,则线段 L L L的方向向量 s = ( x 2 − x 1 , y 2 − y 1 , z 2 − z 1 ) \boldsymbol{s}=\left(x_{2}-x_{1},y_{2}-y_{1},z_{2}-z_{1}\right) s=(x2x1,y2y1,z2z1),点 M ( x , y , z ) M\left(x,y,z\right) M(x,y,z)是线段 L L L上的任意一点,则线段的参数形式为

    { x = x 1 + ( x 2 − x 1 ) t y = y 1 + ( y 2 − y 1 ) t z = z 1 + ( z 2 − z 1 ) t t ∈ [ 0 , 1 ] \begin{cases} \begin{array}{c} x=x_{1}+\left(x_{2}-x_{1}\right)t\\ y=y_{1}+\left(y_{2}-y_{1}\right)t\\ z=z_{1}+\left(z_{2}-z_{1}\right)t \end{array} & t\in\left[0,1\right]\end{cases} x=x1+(x2x1)ty=y1+(y2y1)tz=z1+(z2z1)tt[0,1]

    线段之间距离的数值解法

    线段之间距离的数值解法是将参数 t t t 在区间 [ 0 , 1 ] [0,1] [0,1] 上均匀离散,每个 t t t 的取值,对应线段上的一个点。将求线段间的距离转化为求两线段上点的距离集合的最小值。(两线段上点的距离集合是指 a a a 线段的每个离散点与 b b b 线段上的所有离散点之间的距离,若设 a a a 线段上的离散点个数为 m m m b b b 线段上的离散点个数为 n n n ,则两线段上点的距离集合元素的个数为: m × n m\times n m×n)。该方法所求出的线段之间的距离为近似值,所求结果的精度取决于线段上离散点的数量。

    程序实现

    double LinesDistance_another_method(double *line1,double *line2)
    {
    	int i,j,m,n;
    	double *t1,*t2,*x1,*y1,*z1,*x2,*y2,*z2,**juli,min_value;
    	double DirectionVector_m1,DirectionVector_n1,DirectionVector_p1;
    	double DirectionVector_m2,DirectionVector_n2,DirectionVector_p2;
    	t1 = new double [11];
    	t2 = new double [11];
    	x1 = new double [11];
    	x2 = new double [11];
    	y1 = new double [11];
    	y2 = new double [11];
    	z1 = new double [11];
    	z2 = new double [11];
    	DirectionVector_m1=line1[3]-line1[0];
    	DirectionVector_n1=line1[4]-line1[1];
    	DirectionVector_p1=line1[5]-line1[2];
    	// 	printf("line1: \n");
    	// 	printf("x1=%lf,x2=%lf\n",line1[0],line1[3]);
    	// 	printf("x2-x1=%lf\n",DirectionVector_m1);
    	for (i = 0;i < 11;i++)
    	{
    		t1[i]=0.1*i;
    		/*		printf("t1[%d]=%lf\n",i,t1[i]);*/
    	}
    
    	for (i = 0;i < 11;i++)
    	{
    		x1[i]=line1[0]+DirectionVector_m1*t1[i];
    		y1[i]=line1[1]+DirectionVector_n1*t1[i];
    		z1[i]=line1[2]+DirectionVector_p1*t1[i];
    		/*		printf("x1[%d]=%lf\n",i,x1[i]);*/
    	}
    
    	DirectionVector_m2=line2[3]-line2[0];
    	DirectionVector_n2=line2[4]-line2[1];
    	DirectionVector_p2=line2[5]-line2[2];
    	// 	printf("line1: \n");
    	// 	printf("x1=%lf,x2=%lf\n",line2[0],line2[3]);
    	// 	printf("x2-x1=%lf\n",DirectionVector_m2);
    	for (i = 0;i < 11;i++)
    	{
    		t2[i]=0.1*i;
    		/*		printf("t2[%d]=%lf\n",i,t2[i]);*/
    	}
    
    	for (i = 0;i < 11;i++)
    	{
    		x2[i]=line2[0]+DirectionVector_m2*t2[i];
    		y2[i]=line2[1]+DirectionVector_n2*t2[i];
    		z2[i]=line2[2]+DirectionVector_p2*t2[i];
    		/*		printf("x2[%d]=%lf\n",i,x2[i]);*/
    	}
    
    	n=11;//n=length(t1);
    	m=11;//m=length(t2);
    	juli = new2DDouble(n,m);
    	for (i = 0;i < n;i++)
    	{
    		for (j = 0;j < m;j++)
    		{
    			juli[i][j]=sqrt(pow((x2[j]-x1[i]),2)+pow((y2[j]-y1[i]),2)+pow((z2[j]-z1[i]),2));
    		}
    	}
    	min_value=juli[0][0];
    	for (i = 0;i < n;i++)
    	{
    		for (j = 0;j < m;j++)
    		{
    			if (min_value>juli[i][j])
    			{
    				min_value=juli[i][j];
    			}
    		}
    	}
    
    	freeDoubleArray2(juli,n);
    	juli = NULL;
    	delete [] t1;
    	t1 = NULL;
    	delete [] t2;
    	t2 = NULL;
    	delete [] x1;
    	x1 = NULL;
    	delete [] x2;
    	x2 = NULL;
    	delete [] y1;
    	y1 = NULL;
    	delete [] y2;
    	y2 = NULL;
    	delete [] z1;
    	z1 = NULL;
    	delete [] z2;
    	z2 = NULL;
    
    	return min_value;
    }
    
    double **new2DDouble(int col,int lin)
    {
    	double **newArray;
    
    	newArray = new double *[col];
    	for(int i=0;i<col;i++)
    	{  
    		newArray[i]=new double[lin];
    	}
    
    	for(int i=0;i<col;i++)
    	{  
    		for(int j=0;j<lin;j++)
    		{
    			newArray[i][j]=0.0;
    		}
    	}
    
    	return newArray;
    }
    
    void freeDoubleArray2(double **Array,int NIFF0)
    {
    	int i;
    
    	for(i=0;i<NIFF0;i++)
    	{
    		delete [] Array[i];				
    	}
    	delete [] Array;
    	Array = NULL;
    }
    

    方法的验证

    在纤维组成的气凝胶模型中,为了使纤维之间能够连接到一起,就需要严格控制纤维之间的距离。所以引用这里的求线段之间距离的方法,来筛选出满足距离要求的纤维。那么若纤维之间不能很好的相连,则说明距离求解有误。下图为气凝胶模型的一小部分结构,对其进行有限元的模态分析来检验模型的连接状态。由其云图结果可知该模型已经连接成为一整体,该方法有效!在这里插入图片描述

    展开全文
  • opencv求解两条直线的交点

    千次阅读 2018-12-09 11:46:16
    假设现在有一个点集,需要拟合出最能够表达点集轮廓的几直线,并直线之间的交点。 从点集中拟合直线可以采用的方法:随机抽样一致性(RANSAC),霍夫变换(though transform) c++ 程序代码 /** @brief 计算直线...

    假设现在有一个点集,需要拟合出最能够表达点集轮廓的几条直线,并求直线之间的交点。
    从点集中拟合直线可以采用的方法:随机抽样一致性(RANSAC),霍夫变换(though transform)

    思路1

    利用点斜式表达直线,然后求解两条直线组成的方程组。
    { y = k 1 ∗ x + b 1 y = k 2 ∗ x + b 2 \begin{cases} y = k1 * x + b1 \\ y = k2 * x + b2 \end{cases} {y=k1x+b1y=k2x+b2

    • 缺点
      通过比较两条直线的斜率来判断两条直线是否平行,但是直线垂直时,斜率无穷大,无法比较两条直线。
    	/** @brief 计算直线的交点
    	@param lines 直线:Vec4d=(vx, vy, x0, y0), where (vx, vy) is a normalized vector collinear to the line and (x0, y0) is a point on the line.
    	@param crossPoints 保存直线的交点
    	@param mask 掩膜
    	*/
    	void crossPointsOfLines(std::vector<cv::Vec4d>& lines, std::vector<cv::Point2f> &crossPoints, int nPoints, cv::Mat& mask)
    	{
    	crossPoints.clear();
    	for (int i = 0; i < lines.size() && crossPoints.size() < nPoints; i++)
    	{
    		for (int j = i + 1; j < lines.size() && crossPoints.size() < nPoints; j++)
    		{
    
    			float ka = (float)lines.at(i)[1] / float(lines.at(i)[0] + 0.000001f);//slope of LineA 
    			float kb = (float)lines.at(j)[1] / float(lines.at(j)[0] + 0.000001f);//slope of LineB
    			//if (std::abs(std::abs(ka) - std::abs(kb)) > 1.0) //two lines are not probably parallel
    			if ((std::abs(ka) > 1) && (std::abs(kb) < 1) || (std::abs(ka) < 1) && (std::abs(kb) > 1))//two lines are not probably parallel
    			{
    				cv::Point2d ptA(lines.at(i)[2], lines.at(i)[3]);
    				cv::Point2d ptB(lines.at(j)[2], lines.at(j)[3]);
    				cv::Point2f crossPoint;
    				crossPoint.x = float(ka*ptA.x - ptA.y - kb*ptB.x + ptB.y) / float(ka - kb);
    				crossPoint.y = float(ka*kb*(ptA.x - ptB.x) - kb*ptA.y + ka*ptB.y) / float(ka - kb);
    				crossPoints.push_back(crossPoint);
    #ifdef _DEBUG
    				cv::circle(mask, crossPoint, 2, cv::Scalar(0, 0, 255), -1, cv::FILLED);
    #endif
    			}
    
    		}
    	}
    
    	if (crossPoints.size() < nPoints){
    		LOG(ERROR) << type() << "::crossPointsOfLines: " << "cross points is less than parameter nPoints.";
    	}
    
    }
    

    本函数使用的直线是opencv函数fitline从点集中拟合出来的直线,通过平行向量(vx,vy)和一个点(x,y)来表示直线。
    本函数主要应用于两条直线平行或者垂直的情况,所以我通过斜率是否大于1,判断是否平行。严格来说并不正确,所有没有复用性。

    思路2

    使用通用的直线表达方法,然后求解方程组。
    { a 1 ∗ x + b 1 ∗ y = c 1 a 2 ∗ x + b 2 ∗ y = c 2 \begin{cases} a1 * x + b1 *y = c1 \\ a2 * x + b2 *y = c2 \end{cases} {a1x+b1y=c1a2x+b2y=c2

    输入直线为:Vec4d=(vx, vy, x0, y0), 即 x − x 0 y − y 0 = V x V y \frac{x - x0}{y-y0} =\frac{ Vx}{Vy} yy0xx0=VyVx ,求解方程组可得交点。
    通过方向向量判断直线是否垂直,避免斜率无穷大的情况。

    • 缺点
      提前判断,代码比较乱;
    	/** @brief 计算直线的交点
    	@param lines 直线:Vec4d=(vx, vy, x0, y0), where (vx, vy) is a normalized vector collinear to the line and (x0, y0) is a point on the line.
    	@param crossPoints 保存直线的交点
    	@param mask 掩膜
    	*/
    bool crossPointsOfLines(std::vector<cv::Vec4d>& lines, std::vector<cv::Point2f> &crossPoints, int nPoints, cv::Mat& mask)
    {
    	crossPoints.clear();
    	for (int i = 0; i < lines.size() && crossPoints.size() < nPoints; i++)
    	{
    		const cv::Vec4d lineA = lines.at(i);
    		bool isVecticalA = std::abs(lineA[0]) < 0.02;
    		bool isHorizontalA = std::abs(lineA[1]) < 0.02;
    		for (int j = i + 1; j < lines.size() && crossPoints.size() < nPoints; j++)
    		{
    			const cv::Vec4d lineB = lines.at(j);
    			bool isVecticalB = std::abs(lineB[0]) < 0.02;
    			bool isHorizontalB = std::abs(lineB[1]) < 0.02;
    			if ((isVecticalA && isVecticalB) || (isHorizontalA && isHorizontalB) )//两条线都垂直,或者平行
    			{
    				continue;
    			}
    
    			cv::Point2f crossPoint;
    			auto calcB = [&lines](int index)->double {
    				return  lines.at(index)[0] * lines.at(index)[3] - lines.at(index)[1] * lines.at(index)[2];// B = Vx * Y - Vy * X
    			};
    
    			//auto calcCrossPoint = [&](int vIndex)->cv::Point2f { //};
    			if (isVecticalA )
    			{
    				crossPoint.x = lineA[2];  // x = -( Vx * Y - Vy * X)= X
    				if (isHorizontalB)
    				{
    					crossPoint.y = lineB[3];  // y = Vx * Y - Vy * X = Y
    				}
    				else
    				{
    					crossPoint.y = (calcB(j) + lineB[1] * crossPoint.x) / lineB[0]; // y = (B + Vy * x)/ Vx
    				}
    				crossPoints.push_back(crossPoint);
    			}
    			else if (isVecticalB)
    			{
    				crossPoint.x = lineB[2];  // x = -( Vx * Y - Vy * X) = X
    				if (isHorizontalA)
    				{
    					crossPoint.y = lineA[3];  // y = Vx * Y - Vy * X = Y
    				}
    				else
    				{
    					crossPoint.y = (calcB(i) + lineA[1] * crossPoint.x) / lineA[0]; // y = (B + Vy * x)/ Vx
    				}
    				crossPoints.push_back(crossPoint);
    			}
    			else
    			{
    				float det = (lineA[0] * lineB[1] - lineB[0] * lineA[1]);
    				crossPoint.x = (lineB[0] * calcB(i) - lineA[0] * calcB(j)) / det;
    				crossPoint.y = (lineB[1] * calcB(i) - lineA[1] * calcB(j)) / det;
    				crossPoints.push_back(crossPoint);
    			}
    #ifdef _DEBUG
    			cv::circle(mask, crossPoint, 2, cv::Scalar(0, 0, 255), -1, cv::FILLED);
    #endif
    		}
    	}
    
    	if (crossPoints.size() < nPoints){
    		return false;
    	}
    	return true;
    }
    
    

    思路三

    使用矩阵来表达直线组成的方程组,矩阵无解的情况就对应直线平行。
    两条直线组成方程组
    { a 1 ∗ x + b 1 ∗ y = c 1 a 2 ∗ x + b 2 ∗ y = c 2 \begin{cases} a1 * x + b1 *y = c1 \\ a2 * x + b2 *y = c2 \end{cases} {a1x+b1y=c1a2x+b2y=c2
    求解得
    { x = c 1 ∗ b 2 − c 2 ∗ b 1 a 1 ∗ b 2 − a 2 ∗ b 1 y = a 1 ∗ c 2 − a 2 ∗ c 1 a 1 ∗ b 2 − a 2 ∗ b 1 \begin{cases} x = \frac{c1*b2 - c2*b1}{a1*b2-a2*b1} \\ y = \frac{a1*c2 - a2*c1}{a1*b2-a2*b1} \end{cases} {x=a1b2a2b1c1b2c2b1y=a1b2a2b1a1c2a2c1


    D = ∣ a 1 b 1 a 2 b 2 ∣ D 1 = ∣ c 1 b 1 c 2 b 2 ∣ D 2 = ∣ a 1 c 1 a 2 c 2 ∣ D = \left| \begin{array} {ccc} a1&b1\\ a2&b2 \end{array} \right| \\ D1 = \left| \begin{array} {ccc} c1&b1\\ c2&b2 \end{array} \right| \\ D2 = \left| \begin{array} {ccc} a1&c1\\ a2&c2 \end{array} \right| D=a1a2b1b2D1=c1c2b1b2D2=a1a2c1c2

    x = D 1 D y = D 2 D x = \frac{D1}{D} y = \frac{D2}{D} x=DD1y=DD2

    void crossPointsOfLines(std::vector<cv::Vec4d>& lines, std::vector<cv::Point2f> &crossPoints)
    {
    	for (int i = 0; i < lines.size(); i++)
    	{
    		const cv::Vec4d& lineA = lines.at(i);
    		for (int j=i+1;j < lines.size();j++)
    		{
    			const cv::Vec4d& lineB = lines.at(j);
    			//double cos = lineA[0] * lineB[0] + lineA[1] * lineB[1];// cos a = A^T * B ;A,B为单位向量 
    			//if (std::abs(cos) > 0.99 ) // 两条直线几乎平行,没有交点
    			//{
    			//	continue;
    			//}
    
    			// linaA: a1 * x + b1 * y = c1
    			// linaB: a2 * x + b2 * y = c2
    			float a1 = -lineA[1];
    			float b1 = lineA[0];
    			float c1 = lineA[0] * lineA[3] - lineA[1] * lineA[2];
    
    			float a2 = -lineB[1];
    			float b2 = lineB[0];
    			float c2 = lineB[0] * lineB[3] - lineB[1] * lineB[2];
    
    			/*		| a1 b1 |            | c1 b1 |       | a1 c1 |
    				D = | a2 b2 |       D1 = | c2 b2 |  D2 = | a2 c2 |
    			*/ 
    			float Det = a1*b2 - a2 *b1;
    			float Det1 = c1*b2 - c2*b1;
    			float Det2 = a1*c2 - a2*c1;
    			if (std::abs(Det) < 0.001) //两条直线平行,方程组无解
    			{
    				continue;
    			}
    			cv::Point2f pt = { Det1 / Det, Det2 / Det };
    			crossPoints.push_back(pt);
    		}
    	}
    }
    

    参考文献

    OpenCV找任意两条直线的交点
    OpenCV找直线及直线的交点
    随机抽样一致性算法(ransac)

    求取两条直线的交点坐标

    谈谈"求线段交点"的几种算法(js实现,完整版)

    在OpenCV中求解两条直线的交点

    展开全文
  • 导语:提到斜边,大多数人都知道,有人问直角三角形斜边长度,当然了,还有人问直角三角形斜边公式计算器,这到底是咋回事?实际上直角三角形斜边公式计算器呢,接下来小编为大家分享直角三角形斜边公式计算器,...
  • 精彩,请点击上方蓝字关注我们!感谢您关注“初中数学”公众号,还未关注的请点击上方蓝字“初中数学”关注数姐,获取更知识方法。每天下午6点,与您不见不散!数姐说在初中三角形问题集中体现在“全等”和...
  • 要利用rgrouting实现像QGIS那样求任意两点间的最短路径,可以按照以下步骤使用pl/pgsql进行自定义函数:1 函数的参数为:_myShortPath(startxfloat, starty float,endx float,endy float,costfile varchar),前四个...
  • 空间中2线段的最短距离

    热门讨论 2013-02-07 15:06:54
    有讲解 有代码 根据数学公式直接改为代码!线段到线段的最短距离,点到线段的最短距离!
  • WPF/UWP 中提供的 Path 类可以为我们绘制几乎所有可能的矢量图形。但是,如果这些矢量图形可以以动画的形式播放...SVG技术入门:如何画出一会动的线 – WEB骇客 c# - Getting Geometry length - Stack Overflow
  • 火线 零线 中线 地线

    千次阅读 2010-10-22 13:11:00
    火线 零线 中线 地线[ 2010-8-29 2:20:00 | By: zydlyq ] 首先你要知道电为什么分为火线.<也叫相线>零线<也叫中性线>和接地线.<也叫保护线>是从那里来的.各起什么作用的. 电自然是从发电机出来的这个大家...
  • 使用pgrouting求任意两点的最短路径

    千次阅读 2013-11-04 20:40:55
    要利用rgrouting实现像QGIS那样求任意两点间的最短路径,可以按照以下步骤使用pl/pgsql进行自定义函数: 1 函数的参数为:_myShortPath(startxfloat, starty float,endx float,endy float,costfile varchar),前四个...
  • 导语:提到斜边,大多数人都知道,有人问直角三角形斜边长度,当然了,还有人问直角三角形斜边公式计算器,这到底是咋回事?实际上直角三角形斜边公式计算器呢,接下来小编为大家分享直角三角形斜边公式计算器,...
  • 在具有曲线的公路,铁路线形中,如何计算中桩、边桩坐标,计算竖曲线高程等是一个繁琐的过程,需要进行大量的、复杂的计算,且容易出错。为此,就需要借用相关软件来提高速度和准确性,而excelvba计算程序作为一款...
  • 角平分线

    千次阅读 2014-05-06 14:37:56
    1. 已知直线方程 A(x1, y1) B(x2,y2) c(x3,y3)
  • 求任意多边形面积与重心的算法

    千次阅读 2018-07-15 11:50:57
    题目地址http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=3多边形重心问题... (第一个和最后一个连接),所有线段不和其他线段相交,但是可以重合,可得到一个多边形或一线段或一个多边形和一个线段的...
  • 详解样条曲线(上)(包含贝塞尔曲线)

    千次阅读 多人点赞 2020-08-06 00:20:03
    样条曲线(Spline Curves) ... 贝塞尔曲线(Bézier curve)1.1 直线表示(2 points)1.2 抛物线三切线定理(3 points)1.3 通用公式1.4 代码实现3. 曲线连续性描述4. B样基函数(B-Spline Bas
  • 而计算平面上任意两点之间的距离最著名的便是勾股定理: double PointDistance(const Point& p1, const Point& p2) { return std::sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ); } 3、点与多边形的...
  • OC和OD门、线与和线

    千次阅读 2021-01-17 04:39:53
    一.什么是OC、OD集电极开路...一般用于线或、线与,也有的用于电流驱动。open-drain是对mos管而言,open-collector是对双极型管而言,在用法上没啥区别。开漏形式的电路有以下几个特点:1.利用外部电路的驱动能力,...
  • 1 面的定义 三维空间中的平面由个量确定: ...2.1取面与面的交线,已知条件:法向量和已知点 2.2公式推导: 平面1:a1x+b1y+c1z+d1=0;平面2:a2x+b2y+c2z+d2=0 平面法向量;n1=(a1,b1,c1),n2=(a
  • 在上述代码中,我们将plot的执行结果赋值给变量名为p的变量,他是一个3✖1的Line数组: 假设此时我对于第三曲线y3-x的特征不满意,想要把线的宽度改为2榜,我们只需要修改变量p的值即可,下面给出种写法供读者...
  • 初中三年数学几何公式、定理梳理,今天分享给大家,家长可以为孩子转发,让孩子的几何学习更方便些。1.过两点有且只有一条直线2.两点之间线段最短3....如果两条直线都和第三条直线平行,这两条直线也互相平行9....
  • 中心线大概有几种方法:1根据点或面编号(要求编号规整),2根据UV计算(要求UV规整) 还有就是这篇提到用变形模型生成线,不同方法各有优缺点,可根据模型特点使用 思路: 1把模型往里缩,变得很细,圆滑 2,...
  • 我们可以以有种方式来设置渐变线的方向: 1、声明渐变所采用的角度, 2、使用关键字,告诉浏览器渐变从哪里开始。 在上述的例子中,我们告诉它从右边开始向左边,这相当于角度“-90deg”。所以这会产生相同的结果...
  • 直角三角形斜边上的高等于两条直角边的62616964757a686964616fe58685e5aeb931333431353330乘积除以斜边的商。例如:直角三角形的两个直角边分别为a和b,斜边为c,那么,斜边上的高等于两条直角边的乘积ab除以斜边c...
  • 变形2.如图,是正方体的平面图...已知空间四边形ABCD各边长与对角线都相等,异面直线AB与CD所成的角的大小.解:分别取AC、AD、BC的中点P、M、N,连结PM、PN,由三角形中位线性质知PN∥AB,PM∥CD,于是∠MPN就是异面直线A...
  • AD各种布线方法总结

    千次阅读 2018-04-10 16:00:21
    https://blog.csdn.net/tq384998430/article/details/781340491.常规布线:不详细说了,是个人就知道怎么弄。...2. 总线式布线:通俗的讲就是多条网络同时布线的问题。具体方法是,按住SHIFT,然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,758
精华内容 703
关键字:

任意两条多段线求中线