使用Matlab计算两条线的交点及三角形垂心

使用Matlab计算两条线的交点及三角形垂心1、我用了12个点,每两个点一条线,能组成6条线;2、每两条线相交于一点,一共有3个点;3、3个点构成了三角形的三个顶点,然后再根据三个顶点计算三角形的垂心。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Matlab版本:R2016A

操作系统:Win-8

为了让整个流程比较完整,

1、我用了12个点,每两个点一条线,能组成6条线;

2、每两条线相交于一点,一共有3个点;

3、3个点构成了三角形的三个顶点,然后再根据三个顶点计算三角形的垂心。

1、现在先给出12个点的坐标(坐标可以随意设置,只要构成的线不是平行没有交点即可)

(294.94, 2959.12) (668.61, 1464.42)

(1678.70, 2848.19) (1731.25, 1914.00)
(540.16, 1978.22) (1731.25, 1919.83)

(335.80, 2778.12) (1696.22, 2678.86)
(1106.51, 892.23) (1404.28, 1832.25)

(1351.74, 880.56) (1591.12, 1820.58)

上述点是我从一幅图片里面点选出来的,将每个点的橫坐标放在一个数组里,纵坐标放在一个数组里,然后进行绘制:

X = [294.94, 668.61, 1678.70, 1731.25, 540.16, 1731.25, 335.80, 1696.22, 1106.51, 1404.28, 1351.74, 1591.12];  
Y = [2959.12, 1464.42, 2848.19, 1914.00, 1978.22, 1919.83, 2778.12, 2678.86, 892.23, 1832.25, 880.56, 1820.58];
plot(X, Y, '.');

Jetbrains全家桶1年46,售后保障稳定

绘制出来的结果如图所示:

使用Matlab计算两条线的交点及三角形垂心

将12个点组成6条线:

for i = 1: 6
    plot([X(2*i-1), X(2*i)], [Y(2*i-1), Y(2*i)]);
    hold on;
end

依次绘制出的线如图所示:

使用Matlab计算两条线的交点及三角形垂心

2、下面计算每两条线之间的交点(即上图所示的1,2一组,3,4一组,5,6一组计算其交点)
两条直线相交,必然需要求出两条直线的表达式,每条直线的表达式可以用 y = ax + b来表示,下面用matlab求解a和b两个变量,a即为直线的斜率,b为直线的截距。

a = zeros(6, 1);
b = zeros(6, 1);
for i = 1: 6
    a(i, 1) = (Y(2*i) - Y(2*i-1)) / (X(2*i) - X(2*i-1));
    b(i, 1) = Y(2*i) - a(i, 1) * X(2*i);
end

上述公式即求出了全部直线的方程式,下面计算它们两两之间的交点

points = zeros(3, 2);
for i = 1: 3
    % 两个直线方程之差的函数
    fun = @(x) (a(2*i-1, 1) * x + b(2*i-1, 1)) - (a(2*i, 1) * x + b(2*i, 1));
    
    % 两个直线方程之差函数值为0时的x值,由得到的x值计算y值
    points(i, 1) = fzero(fun, 2);
    points(i, 2) = a(2*i) * points(i, 1) + b(2*i, 1);
end

得到直线交点如图所示:

使用Matlab计算两条线的交点及三角形垂心

3、将三个点连线绘制,可以得到三角形

hold on;
plot([points(:, 1); points(1, 1)], [points(:, 2); points(1, 2)])

绘制得到结果如图所示:

使用Matlab计算两条线的交点及三角形垂心

计算三角形每条边的垂线,需要先计算每条线的斜率:

% 计算各个顶点连线的方程式
slope1_2 = (points(2, 2) - points(1, 2)) / (points(2, 1) - points(1, 1));
slope2_3 = (points(3, 2) - points(2, 2)) / (points(3, 1) - points(2, 1));
slope1_3 = (points(3, 2) - points(1, 2)) / (points(3, 1) - points(1, 1));
b1_2 = points(2, 2) - slope1_2 * points(2, 1);
b2_3 = points(3, 2) - slope2_3 * points(3, 1);
b1_3 = points(1, 2) - slope1_3 * points(1, 1);
slopevertical1_2 = -1 / slope1_2;
slopevertical2_3 = -1 / slope2_3;
slopevertical1_3 = -1 / slope1_3;

verticalb1_2 = points(3, 2) - slopevertical1_2 * points(3, 1);
verticalb2_3 = points(1, 2) - slopevertical2_3 * points(1, 1);
verticalb1_3 = points(2, 2) - slopevertical1_3 * points(2, 1);

这样就求出了三个边的垂线,下面对这三个垂线进行绘制,按照上面的方程计算出两个点,两个点的横坐标一个选择很小,一个选择很大,这样可以保证画出来的直线足够长,方便观察(这个方法似乎有些简单粗暴~~~~~~~~,不过还是能够绘制出来的)

