[已解决] 隐函数的区域如何填充颜色?

[复制链接]
sunlixunpp 发表于 2021-6-4 21:27:50
各位matlab老师,我想问下能不能实现对程序生成的图像里填充曲线包围区域的颜色?谢谢了

clc;clear;
eps_A=6.76;
eps_B=2.1316;
d_A=110e-9;
d_B=100e-9;

f=@(x,y) cos(sqrt(eps_A*(y*1e6)^2-(x*1e6)^2)*d_A)*cos(sqrt(eps_B*(y*1e6)^2-(x*1e6)^2)*d_B)...
    -0.5*(sqrt(eps_B*(y*1e6)^2-(x*1e6)^2)/sqrt(eps_A*(y*1e6)^2-(x*1e6)^2)+sqrt(eps_A*(y*1e6)^2-(x*1e6)^2)/sqrt(eps_B*(y*1e6)^2-(x*1e6)^2))...
    *sin(sqrt(eps_A*(y*1e6)^2-(x*1e6)^2)*d_A)*sin(sqrt(eps_B*(y*1e6)^2-(x*1e6)^2)*d_B)-1;

h=fimplicit(f,[ 0 40 0 40],'LineWidth',3);
axis square;

最佳答案


深蓝孩童 发表于 2021-6-5 09:47:18
zdcgy 发表于 2021-6-5 09:25
1. 注意使用点乘和点除,以提高计算效率和避免运算错误
2. 重复使用的复杂表达式,最好先定义成函数句柄再 ...

完善了一下,如下供参考:
  1. clc;clear;
  2. eps_A=6.76;
  3. eps_B=2.1316;
  4. d_A=110e-9;
  5. d_B=100e-9;

  6. f=@(x,y) cos(sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)*d_A).*cos(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)*d_B)...
  7.     -0.5*(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)./sqrt(eps_A*(y*1e6).^2-(x*1e6).^2) + ...
  8.     sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)./sqrt(eps_B*(y*1e6).^2-(x*1e6).^2))...
  9.     .*sin(sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)*d_A).*sin(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)*d_B)-1;

  10. h = fimplicit(f,[ 0 40 0 40], 'r', 'LineWidth',3 );
  11. axis square
  12. hold on
  13. fh = fcontour(f, [0 40 0 40], 'Fill', 'on', 'LineColor', "none");
  14. fh.LevelList = 0;
  15. hold off
  16. set(gca, 'SortMethod', "depth")

  17. % figure
  18. % hold on
  19. % fsurf(f)
  20. % fcontour(f, [ 0 40 0 40], 'r', 'LineWidth', 3)
  21. % hold off
复制代码
效果如下:
[attach]323158[/attach]


6 条回复


zdcgy 发表于 2021-6-5 09:25:55
1. 注意使用点乘和点除,以提高计算效率和避免运算错误
2. 重复使用的复杂表达式,最好先定义成函数句柄再使用,不然大量直接代入,式子显得很臃肿,也不利于排查问题
下面给出代码和示例图,供参考。
代码如下
  1. clc;clear;
  2. eps_A=6.76;
  3. eps_B=2.1316;
  4. d_A=110e-9;
  5. d_B=100e-9;

  6. g=@(x,y) sqrt(eps_A*(y*1e6).^2-(x*1e6).^2);
  7. h=@(x,y) sqrt(eps_B*(y*1e6).^2-(x*1e6).^2);
  8. f=@(x,y) cos(g(x,y)*d_A).*cos(g(x,y)*d_B)...
  9.     -0.5*(h(x,y)./g(x,y)+g(x,y)./h(x,y))...
  10.     .*sin(g(x,y)*d_A).*sin(h(x,y)*d_B)-1;

  11. h=fcontour(f,[ 0 40 0 40],'LineWidth',3,'fill','on');
  12. axis square;
复制代码
运行效果如下图
contour.png


深蓝孩童 发表于 2021-6-5 09:47:18
zdcgy 发表于 2021-6-5 09:25
1. 注意使用点乘和点除,以提高计算效率和避免运算错误
2. 重复使用的复杂表达式,最好先定义成函数句柄再 ...

