
% P=intp(X1,Y1,X2,Y2)
% 求两组离散点序列的交点
% X1,Y1为第一组的横纵坐标,X2,Y2为第二组横纵坐标,横坐标必须为有序数列。
% 返回值P为交点坐标,两列矩阵,第一列为横坐标,第二列为纵坐标。
function P=intp(X1,Y1,X2,Y2)
X1=X1(:);
% 变为列向量
X2=X2(:);
Y1=Y1(:);
Y2=Y2(:);
if max(X1)<min(X2) || max(X2)<min(X1)
P=[];
% 两个区间没有重叠,不可能有交点
return;
end
a=max(min(X1),min(X2));
b=min(max(X1),max(X2));
a1=find(X1>=a); a1=a1(1);
a2=find(X2>=a); a2=a2(1);
b1=find(X1<=b); b1=b1(end);
b2=find(X2<=b); b2=b2(end);
x=unique([X1(a1:b1); X2(a2:b2)]);
y1=interp1(X1,Y1,x,'linear');
y2=interp1(X2,Y2,x,'linear');
% 找出公共部分
d=y1-y2;
ind0=find(d==0);
% 差为0的是交点。
P1=[x(ind0), y1(ind0)];
d1=sign(d);
% 求符号,负数为-1,正数为1, 0为0
d2=abs(diff(d1));
ind1=find(d2==2);
% 相邻符号相差2的,交点在此区间内
P2=zeros(length(ind1),2);
for k=1:length(ind1)
i1=ind1(k);
i2=ind1(k)+1;
x1=x(i1);
x2=x(i2);
ya1=y1(i1);
ya2=y1(i2);
yb1=y2(i1);
yb2=y2(i2);
% 两条线段四个端点坐标
A=[ ya1-ya2, -(x1-x2)
yb1-yb2, -(x1-x2)]; % 二元一次方程组系数矩阵
B=[ (ya1-ya2)x1-(x1-x2)ya1
(yb1-yb2)x1-(x1-x2)yb1];
% 常数项矩阵
P2(k,:)=(A\\B)';
% 解方程组,得到交点坐标
end
P=[P1;P2];
% 两种情况的交点合并
P=sortrows(P,1);
% 按横坐标排序
% 函数到此结束,保存到intpm文件中
% 下面是接你的主程序来的,就是添在你画图那段程序后面
XA=AAAA;
YA=normpdf(AAAA,AA,AAA);
XB=BBBB;
YB=normpdf(BBBB,BB,BBB);
XC=CCCC;
YC=normpdf(CCCC,CC,CCC);
P1=intp(XA,YA,XB,YB);
% A,B交点,调用上面保存的那个intp函数
P2=intp(XB,YB,XC,YC);
% B,C交点
P3=intp(XC,YC,XA,YA);
% C,A交点
P=[P1;P2;P3];
% plot(XA,YA,XB,YB,XC,YC)
hold on
plot(P(:,1),P(:,2),'ro')
hold off
str=cell(size(P,1),1);
for k=1:size(P,1)
str{k}=sprintf(' (%22g,%22g)',P(k,1),P(k,2));
end
text(P(:,1),P(:,2),str)
% 主程序到此结束
我看这幅图像的外轮廓并不清晰
所以我的思路是, 先把外轮廓描清晰一点, 然后选取底边的像素,并用find函数进行查找。
close all; clear; clc;
img_hand = imread('handjpg');
subplot(2, 2, 1); imshow(img_hand); title('源图像');
% 使用一个合适的阈值把图像二值化
level = graythresh(img_hand);
img_hand = im2bw(img_hand, level);
subplot(2, 2, 2); imshow(img_hand); title('使用OTSU算法进行阈值化');
% 膨胀运算, 使外轮廓更加连贯(结构元素大小可以根据需要进行调节)
se = strel('disk',6);
img_hand = imdilate(img_hand, se);
subplot(2, 2, 3); imshow(img_hand); title('进行膨胀运算,连接轮廓中小的缝隙');
% 由于进行了膨胀运算,外轮廓很厚, 这里进行骨骼提取细化,直到外轮廓只有一个像素
img_hand = bwmorph(im2bw(img_hand), 'skel', Inf);
subplot(2, 2, 4); imshow(img_hand); title('骨骼提取细化');
img_hand(1:end-1, :) = []; % 只保留手最下边一行像素
find(img_hand) % 找到交叉掉位置
xy = inv([k1,1;k2,1])[b1;b2]
例如:
x=1:100;自变量的范围
k=find(abs(y1-y2)<1e-2); 查找Y1与Y2相等点的下表
x1=x(k);取y1与y2相等点的x坐标
y3=f(x1);求y1与y2值相等点的y坐标
plot(x1,y3,'dp') 标记交叉点。
扩展资料:
空间直线的方向用一个与该直线平行的非零向量来表示,该向量称为这条直线的一个方向向量。直线在空间中的位置, 由它经过的空间一点及它的一个方向向量完全确定。在欧几里得几何学中,直线只是一个直观的几何对象。在建立欧几里得几何学的公理体系时,直线与点、平面等都是不加定义的,它们之间的关系则由所给公理刻画。
参考资料来源:百度百科-直线方程
首先需要明确:用plot画图其实是折线图,即每相邻两点之间用直线连接。
画出图形来,从图中可见,有两个交点:
一个交点位于折线的最后一段,纵坐标已知为471,则横坐标易得x=y+25=496;
另一个交点位于点(334,324)和(361,323)连接的折线上,可以使用solve求解得到(9422/27, 8747/27)。
参考代码:
x=[1,113,334,361,440,964,964,1];
y=[1,107,324,323,400,400,471,471];
plot(x,y,'-')
x1=[0 1000];
y1=x1-25;
hold on
plot(x1,y1,'r')y2=471;
x2=y2+25;
[x3,y3]=solve('y=324+(323-324)/(361-334)','y=x-25');
x3=double(x3);y3=double(y3);
plot([x2, x3],[y2,y3],'mo')legend('plot数据','y=x-25', '交点',2)
x=0:10:10000;
y=100(x>0&x<=2865)+(286500 x>=2865);
plot(x,y);hold on,
y=909+0001282((x^2)/5184);
plot(x,y);
按上述语句画出图形,再用data cursor取交点坐标(2890,1196)
那要看你的两条曲线是不是已知函数表达式的——
1
对于两条曲线都是显示函数的,可以直接求出交点,然后用matlab绘点标注即可;
2
如果两条曲线至少有一条是隐函数描述的,那么可以用近似求根,比如fsolve,fzero等函数求交点。
如果两条中至少有一条是离散点连接起来的曲线,而其解析表达式未知。那么可以用下面的方法求,而且这种方法对于上面1
2都有效。
原理很简单,离散点依次相连形成的曲线,其交点都在两条小直线段上,利用计算几何学中的判断“两线段相交”的方法(快速排斥和跨立试验),然后经过两层循环依次求出每个线段跟另一条曲线的所有线段的交点。
具体实例在
>
如果知道两曲线的数学形式,最好数学上解方程组,求得交点
如果不知道,或者方程组不好解,只能求得近似交点,用判断语句
如两个曲线的坐标数组分别是(x1,y1),(x1,y2)(这个需要知道两个函数的交点的x范围是x1,且x1的步长足够小):find(abs(y1-y2)<=eps)
再有,如果纯粹是一些数据画的图,横坐标不同即(x1,y1),(x2,y2)
可以数据拟合两条曲线,用多项式拟合或指数拟合,或其他拟合,拟合出函数形式,解方程。
以上就是关于在MATLAB里用数值画的曲线怎么求其交点值并让其值在图上显示出来全部的内容,包括:在MATLAB里用数值画的曲线怎么求其交点值并让其值在图上显示出来、如何用MATLAB获取手图像与底边交点的坐标、matlab中如何求两直线交点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)