% 设置预绘制直线的两个端点的X值
verticalLinePoints = zeros(6, 2)
for i = 1: 3
    verticalLinePoints(2*i-1, 1) = 0;
    verticalLinePoints(2*i, 1) = 10000;
    if i == 1
         slopevertical = slopevertical1_2;
         verticalb = verticalb1_2;
    elseif i == 2
         slopevertical = slopevertical2_3;
         verticalb = verticalb2_3;
    else
	 slopevertical = slopevertical1_3;
	 verticalb = verticalb1_3;
    end
    
   % 计算两个端点的y值
    verticalLinePoints(2*i-1, 2) = slopevertical * verticalLinePoints(2*i-1, 1) + verticalb;
    verticalLinePoints(2*i, 2) = slopevertical * verticalLinePoints(2*i, 1) + verticalb;
end

然后绘制所得结果(为了使图更加简洁,开始的点线都去掉了,仅保留了三角形)

hold on;	% 为了保留前面绘制的图像,使用hold on
plot(verticalLinePoints(1:2, 1), verticalLinePoints(1:2, 2));
plot(verticalLinePoints(3:4, 1), verticalLinePoints(3:4, 2));
plot(verticalLinePoints(5:6, 1), verticalLinePoints(5:6, 2));
axis equal;	% 使横纵轴单位统一

绘制得到结果如图所示:

使用Matlab计算两条线的交点及三角形垂心

由图或者基础几何可知,三条垂线交于一点,称之为垂心(中心),求垂心的方法与前面求两条线的交点的方法一样

fun = @(x) (slopevertical1_2 * x + verticalb1_2) - (slopevertical1_3 * x + verticalb1_3);
finalX = fzero(fun, 2);
finalY = slopevertical1_2 * finalX + verticalb1_2;
hold on;
plot(finalX, finalY, 'o');

至此,计算垂心的工作已经完成,对垂心进行绘制,绘制的结果如图所示:

使用Matlab计算两条线的交点及三角形垂心

代码下载地址:http://download.csdn.net/detail/zhangwellyear/9796085

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204267.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月8日 下午5:43
下一篇 2025年8月8日 下午6:15


相关推荐

  • C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托

    C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托泛型集合和ArrayList的装箱拆箱、常见的泛型类型、泛型类和泛型方法、泛型约束、泛型委托泛型很难理解?不然在接触的一个新的概念的时候,总会感觉难以理解,当你掌握并能熟练地使用的时候,发现这个概念其实简单的,我相信大多数码农都会有这种似曾相识的感觉。可能大多数人刚学习泛型的时候觉得很难理解,当然我也是这样的,所以便写下这篇文章加深一下对泛型的印象。

    2022年7月11日
    18
  • CSS入门学习笔记+案例

    CSS入门学习笔记+案例CSS入门学习一、CSS简介1、什么是CSSCSS:CascadingStyleSheet层叠样式表是一组样式设置的规则,用于控制页面的外观样式2、为什么使用CSS实现内容与样式的分离,便于团队开发样式复用,便于网站的后期维护页面的精确控制,让页面更精美3、CSS作用页面外观美化布局和定位二、基本用法1、CSS语法<head> <style> 选择器{ 属性名:属性值; 属性名:属性值; } </style>&l

    2022年5月2日
    44
  • C语言异或操作的妙用

    C语言异或操作的妙用如果想要交换 2 个变量 一般的做法是引入第三个变量 nbsp 例如 nbsp cpp nbsp viewplaincop nbsp nbsp a nbsp nbsp a nbsp nbsp b nbsp nbsp b nbsp temp nbsp nbsp nbsp 这样 2 个变量中的值就实现了交换 那能不能不引入其他变量就可以实现变量值的交换呢 答案是肯定的 用异或操作可以实现 有 2 种实现方法 本质上是一样的 法 1 nbsp cpp nbsp vi

    2026年3月17日
    2
  • smalldatetime mysql_SQLSERVER中datetime和smalldatetime类型分析说明「建议收藏」

    smalldatetime mysql_SQLSERVER中datetime和smalldatetime类型分析说明「建议收藏」datetime和smalldatetime代表日期和一天内的时间的日期和时间数据类型。MicrosoftSQLServer用两个4字节的整数内部存储datetime数据类型的值。第一个4字节存储basedate(即1900年1月1日)之前或之后的天数。基础日期是系统参考日期。不允许早于1753年1月1日的datetime值。第一个4字节:…

    2022年5月12日
    41
  • C语言switch语句的用法详解_c语言switch语句例题

    C语言switch语句的用法详解_c语言switch语句例题C语言虽然没有限制ifelse能够处理的分支数量,但当分支过多时,用ifelse处理会不太方便,而且容易出现ifelse配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:#includeintmain(){inta;printf(“Inputintegernumber:”);scanf(“%d”,&a);if(a==1){printf(“Mo…

    2022年8月30日
    4
  • 微信表情代码大全—一句话搞定

    微信表情代码大全—一句话搞定微信表情代码大全 一句话搞定 转载请注明 我的应用场景结果截图部分代码重磅技巧再也不需要对着网上的微信表情代码文档找寻自己想要的了 再也不用纠结继续找寻更全的文档了 真的只需要复制粘贴 我的应用场景微信服务号发送带表情的消息结果截图部分代码 Stringconten uD83C uDF89 欢迎关注 Alpha 小助手 uD83C uDF89 n

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号