完善了一下,如下供参考:
  1. clc;clear;
  2. eps_A=6.76;
  3. eps_B=2.1316;
  4. d_A=110e-9;
  5. d_B=100e-9;

  6. f=@(x,y) cos(sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)*d_A).*cos(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)*d_B)...
  7.     -0.5*(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)./sqrt(eps_A*(y*1e6).^2-(x*1e6).^2) + ...
  8.     sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)./sqrt(eps_B*(y*1e6).^2-(x*1e6).^2))...
  9.     .*sin(sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)*d_A).*sin(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)*d_B)-1;

  10. h = fimplicit(f,[ 0 40 0 40], 'r', 'LineWidth',3 );
  11. axis square
  12. hold on
  13. fh = fcontour(f, [0 40 0 40], 'Fill', 'on', 'LineColor', "none");
  14. fh.LevelList = 0;
  15. hold off
  16. set(gca, 'SortMethod', "depth")

  17. % figure
  18. % hold on
  19. % fsurf(f)
  20. % fcontour(f, [ 0 40 0 40], 'r', 'LineWidth', 3)
  21. % hold off
复制代码
效果如下:
untitled.png


回复此楼

sunlixunpp 发表于 2021-6-5 14:37:44
zdcgy 发表于 2021-6-5 09:25
1. 注意使用点乘和点除,以提高计算效率和避免运算错误
2. 重复使用的复杂表达式,最好先定义成函数句柄再 ...

谢谢老师,这些问题我会注意,但我的问题其实是想问我能否像这张图一样将对应的区域进行填充颜色?
微信截图_20210605143115.png
untitled.png

sunlixunpp 发表于 2021-6-5 14:58:02
本帖最后由 sunlixunpp 于 2021-6-5 15:22 编辑
深蓝孩童 发表于 2021-6-5 09:47
完善了一下,如下供参考:效果如下:

谢谢老师,这是我想得到的结果,还有两个小问题,一是图中的两个白点能否去掉,二是填充的颜色能设置吗,比如调成黑白对比?

深蓝孩童 发表于 2021-6-5 19:25:43
sunlixunpp 发表于 2021-6-5 14:58
谢谢老师,这是我想得到的结果,还有两个小问题,一是图中的两个白点能否去掉,二是填充的颜色能设置吗, ...


结论:搞不完美,下边两个折衷。如果没有其他更好的方法,你可以找找方法修饰一下图,或许其他函数能帮助解决锯齿,或者小格子用黑色盖一下就行,哈哈哈哈哈哈哈哈哈哈哈

1:
  1. clc;clear;
  2. eps_A=6.76;
  3. eps_B=2.1316;
  4. d_A=110e-9;
  5. d_B=100e-9;



  6. f=@(x,y) cos(sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)*d_A).*cos(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)*d_B)...
  7. -0.5*(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)./sqrt(eps_A*(y*1e6).^2-(x*1e6).^2) + ...
  8. sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)./sqrt(eps_B*(y*1e6).^2-(x*1e6).^2))...
  9. .*sin(sqrt(eps_A*(y*1e6).^2-(x*1e6).^2)*d_A).*sin(sqrt(eps_B*(y*1e6).^2-(x*1e6).^2)*d_B)-1;

  10. figure
  11. axis square
  12. hold on
  13. set(gca, 'SortMethod', "depth")

  14. fimplicit(f,[0 40 0 40], 'r', 'LineWidth', 1);

  15. fh = fcontour(f, [0 40 0 40], 'Fill', 'on', 'LineColor', "none");
  16. fh.LevelList = [0 0];

  17. colormap([1 1 1; 0 0 0])
  18. hold off
复制代码
结果:我不知道为什么会出现白色小格。
1.png

2:
  1. figure
  2. hold on
  3. set(gca, 'SortMethod', "depth")

  4. fimplicit(f,[0 40 0 40], 'r', 'LineWidth', 1.5);

  5. fh = fsurf(f, 'LineStyle', "none", 'MeshDensity', 53);
  6. view(0, 90)

  7. caxis([-1e-3 0])
  8. colormap([1 1 1; 0 0 0])
  9. hold off
复制代码
结果:出现锯齿。
2.png






sunlixunpp 发表于 2021-6-5 20:56:56
深蓝孩童 发表于 2021-6-5 19:25
结论:搞不完美,下边两个折衷。如果没有其他更好的方法,你可以找找方法修饰一下图,或许其他函数能帮 ...

fimplicit(f,[0 40 0 40], 'r', 'LineWidth', 1.5, 'MeshDensity', 1000);
fh = fcontour(f, [0 40 0 40], 'Fill', 'on', 'LineColor', "none", 'MeshDensity', 1000);
我发现如果'MeshDensity'值设置较大的时候会好很多,问题解决了,谢谢!
1.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表