基于matlab求解初等几何问题
lyqmath
0 引言
在工程应用、科学计算等领域,计算两条直线的交点是一个较为基础的问题。一般的应该考虑到直线方程的写法和求解交点的方式。这里给出一个具体的处理方式,其基本思想是:首先基于给定的节点定义出直线一般方程,然后求解方程组得到直线方程参数,最后根据得到的两条直线来求解出交点。因此,问题的输入为四个已知节点,输出为由已定节点定义的直线的交点。
1 根据节点计算直线方程并求交点
已知两条直线的节点信息,要求计算出直线的方程与两直线的交点。采用直线的一般方程形式:Y = Ax + By + C,这里的A、B、C就是待求的直线方程参数。
代码
% By lyqmath
% DLUT School of Mathematical Sciences
% BLOG:http://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
%% 计算A1,B1,A2,B2
% 直线方程——节点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
% BLOG:http://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),计算直线X2X1与X2X3的夹角信息。
根据向量内积,得到计算公式为:
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