• MATLAB|不给糖果就捣蛋


    目录

    扫一扫关注公众号

    效果图

    代码

    绘制南瓜

    绘制无脸男小鬼

    其中绘制风车代码:

    其中 EllipsePlotter类函数代码如下

    属性 (properties)

    方法 (methods)


    扫一扫关注公众号

    效果图

    图片

    图片

    代码

    绘制南瓜

    1. clc;clear;close all;
    2. [X,Y,Z]=sphere(200);
    3. R=1+(-(1-mod(0:.1:20,2)).^2)/15;
    4. surf(R.*X,R.*Y,(.8+(0-(1:-.01:-1)'.^4)*.2).*Z.*R,'FaceC',[ 1 0.4588 0.0941],'EdgeC','n')
    5. axis('equal','off')
    6. material([ .6, .9, .3, 2, .5 ])
    7. lighting g
    8. camlight

    图片

    绘制无脸男小鬼

    1. clc;clear;close all
    2. fig=figure('Position',[476 224 672 642]);
    3. ax=gca;
    4. ax.Color='none';
    5. ax.YLim=[0,15];
    6. ax.XLim=[-3,14];
    7. ax.Box='off';
    8. ax.XColor='none';
    9. ax.YColor='none';
    10. axis equal;
    11. hold on
    12. pause(0.1)
    13. [X, Y] = meshgrid(linspace(1, 0, 200));
    14. image([-3, 14], [0, 15], Y*255);
    15. colormap(gray)
    16. pause(0.1)
    17. ellipse = EllipsePlotter('a', 4, 'b', 6, 'x', 5.4, 'y', 6.2, ...
    18. 'plotType', 'fill', 'fillColor', [.4,.4,.4], 'rotation', 0, ...
    19. 'angleRange',[-25,205],'alpha',1,'lineWidth',6,'lineColor',[1,1,1]*0.9);
    20. ellipse.plotEllipse();
    21. d=[0 -0.3 -0.4 -0.6 -0.4 -0.3 0];
    22. for i=1:7
    23. ellipse = EllipsePlotter('a',1.2, 'b', 3.3, 'x', 2.7+(i-1)*0.9, 'y', 5.5+d(i), ...
    24. 'plotType', 'fill', 'fillColor',[.4,.4,.4], 'rotation', 0, ...
    25. 'angleRange',[-200,20],'alpha',1,'lineWidth',6,'lineColor','none');
    26. ellipse.plotEllipse();
    27. end
    28. % 脸
    29. pause(0.3)
    30. FaceColor=[1.0 0.9627 0.9235];
    31. ellipse = EllipsePlotter('a',3, 'b', 2.8, 'x',5.4, 'y',9, ...
    32. 'plotType', 'fill', 'fillColor',FaceColor, 'rotation', 0, ...
    33. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    34. ellipse.plotEllipse();
    35. % 眉毛、腮红、嘴
    36. pause(0.3)
    37. ellipse = EllipsePlotter('a',0.3, 'b',1, 'x',3.9, 'y',10.2, ...
    38. 'plotType', 'fill', 'fillColor',[1.0 0.65 0.63], 'rotation', 15, ...
    39. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    40. ellipse.plotEllipse();
    41. ellipse = EllipsePlotter('a',0.3, 'b',1, 'x',6.8, 'y',10.4, ...
    42. 'plotType', 'fill', 'fillColor',[1.0 0.65 0.63], 'rotation', 160, ...
    43. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    44. ellipse.plotEllipse();
    45. ellipse = EllipsePlotter('a',0.3, 'b',1, 'x',7, 'y',7.8, ...
    46. 'plotType', 'fill', 'fillColor',[1.0 0.65 0.63], 'rotation', 0, ...
    47. 'angleRange',[-200,20],'alpha',1,'lineWidth',2,'lineColor','none');
    48. ellipse.plotEllipse();
    49. ellipse = EllipsePlotter('a',0.3, 'b',1, 'x',4, 'y',7.6, ...
    50. 'plotType', 'fill', 'fillColor',[1.0 0.65 0.63], 'rotation', -10, ...
    51. 'angleRange',[-200,20],'alpha',1,'lineWidth',2,'lineColor','none');
    52. ellipse.plotEllipse();
    53. pause(0.3)
    54. ellipse = EllipsePlotter('a',.84, 'b',1.1, 'x',3.9, 'y',8.9, ...
    55. 'plotType', 'fill', 'fillColor',FaceColor, 'rotation', 0, ...
    56. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    57. ellipse.plotEllipse();
    58. ellipse = EllipsePlotter('a',.84, 'b',1.2, 'x',7, 'y',9, ...
    59. 'plotType', 'fill', 'fillColor',FaceColor, 'rotation', 0, ...
    60. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    61. ellipse.plotEllipse();
    62. %嘴巴
    63. pause(0.3)
    64. ellipse = EllipsePlotter('a',.3, 'b',.5, 'x',5.3, 'y',7.9, ...
    65. 'plotType', 'fill', 'fillColor',[0.9 0 0], 'rotation', 0, ...
    66. 'angleRange',[-180,0],'alpha',1,'lineWidth',2,'lineColor','none');
    67. ellipse.plotEllipse();
    68. ellipse = EllipsePlotter('a',.5, 'b',.25, 'x',5.3, 'y',8, ...
    69. 'plotType', 'fill', 'fillColor',FaceColor, 'rotation', 0, ...
    70. 'angleRange',[-180,0],'alpha',1,'lineWidth',2,'lineColor','none');
    71. ellipse.plotEllipse();
    72. %眼袋
    73. pause(0.2)
    74. ellipse = EllipsePlotter('a',0.3, 'b',0.1, 'x',3.9, 'y',8.2, ...
    75. 'plotType', 'fill', 'fillColor',[1 1 1]*0.8, 'rotation', 0, ...
    76. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    77. ellipse.plotEllipse();
    78. ellipse = EllipsePlotter('a',0.3, 'b',0.11, 'x',7, 'y',8.2, ...
    79. 'plotType', 'fill', 'fillColor',[1 1 1]*0.8, 'rotation', 0, ...
    80. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    81. ellipse.plotEllipse();
    82. % 眼睛
    83. pause(0.3)
    84. ellipse = EllipsePlotter('a',0.7, 'b',0.6, 'x',3.9, 'y',9.1, ...
    85. 'plotType', 'fill', 'fillColor',[0 0 0], 'rotation', 0, ...
    86. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    87. ellipse.plotEllipse();
    88. ellipse = EllipsePlotter('a',0.7, 'b',0.6, 'x',7, 'y',9.1, ...
    89. 'plotType', 'fill', 'fillColor',[0 0 0], 'rotation', 0, ...
    90. 'angleRange',[0,360],'alpha',1,'lineWidth',2,'lineColor','none');
    91. ellipse.plotEllipse();
    92. % 心
    93. pause(0.3)
    94. t=0:0.025:2*pi;
    95. x=(16*sin(t).^3)/10+5.5;
    96. y=(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))/10+4.8;
    97. fill(x,y,'r','edgecolor','r');
    98. %风车
    99. pause(0.3)
    100. hold on
    101. plot([0 0.2],[9.5 7],'LineWidth',3,'Color',[0,0,1,0.5])
    102. colors = {'r', 'g', 'b', 'y';'c', 'm', 'g','c'};
    103. L = 0.8;
    104. center = [0,9.5]; % 定义风车的圆心
    105. T=[0 pi/3];
    106. for j = 1:4
    107. for i=1:2
    108. theta1 = (j-1) * pi/2+T(i);
    109. theta2 = theta1 + pi/2;
    110. P0 = center;
    111. P1 = center + L * [cos(theta1), sin(theta1)];
    112. P2 = center + L * [cos(theta2), sin(theta2)];
    113. Psharp = (P1 + P2) / 2;
    114. fill([P0(1), P1(1), Psharp(1)], [P0(2), P1(2), Psharp(2)], colors{i,j},'EdgeColor','none','FaceAlpha',0.8);
    115. end
    116. end
    117. %手
    118. pause(0.3)
    119. ellipse = EllipsePlotter('a',3, 'b',0.8, 'x',8.5, 'y',6, ...
    120. 'plotType', 'fill', 'fillColor',[.4 .4 .4], 'rotation', -30, ...
    121. 'angleRange',[100,250],'alpha',1,'lineWidth',2,'lineColor',[1,1,1]*0.6);
    122. ellipse.plotEllipse();
    123. ellipse = EllipsePlotter('a',3, 'b',0.8, 'x',8.7, 'y',6.1, ...
    124. 'plotType', 'fill', 'fillColor',[.4 .4 .4], 'rotation', -30, ...
    125. 'angleRange',[100,250],'alpha',1,'lineWidth',2,'lineColor','none');
    126. ellipse.plotEllipse();
    127. pause(0.3)
    128. ellipse = EllipsePlotter('a',3, 'b',0.8, 'x',2.6, 'y',6, ...
    129. 'plotType', 'fill', 'fillColor',[.4 .4 .4], 'rotation',20, ...
    130. 'angleRange',[100,270],'alpha',1,'lineWidth',2,'lineColor',[1,1,1]*0.6);
    131. ellipse.plotEllipse();
    132. ellipse = EllipsePlotter('a',3, 'b',0.8, 'x',2.7, 'y',5.95, ...
    133. 'plotType', 'fill', 'fillColor',[.4 .4 .4], 'rotation',20, ...
    134. 'angleRange',[100,270],'alpha',1,'lineWidth',2,'lineColor','none');
    135. ellipse.plotEllipse();
    136. pause(0.3)
    137. tex=sprintf('不给糖果\n 就捣蛋');
    138. text(8,13,tex,'FontSize',30,'FontWeight','bold','Color','w');

    图片

    其中绘制风车代码:

    1. hold on
    2. plot([0 0.2],[9.5 7],'LineWidth',3,'Color',[0,0,1,0.5])
    3. colors = {'r', 'g', 'b', 'y';'c', 'm', 'g','c'};
    4. L = 0.8;
    5. center = [0,9.5]; % 定义风车的圆心
    6. T=[0 pi/3];
    7. for j = 1:4
    8. for i=1:2
    9. theta1 = (j-1) * pi/2+T(i);
    10. theta2 = theta1 + pi/2;
    11. P0 = center;
    12. P1 = center + L * [cos(theta1), sin(theta1)];
    13. P2 = center + L * [cos(theta2), sin(theta2)];
    14. Psharp = (P1 + P2) / 2;
    15. fill([P0(1), P1(1), Psharp(1)], [P0(2), P1(2), Psharp(2)], colors{i,j},'EdgeColor','none','FaceAlpha',0.8);
    16. end
    17. end

    图片

    其中爱心代码:

    1. t=0:0.025:2*pi;
    2. x=(16*sin(t).^3)/10+5.5;
    3. y=(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))/10+4.8;
    4. fill(x,y,'r','edgecolor','r');

    图片

    其中 EllipsePlotter类函数代码如下

    1. classdef EllipsePlotter
    2. properties
    3. a = 1;
    4. b = 1;
    5. x = 0;
    6. y = 0;
    7. angleRange = [0 2*pi];
    8. rotation = 0;
    9. lineColor = 'b';
    10. lineWidth = 1;
    11. plotType = 'plot';
    12. fillColor = 'r';
    13. alpha = 1;
    14. end
    15. methods
    16. function obj = EllipsePlotter(varargin)
    17. % Constructor
    18. if nargin > 0
    19. for i = 1:2:nargin
    20. obj.(varargin{i}) = varargin{i+1};
    21. end
    22. end
    23. startRadian = obj.angleRange(1) * pi / 180;
    24. endRadian = obj.angleRange(2) * pi / 180;
    25. theta = startRadian:pi/100:endRadian;
    26. end
    27. function plotEllipse(obj)
    28. startRadian = obj.angleRange(1) * pi / 180;
    29. endRadian = obj.angleRange(2) * pi / 180;
    30. theta = startRadian:pi/100:endRadian;
    31. X = obj.a * cos(theta);
    32. Y = obj.b * sin(theta);
    33. % 旋转坐标
    34. rotationMatrix = [cosd(obj.rotation), -sind(obj.rotation); sind(obj.rotation), cosd(obj.rotation)];
    35. xyRotated = [X; Y]' * rotationMatrix;
    36. % 将旋转后的椭圆平移到指定的位置
    37. XY(:,1) = xyRotated(:,1) + obj.x;
    38. XY(:,2) = xyRotated(:,2) + obj.y;
    39. % 根据 plotType 来绘制椭圆
    40. if strcmp(obj.plotType, 'plot')
    41. plot(XY(:,1), XY(:,2), '-', 'Color', obj.lineColor, 'LineWidth', obj.lineWidth);
    42. hold on; axis equal
    43. elseif strcmp(obj.plotType, 'fill')
    44. fill(XY(:,1), XY(:,2), obj.fillColor, 'EdgeColor', obj.lineColor, 'FaceAlpha', obj.alpha, 'LineWidth', obj.lineWidth);
    45. hold on; axis equal
    46. else
    47. error('无效的 plotType 参数!');
    48. end
    49. end
    50. end
    51. end

    属性 (properties)

    这些属性定义了椭圆的参数和绘图样式。

    • a, b: 椭圆的主轴和次轴的长度。

    • x, y: 椭圆的中心位置

    • angleRange: 绘制椭圆的角度范围。

    • rotation: 椭圆的旋转角度。

    • lineColor: 椭圆边界的颜色。

    • lineWidth: 椭圆边界的线宽。

    • plotType: 绘图类型,可以是 'plot' 或 'fill'。

    • fillColor: 如果 plotType 是 'fill',则此属性定义填充颜色。

    • alpha: 填充的透明度。

    方法 (methods)

    这些方法定义了类的功能。

    1. 构造函数 (EllipsePlotter):

      • 当创建这个类的对象时,它会被调用。

      • 它接受一系列的名称-值对参数,允许在创建对象时设置属性。

      • 它目前只计算了一个角度范围,但并没有使用这个范围做任何其他事情。

    2. plotEllipse:

      • 该方法根据对象的属性值绘制一个椭圆。

      • 它首先计算了椭圆上的点的坐标。

      • 然后根据 rotation 属性旋转这些点。

      • 接着将旋转后的点平移到 x 和 y 属性指定的位置。

      • 最后,根据 plotType 属性选择绘制方式:'plot' 会绘制椭圆的轮廓,而 'fill' 会填充椭圆。

    这个类可以使用户轻松地创建和定制椭圆的绘图,而不必每次都重复相同的计算和绘图代码。例如,用户可以轻松地更改椭圆的大小、位置、颜色和旋转,并立即看到结果。

  • 相关阅读:
    深度学习+opencv+python实现车道线检测 - 自动驾驶 计算机竞赛
    KMP算法详解,3000字详解,带你学会next数组
    建木DevOps流程梳理
    java程序中为什么经常使用tomcat
    LeetCode 面试题 04.09. 二叉搜索树序列
    C/C++内存管理
    Abnova丨CSV 单克隆抗体解决方案
    Day796.什么是线程数据的强、弱一致性 -Java 性能调优实战
    【数据结构】哈希表
    指纹面容识别登录流程概述
  • 原文地址:https://blog.csdn.net/zzx2016zzx/article/details/134321238