计算直线交点与夹角方法

基于matlab求解初等几何问题

lyqmath

0 引言

在工程应用、科学计算等领域,计算两条直线的交点是一个较为基础的问题。一般的应该考虑到直线方程的写法和求解交点的方式。这里给出一个具体的处理方式,其基本思想是:首先基于给定的节点定义出直线一般方程,然后求解方程组得到直线方程参数,最后根据得到的两条直线来求解出交点。因此,问题的输入为四个已知节点,输出为由已定节点定义的直线的交点。

1 根据节点计算直线方程并求交点

已知两条直线的节点信息,要求计算出直线的方程与两直线的交点。采用直线的一般方程形式:Y = Ax + By + C,这里的ABC就是待求的直线方程参数。

代码

% By lyqmath

% DLUT School of Mathematical Sciences

% BLOGhttp://blog.csdn.net/lyqmath

clc; clear all; close all;

%% 符号变量

% 定义节点信息

syms x1 y1 x2 y2 x3 y3 x4 y4

% 定义参数信息

syms A B C

% 定义变量

syms x y

 

%% 计算A1B1A2B2

% 直线方程——节点1

eq1 = A*x1 + B*y1 + C;

% 直线方程——节点2

eq2 = A*x2 + B*y2 + C;

% 求解参数

sov1 = solve(eq1, eq2, A, B);

% 直线方程——节点3

eq3 = A*x3 + B*y3 + C;

% 直线方程——节点4

eq4 = A*x4 + B*y4 + C;

% 求解参数

sov2 = solve(eq3, eq4, A, B);

% 求解结果——直线1

A1 = simplify(sov1.A / C);

B1 = simplify(sov1.B / C);

% 求解结果——直线2

A2 = simplify(sov2.A / C);

B2 = simplify(sov2.B / C);

% 求解结果:

% A1 = (y1 - y2)/(x1*y2 - x2*y1);

% B1 = (-x1 + x2)/(x1*y2 - x2*y1);

% A2 = (y3 - y4)/(x3*y4 - x4*y3);

% B2 = (-x3 + x4)/(x3*y4 - x4*y3);

 

%% 求交点

% 直线方程1

eq1 = A1*x + B1*y + 1;

% 直线方程2

eq2 = A2*x + B2*y + 1;

% 求解方程组

sov = solve(eq1, eq2, x, y);

% 显示求解结果

pretty(eq1)

pretty(eq2)

pretty(sov.x)

pretty(sov.y)

结果

 

  

因此,根据输入的节点信息,可以得到两条直线方程与直线的交点公式。注意到Matlab做符号计算可能耗时较长,这里根据已有结果编写计算函数如下。

% By lyqmath

% DLUT School of Mathematical Sciences

% BLOGhttp://blog.csdn.net/lyqmath

function [px, py] = comput_intersec(line1, line2)

% 计算直线交点,直线为结构体,内容为两个节点信息

p1 = line1.point1; p2 = line1.point2; % 1条边的两点

p3 = line2.point1; p4 = line2.point2; % 2条边的两点

x1 = p1(1); y1 = p1(2);

x2 = p2(1); y2 = p2(2);

x3 = p3(1); y3 = p3(2);

x4 = p4(1); y4 = p4(2);

% 计算交点

px = (x1*x3*y2 - x2*x3*y1 - x1*x4*y2 + x2*x4*y1 - x1*x3*y4 + x1*x4*y3 + x2*x3*y4 - x2*x4*y3 )/...

    (x1*y3 - x3*y1 - x1*y4 - x2*y3 + x3*y2 + x4*y1 + x2*y4 - x4*y2);

py =  (x1*y2*y3 - x2*y1*y3 - x1*y2*y4 + x2*y1*y4 - x3*y1*y4 + x4*y1*y3 + x3*y2*y4 - x4*y2*y3 )/...

    (x1*y3 - x3*y1 - x1*y4 - x2*y3 + x3*y2 + x4*y1 + x2*y4 - x4*y2);

 

2 计算直线夹角

根据给定的节点,计算夹角信息,示意图如下。已知X1(x1, y1)X2(x2, y2)X3(x3, y3),计算直线X2X1X2X3的夹角信息。

根据向量内积,得到计算公式为:

theta1 = acosd(dot([x1-x2,y1-y2],[x3-x2,y3-y2])/(norm([x1-x2,y1-y2])*norm([x3-x2,y3-y2])));

其中,dot([x1-x2,y1-y2],[x3-x2,y3-y2])为计算内积,norm([x1-x2,y1-y2])、norm([x3-x2,y3-y2])为计算向量长度,acosd为计算以度为单位的夹角信息。

3 三角形几何

常见的,给定三个节点,要求计算三角形信息。可以根据本文方法来计算三角形的直线方程与夹角信息。

4 结论

基于matlab求解初等几何问题,可应用到不同领域作为前期或者后期处理。比如数字图像处理的直线性质分析等。往往直线的夹角信息等都可以对问题的解决有重要意义。

 

欢迎访问我的博客:http://blog.csdn.net/lyqmath

 

直角坐标与极坐标转换,相位相关 关于相关(correlation),在所有的信号处理的教材中基本都提到过。 相关,顾名思意,就是两个事物的相关性,在信号处理中,两个信号的卷积就是相关,可以用于表征了两个信号的相似程度。 关于图像的相位,我们知道,图像的频率域(傅里叶频谱)包含了模(amplitude)和相位(phase)信息,模包含的图像整体的灰度级信息,而相位信息包含了图像的变化的信息。可以说,相位是图像的DNA,不同图像,模有可能是相同的,但相位却是不同的。利用这一取相位的相关,就可以知道,图像之间的差别。 由于相关是通过卷积计算计算量大,所以,一般都是通过傅里叶频谱的内积,然后再做一次傅里叶逆变换就可以取。 如果幅图像是一致的(完全相同),那么他们的相位相关就是一个脉冲函数,脉冲位置在坐标,高度为1. 如果幅图像不一致,那么在相位相关里,最高的那个脉冲坐标,就是幅图像的位置偏移量,而脉冲的高度也会小于1. 但整个想为相关的能量值是守恒的,为1. 对于相位相关的应用,主要用于图像配准(image registration),由于相位信号,避免了图像中低频噪音的影响,在光照条件变化的应用环境表现突出,被广泛用于遥感,医学图像等领域。 除此之外,相位相关可以扩展到亚像素的匹配,着也是当今研究的一个热。由于相位相关的计算,需要3次傅里叶变换,即使目前的很多专用图像处理硬件中,已经嵌入傅里叶变换的硬件模块,但是研究者们,任然热衷于怎样减小傅里叶变换带来的计算量庞大问题。 相位相关用于估计图像的偏移量,是由C.D. Kuglin 和D.C.Hines在1975年提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值