- 积分
- 3799
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2015-7-6
- 最后登录
- 1970-1-1
|
发表于 2016-10-7 16:08:21
|
显示全部楼层
gwh 发表于 2016-10-6 20:11
x=1:10;
y=[0.2 -0.32 -0.24 -0.2 0.3 0.24 0.5 0.45 0.36 -0.32];
area(x(y>=0),y(y>=0),'facecolor', ...
还是忍不住试了一下area函数。。
- [xx yy] = polybool('subtraction',[1 1 10 10],[0.8 0 0 0.8], [x x(end) x(1)], [y 0.8 0.8]);
- [xc yc] = polybool('subtraction',[1 1 10 10],[-0.4 0 0 -0.4], [x x(end) x(1)], [y -0.4 -0.4]);
- area(xx,yy,'facecolor','y','linestyle','none')
- hold on
- area(xc,yc,'facecolor',[0.3 0.3 1],'linestyle','none')
复制代码 绘制后图形如下:
解释一下:
polybool中前两个向量,第一个向量[1 1 10 10]和第二个向量[-0.4 0 0 -0.4]构成了一个矩形。
1和10分别代表x轴的 xlim 属性对应值,-0.4 表示 y轴 下限,0.8表示y轴的上限,0 表示 area函数中的 basevalue,也就是区分颜色的分割线,因为这里只需要区分正负值,所以是0,具体可以看一下area函数。
需要这个矩形就是为了和另一个多边形进行取差,看下图>>>>
图中有一个蓝色矩形和一个粉色多边形,两者取差之后保留蓝色矩形的剩余蓝色区域,这就是图一中的负值区。
图一的正值区是同样的道理而来>>>>
关于polybool函数你help看一下即可,不麻烦。
你可以把linestyle属性设置为其它线条,你会发现多了一条线,这个应该可以通过添加NaN到xc,yc,xx,yy中来解决,但是我没试,这个只能你来了,但是把 linestyle设置为 none 基本上就满足你的要求了。
明白这个方法之后你就可以写一个函数了,以后专门用于这种图形的绘制,如果解决掉多了线条的问题就更完美了。
|
|