haoxiangmiao 发表于 2011-2-15 15:43:59

请高手指教,我如何实现我的算法 voronoi + B-spline

本帖最后由 haoxiangmiao 于 2011-2-15 15:57 编辑

我用Matlab 画一个Voronoi图
clear all
clc
mpt_init;
P = mpt_voronoi(rand(1000,2)); %用到mp tool
plot(P)

画voronoi图

问题:
1. 如何获得每个晶核(随机原点)的坐标,存在矩阵A中;
2. 与此晶核对应的直线,直线交点,数据存在矩阵B中;
3. 判断交点与晶核的距离, 距离>r 时,此交点的两条直线做B-spline曲线拟合;
4. 画出拟合曲线与未拟合直线所构成的图形 。


请高手指点,如果我叙述不够清楚,请指出,我及时改正。

liushuangq05 发表于 2011-2-15 16:43:44

rand('state',5);
x=rand(10,2);
=voronoin(x);
for i = 1:length(c)
if all(c{i}~=1)   % If at least one of the indices is 1,
                  % then it is an open region and we can't
                  % patch that.
patch(v(c{i},1),v(c{i},2),i); % use color i.
end
end
axis equal

楼主可以看看matlab自带的这段代码,里面的=voronoin(x); 是提取voronoi点的坐标和"围圈"关系的,这个可从patch(v(c{i},1),v(c{i},2),i); 这里头的patch函数可以看出来!

haoxiangmiao 发表于 2011-2-16 10:22:17

2# liushuangq05
感谢liushuangq05
patch语句,是创建补片图形函数, 因为=voronoin(x)生成的随机点数据储存在矩阵v和c中。

如二维

>> rand('state',111)
x = rand(1,10); y =rand(1,10);
= voronoin()
for i = 1:length(c)
if all(c{i}~=1)   % If at least one of the indices is 1,
                  % then it is an open region and we can't
                  % patch that.
patch(v(c{i},1),v(c{i},2),i); % use color i.
end
end
v =
       Inf       Inf
    0.4034    0.3131
    0.3333    0.4366
    0.6079    1.0095
    2.3933    0.6375
    0.5009    0.3122
    0.7548   -0.7226
    0.8368    0.1493
    0.5237    0.3213
    0.6184    0.6946
    0.8112    0.5251
    0.7034    0.3527
    0.6510    0.3111

c =
   
   
   
   
   
   
   
   
   
   

但是用随机函数产生的晶胞发散,所以我用到了mp tool.
工具中对随机点距离进行了限制,但是函数P的数据无从超找。
在workspace中也没有任何显示。
我应该去研究一下mp tool.
主要我是一个菜鸟,有一些对一些函数还不是很熟悉,希望大家指点。
指出我可能用到的函数,我自己去研究一下。提高我的课题速度。
在这里不胜感激。

liushuangq05 发表于 2011-2-16 13:31:20

"用随机函数产生的晶胞发散"这个我不是很理解.
一般的,只要创建voronoi图的离散数据如果不构成凸边界,那都会有比较明显的发散构造(就是外边界上的多边形(二维情况)向外延伸很长).
你不妨在生成的随机数的数集上再加点工夫,使这些生成的随机数的某个子集满足你的需求,不知道可否?

haoxiangmiao 发表于 2011-2-16 16:47:14

4# liushuangq05
恩,我读了 司良英 等的《基于Vorono i图的晶体塑性有限元多晶几何建模》
作者利用栅格法生成随机点,保证Voronoi晶包面积复合一定的分布规律。

我对这个分布没有具体要求,只要不出现特别大,或者特别小的晶核即可。

研究一下matlab 关于图形方面的知识。

haoxiangmiao 发表于 2011-2-18 13:02:38

本帖最后由 haoxiangmiao 于 2011-2-18 13:33 编辑

在这个算法中用到了ifelse语句,
if distance>r
Bspline(p)
else
在这里我不想做任何处理,我怎么表达?(求教)我用continue还是return??
end

lengyunfeng 发表于 2011-2-19 15:44:54

6# haoxiangmiao
if-else是条件判断语句,不够成循环,所以你可以不用else段,直接if...end就OK了。continue是循环语句中跳出本层循环,进入外层循环的语句,而return一般用在自定义函数里边,在你这儿都用不上。

haoxiangmiao 发表于 2011-2-21 09:10:32

7# lengyunfeng

这个问题清楚了,谢谢lengyunfeng。

请问我想编辑工具箱里的函数,或者把工具箱里的函数调出来。我应该用什么语句?

lengyunfeng 发表于 2011-2-21 12:43:21

8# haoxiangmiao
你直接用edit 后面跟上你要编辑的函数名就行了,只要你的工具箱文件夹在matlab的搜索路径里就能以matlab自带的文本编缉器打开并进行编缉。不过劝你在没弄清楚这个工具箱底层函数调用与架构的情况下,最好别去修改它,因为工具箱里边的函数彼此之间有相互调用关系,一旦你改了其中一个,可能导致与之相关的一系列函数都无法继续使用。

scott198510 发表于 2011-4-15 21:21:21

本帖最后由 scott198510 于 2011-4-15 21:27 编辑

matlab里面voronoi函数生成的韦恩图是在 坐标系里面搞的,得到的图形虽然 效果很好,但是他是划线的方法得到的,图形不能在数据基础上继续演变,我自己研究出来的按照voronoi 算法活动的图像 都是矩阵信息,可以演变 ,不过遗憾就是没有 voronoi 函数得到的图形边界光顺,附图

haoxiangmiao 发表于 2011-4-25 07:08:12

10# scott198510
我就是想要这些矩阵信息,呵呵
我现在需要求这些“细胞”的质心。
用什么函数呢?
请赐教

haoxiangmiao 发表于 2011-8-3 12:57:00

本帖最后由 haoxiangmiao 于 2011-8-3 13:49 编辑

我像继续在此提问:谁对Bspline 这个函数比较熟悉。或者有其他的函数?
bspline(t)
bspline(t,window)
pp = bspline(t)
我想实现基本功能。如图所示



我如何实现通过改变参数p.来改变曲线的形状?

希望能得到帮助。在线等待。sp=spap2(knot,k,x,y)?

x=
y=
sp=spap2(1,2,x,y)
hold on
plot(sp,'g*');



我用这个程序试验。没什么反应。迷惑中。

wcjhit110 发表于 2011-8-26 20:07:00

回复 1# haoxiangmiao
我是新手,请问楼主能否把你的代码发给我参考一下!万分感谢!wcjhit@163.com
页: [1]
查看完整版本: 请高手指教,我如何实现我的算法 voronoi + B-spline