matlab实现:已知两个点的坐标,需要在两点之间的连线上再加一些点,使得加点后,相邻两点间距不大于d。
==================产生以上问题的来源是我要生成一棵边长受限的steiner树,描述如下,给各位有兴趣的朋友参考:input:terminal点的坐标,距...
==================
产生以上问题的来源是我要生成一棵边长受限的steiner树,描述如下,给各位有兴趣的朋友参考:
input:terminal点的坐标,距离限制d
output:一棵以terminal为叶子节点的steiner树,使得:steiner点个数最小,并且任意两个点的间距不大于d。
我觉得实现以上东西的做法是
1、先生成terminal的最小生成树
2、然后检查每条边,边的长度如果大于d,则在这条边上加点,使得每两点的间距不大于d。
因为不太会matlab,所以第二步我不会弄。matlab里面怎么实现在边上加点,并且这些点的坐标要输出来。
===================
望matlab高手不吝赐教,在此先行谢过... 展开
产生以上问题的来源是我要生成一棵边长受限的steiner树,描述如下,给各位有兴趣的朋友参考:
input:terminal点的坐标,距离限制d
output:一棵以terminal为叶子节点的steiner树,使得:steiner点个数最小,并且任意两个点的间距不大于d。
我觉得实现以上东西的做法是
1、先生成terminal的最小生成树
2、然后检查每条边,边的长度如果大于d,则在这条边上加点,使得每两点的间距不大于d。
因为不太会matlab,所以第二步我不会弄。matlab里面怎么实现在边上加点,并且这些点的坐标要输出来。
===================
望matlab高手不吝赐教,在此先行谢过... 展开
展开全部
标记下 我做一半啦
x1=1
y1=1
x2=50
y2=50
d=1
%前面这些是要输入的坐标和距离
%X和Y两个矩阵就是所求的点的坐标
i=1;X(1)=x1;Y(1)=y1;
k=(y2-y1)/(x2-x1);
b=(x2*y1-x1*y2)/(x2-x1);
while ((Y(i)-y2)^2+(X(i)-x2))^2>d^2
X(i)=1/2/(1+k^2)*(2*k*Y(i)+2*X(i)-2*k*b+2*(2*k*Y(i)*X(i)-2*X(i)*k*b+2*b*Y(i)-Y(i)^2-b^2+d^2-k^2*X(i)^2+k^2*d^2)^(1/2));
if (x1-X(i))*(X(i)-x2) < 0
X(i)=1/2/(1+k^2)*(2*k*Y(i)+2*X(i)-2*k*b-2*(2*k*Y(i)*X(i)-2*X(i)*k*b+2*b*Y(i)-Y(i)^2-b^2+d^2-k^2*X(i)^2+k^2*d^2)^(1/2));
end
Y(i)=k*X(i)+b;
i=i+1;
X(i)=X(i-1);
Y(i)=Y(i-1);
end
x1=1
y1=1
x2=50
y2=50
d=1
%前面这些是要输入的坐标和距离
%X和Y两个矩阵就是所求的点的坐标
i=1;X(1)=x1;Y(1)=y1;
k=(y2-y1)/(x2-x1);
b=(x2*y1-x1*y2)/(x2-x1);
while ((Y(i)-y2)^2+(X(i)-x2))^2>d^2
X(i)=1/2/(1+k^2)*(2*k*Y(i)+2*X(i)-2*k*b+2*(2*k*Y(i)*X(i)-2*X(i)*k*b+2*b*Y(i)-Y(i)^2-b^2+d^2-k^2*X(i)^2+k^2*d^2)^(1/2));
if (x1-X(i))*(X(i)-x2) < 0
X(i)=1/2/(1+k^2)*(2*k*Y(i)+2*X(i)-2*k*b-2*(2*k*Y(i)*X(i)-2*X(i)*k*b+2*b*Y(i)-Y(i)^2-b^2+d^2-k^2*X(i)^2+k^2*d^2)^(1/2));
end
Y(i)=k*X(i)+b;
i=i+1;
X(i)=X(i-1);
Y(i)=Y(i-1);
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已联系发代码,满意请给分
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询