精华内容
下载资源
问答
  • %*************************% 参考文献:MATLAB画图常用调整代码MATLAB绘图属性操作
    %*************************%
    

    参考文献:

    MATLAB画图常用调整代码

    MATLAB绘图属性操作

    展开全文
  • 绘图逻辑 相比与ggplot2,plotly的绘图逻辑更清晰一些,主要分成三个步骤:设置数据(trace)、设置布局(layout)、画图保存 例: import 设置数据 设置数据的时候需要指定所图形的类型: mydata 这一步操作类似于...

    2019-12-12更新

    在线绘图已经不支持下面的方式了,离线绘图好像没有变。在线绘图依赖一个新的包:chart_studio

    =======================

    安装(ubuntu系统)

    pip3 install plotly

    离线绘图与在线绘图

    plotly有两种绘图方式,安装上面的包之后可以直接使用离线绘图方式绘图,只需导入:

    import plotly.offline as pyoff
    import plotly.graph_objs as go

    如果需要在线绘图,需要注册一个plotly的账号,并在本地配置证书。具体步骤可以参考官网。在线绘图需要导入:

    import 

    离线绘图不需要连接plotly服务器,也不需要plotly账号,使用比较方便;但是离线绘图相比在线绘图缺少一些功能。比如离线绘图只能输出html文件,然后从html里下载图片,不能像在线绘图一样直接导出图片。

    在线绘图的缺点是需要连接服务器,绘图的速度会受网络状态的影响,尤其是绘制数据量较大的图。优势是绘制的图片以及相关数据会同步到自己的账号里。在线绘图的免费账号每日最多绘制100张图片,还有一些附加功能是需要收费的。

    绘图逻辑

    相比与ggplot2,plotly的绘图逻辑更清晰一些,主要分成三个步骤:设置数据(trace)、设置布局(layout)、画图保存

    例:

    import 

    设置数据

    设置数据的时候需要指定所图形的类型:

    mydata 

    这一步操作类似于ggplot2中的:

    myfig = ggplot(aes(x=x,y=y),data=mydata) + geom_point()
    myfig = ggplot(aes(x=x,y=y),data=mydata) + geom_bar()
    ...

    我们注意到,plotly中的数据是放在一个数列里的。在同一张图上绘制多组数据变得非常简单:

    mydata = [go.Scatter(x=x1, y=y1), go.Bar(x=x2,y=y2)]

    每组数据在设置的时候,可以加上一些相关的参数,比如颜色透明度、曲线的类型、点的类型、图例的名字、是否显示图例等等:

    import plotly.graph_objs as go
    import plotly.offline as pyoff
    
    x1 = [1,2,3,4,5]
    y1 = [1,2,3,4,5]
    x2 = [1,2,3,4,5]
    y2 = [5,4,3,2,1]
    mydata = [go.Scatter(x=x1, y=y1, name='x1-y1', 
                         marker=dict(color='rgb(255,0,0)')), 
              go.Bar(x=x2,y=y2,marker=dict(color='#009efd'),
                     showledgen=False)]
    myfig = go.Figure(data=mydata)
    pyoff.plot(myfig)

    aa9bd6a915184cdde198cf4e6bd3edc9.png

    设置Layout

    这部分的设置都是和数据无关的绘图参数,比如坐标轴的范围、名字、图片的标题,相关的字体,坐标刻度等等。如果不设置,只使用默认的配置也是可以的,上面的图片和代码就没有设置Layout。

    这部分设置对应与ggplot中的theme、xlim、xlab等一系列的参数;plotly的逻辑清晰之处就是把数据相关的图片参数设置、数据无关的参数设置分开,前者放在数据设置中,后者放在Layout设置中。

    对比:

    #plotly
    mylay = go.Layout(title='标题', color='rgb(0,0,0)',
                      xaxis=dict(title='x轴',range=[0,10]))
    
    #ggplot
    myp < myp + labs(title='标题', x='x轴') + xlim(0.10) + 
          theme(title=element_text(color='black'))

    其他

    更多说明移步plotly参数文档,写的很详细。

    展开全文
  • 今天来实现一个图片碎片化加载效果,效果如下:碎片化加载我们分为 3 个步骤来实现:定义 html 结构拆分图片编写动画函数定义 html 结构 这里只需要一个 canvas 元素就可以了。<html><body><canvasid...

    今天来实现一个图片碎片化加载效果,效果如下:

    14fc54c5b33bbe3ed4db06e7ff177153.gif
    碎片化加载

    我们分为 3 个步骤来实现:

    • 定义 html 结构
    • 拆分图片
    • 编写动画函数

    定义 html 结构

    这里只需要一个 canvas 元素就可以了。

    <html>
      <body>
        <canvasid="myCanvas"width="900"height="600"style="background-color: black;"
        >
    canvas>
      body>
    html>

    拆分图片

    这个例子中,我们将图片按照 10 行 10 列的网格,拆分成 100 个小碎片,这样就可以对每一个小碎片独立渲染了。

    let image = new Image();
    image.src = "https://cdn.yinhengli.com/canvas-example.jpeg";
    let boxWidth, boxHeight;
    // 拆分成 10 行,10 列
    let rows = 10,
      columns = 20,
      counter = 0;

    image.onload = function ({
      // 计算每一行,每一列的宽高
      boxWidth = image.width / columns;
      boxHeight = image.height / rows;
      // 循环渲染
      requestAnimationFrame(animate);
    };

    requestAnimationFrame:告诉浏览器,你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。

    编写动画函数

    接下来我们编写动画函数,让浏览器在每一次重绘前,随机渲染某个小碎片。

    这里的核心是 context.drawImage 方法。

    let canvas = document.getElementById("myCanvas");
    let context = canvas.getContext("2d");

    function animate({
      // 随机渲染某个模块
      let x = Math.floor(Math.random() * columns);
      let y = Math.floor(Math.random() * rows);
      // 核心
      context.drawImage(
        image,
        x * boxWidth,  // canvas 中横坐标起始位置
        y * boxHeight, // canvas 中纵坐标起始位置
        boxWidth,      // 画图的宽度(小碎片图像的宽)
        boxHeight,     // 画图的高度(小碎片图像的高)
        x * boxWidth,  // 从大图的 x 坐标位置开始画图
        y * boxHeight, // 从大图的 y 坐标位置开始画图
        boxWidth,      // 从大图的 x 位置开始,画多宽(小碎片图像的宽)
        boxHeight      // 从大图的 y 位置开始,画多高(小碎片图像的高)
      );
      counter++;
      // 如果模块渲染了 90%,就让整个图片显示出来。
      if (counter > columns * rows * 0.9) {
        context.drawImage(image, 00);
      } else {
        requestAnimationFrame(animate);
      }
    }

    完整代码

    <html>
      <body>
        <canvasid="myCanvas"width="900"height="600"style="background-color: black;"
        >
    canvas>
        <script>let image = new Image();
          image.src = "https://cdn.yinhengli.com/canvas-example.jpeg";let canvas = document.getElementById("myCanvas");let context = canvas.getContext("2d");let boxWidth, boxHeight;let rows = 10,
            columns = 20,
            counter = 0;
          image.onload = function ({
            boxWidth = image.width / columns;
            boxHeight = image.height / rows;
            requestAnimationFrame(animate);
          };function animate({let x = Math.floor(Math.random() * columns);let y = Math.floor(Math.random() * rows);
            context.drawImage(
              image,
              x * boxWidth, // 横坐标起始位置
              y * boxHeight, // 纵坐标起始位置
              boxWidth, // 图像的宽
              boxHeight, // 图像的高
              x * boxWidth, // 在画布上放置图像的 x 坐标位置
              y * boxHeight, // 在画布上放置图像的 y 坐标位置
              boxWidth, // 要使用的图像的宽度
              boxHeight // 要使用的图像的高度
            );
            counter++;if (counter > columns * rows * 0.9) {
              context.drawImage(image, 00);
            } else {
              requestAnimationFrame(animate);
            }
          }
    script>
      body>
    html>

    总结

    通过这个 Demo,我们使用了 canvasAPI 实现了图片的碎片加载效果,是不是特别简单!

    42249d6b9bf829182b93148d3a4a13de.png

    “在看和转发”就是最大的支持
    展开全文
  • 「OF COURSE」每周推出一期主题代码检查,通过分享让更多人接触到优秀的创意编程代码,让大家最直观,最近距离的了解创意编程。皮卡丘 or 百变怪?最近听见一种说法:“雷神”分为两种,一种存在于漫威宇宙,一种...

    v2-cdeb418fe466bf58cb3d920427958ddb_1440w.jpg?source=172ae18b

    「OF COURSE」每周推出一期主题代码检查,通过分享让更多人接触到优秀的创意编程代码,让大家最直观,最近距离的了解创意编程。

    • 皮卡丘 or 百变怪?

    最近听见一种说法:“雷神”分为两种,一种存在于漫威宇宙,一种存在于宝可梦宇宙。前者身形高大,能抵挡一切病毒、辐射和毒气攻击,手持“雷神之锤”还可操纵雷电风暴天气。后者是一只黄皮电耗子,体重超标,容易感冒,疑似靠脸吃饭,放电方式成迷。

    最近大家肯定都被下面这个靠脸吃饭的黄皮耗子萌到了吧!

    v2-26599b9fd2847c11794f94cf3a417bb7_b.gif

    是滴,这就是最近大火的电影《大侦探皮卡丘》里面的那一只,让人不禁感叹:原来你是这样的皮卡丘。

    v2-07047d25084f6e770677d08165b41c9c_b.jpg

    但今天我们的主角不是皮卡丘。大家都知道这部电影是改编自游戏《精灵宝可梦》,里面有各种各样的精灵,而皮卡丘只是其中一只。今天我们的主角是一只比较特殊的精灵——百变怪。

    v2-e4211aa900314eb837f00974fb905bc4_b.gif

    这次它站c位的原因不是它有变成任何精灵这种无与伦比的能力,而是它碰巧出现在了下面的这个作品中。

    v2-8b836dc8085e3aba08565d528baf604a_b.gif

    观察作品,可以发现一个个字母在看上去好像在这只黑黑的百变怪身上有规律的跳舞,很有律动感。

    Circular Hello Curves:

    https://www.openprocessing.org/sketch/697891

    是大佬Vamoss用P5.js写的,我用Processing实现了相同的效果

    在讲解完这个作品后,我会给大家看看我在次基础上进行的拓展——Broken Heart,大家可以想一想到底是看见可什么伤心的消息,才让一颗漂亮的心仿佛哭泣状?

    v2-e6967349c50b558b73cad01939d29479_b.gif

    心急的同学可以看看在线效果:

    BrokenHeart(https://www.openprocessing.org/sketch/720376)

    代码:(http://github.com/pearmini/processing/blob/master/CircularHelloCurves/BrokenHeart/BrokenHeart.pde)

    • 极坐标系

    每当我们想在Processing中显示图形,我们必须指定具体的像素位置,也就是一系列的(x,y)坐标。这个坐标系我们称之为笛卡尔坐标系——以法国数学家笛卡尔命名。

    另一种比较有用的坐标系叫极坐标系,它用一个夹角和距离表示空间中的一个点。我们以向量为例:

    - 笛卡尔坐标系:向量的x分量和y分量

    - 极坐标系:向量的大小r(长度)和方向ρ(夹角)

    v2-e0974dad330d65b88ffc7a5c5b95b1fb_b.jpg

    Processing的绘图函数不能理解极坐标系,当我们要画图的时候,必须指定笛卡尔坐标系的位置。但是,有时候用极坐标系设计模型会更加方便。

    幸运的是,通过三角函数可以完成极坐标系和笛卡尔坐标系的相互转换,这样我们就可以用极坐标系坐标系设计模型,然后用笛卡尔坐标系绘制图形。

    根据上图我们可以很容易地得到两者间的转化公式,如下图:

    v2-dbed0aa059122785cbf155a773d274c2_b.jpg

    下面我们从两个例子来进一步了解极坐标系。

    现在考虑一个圆心在坐标原点,半径为r的圆。

    在笛卡尔坐标系下,该圆的方程为 。在极坐标系下,该圆的方程如ρ=r。对于圆上任意一点(ρ,θ)来说,ρ是该点到圆心的距离,θ是从起始边转过的角度。

    分析圆的极坐标方程,其实也不难理解它为啥是这样。因为圆的定义就是到定点的距离等于定长的点的集合,即不管θ是多少,ρ都等于半径。

    • 心型线

    心型线的极坐标方程很简单:ρ=r(1+cosθ),它的图像如下图所示:

    v2-0e11d37386328b4503e4d9cdbb5091b6_b.jpg

    据说这个公式出现在52岁的笛卡尔写给18岁的瑞典公主克里斯汀的一封情书,想了解更多的小伙伴可以去自行查阅这个凄美的爱情故事。

    • 周期性变化的noise随机数

    下面来讲解Circular Hello Curves所需要用到的最核心的地方:如何获得一系列周期性变化的noise随机数,并且它们没有对称性。

    我们知道Processing中的noise函数的返回值是完全由输入参数决定,所以如果我们希望返回值是周期性的,那们输入的参数就需要是周期性的。我们不妨假设参数的周期是2π,那么很容易就会想到使用三角函数。

    假如我们设定输入的参数序列为如下所示,那么两个周期内的图像如下。分析可以发现,虽然现在获得这一系列noise随机数是以2π为周期了,但是却有对称性。这是因为正弦函数本身就有对称轴。

    float y = noise(sin(x) + 1);

    v2-464f2f186813cd4e344868bf17f89a0d_b.jpg

    需要说一句,将正弦函数加一的目的是让输入参数都大于零。因为noise返回的值都是在0到1之间的,所以为了保持输入参数的周期,将输入参数都变成正数。

    为了使得返回序列没有对称性,将我们输入的参数序列改为如下所示,那么两个周期内的图像将如下。分析可以发现,现在这一系列noise随机数就满足我们的要求了。这是因为,正弦函数和余弦函数的周期都是2π,同时它们的对称轴都不相同。

    float y = noise(sin(x) + 1, cos(x) + 1);

    v2-e453ab1aff9d7cf9104bbaa1eb45e898_b.jpg
    • Processing中绘制文字

    在作品Circular Hello Curves中出现了"Circular Hello Curves",所以我们先来大概了解一下如何在Processing中绘制文字。

    在Processing中绘制文字的很简单,主要有以下几个步骤:

    1.声明一个类型为PFfont的对象

    PFont f;

    2.创建一个字体

    创建一个字体有如下两个方法。

    第一种方法是使用系统自带的字体,用createFont函数创建。该函数主要需要两个参数,第一个是字体的名字,第二个是字体的大小(createFont函数更多用法(https://processing.org/reference/createFont_.html))。

    同时可用通过PFont.list函数查看该系统可以使用的字体。

    f = createFont("Georgia", 24);// 创建系统自带字体

    println(PFont.list()); //获取所有系统可以使用的字体

    如果系统自带的字体不能满足大家,并且希望自己的代码在任何平台运行的效果都一样,那么就可以用第二种方法手动创建字体。

    在Processing自带的开发环境中选择:工具->创建字体,打开如下的窗口。然后选择想要的字体,指定大小,文件名点击ok就行了。这个时候Processing开发环境会在当前项目的根目录下创建一个名叫data的文件件,然后里面有一个扩展名为.vlw的字体文件。

    v2-6bc495d8edc201cddbf0ba4c0bc29a4b_b.jpg

    接下来在setup函数中调用loadFont函数加载自己创建的字体文件。需要注意的是因为Processing从计算机内存里面加载字体文件,这个过程很慢,所以不建议在draw函数中多次调用loadFont函数。

    f = loadFont("data/Serif-48.vlw");

    3.用函数textFont规定使用字体,该函数接受两个参数

    第一个参数是指定的字体类型,第二个参数是字体的大小。第二个参数是一个可选的参数,默认是加载字体本来的大小。

    需要注意的是如果大家使用的是loadFont函数加载的字体,那么指定的字体大小和字体默认的大小不一致的话,可能导致绘制的文字质量不好,因为vlw格式的字体文件使用图片来展示每一个字母。但是如果大家使用的是createFont函数,就没有这个问题。

    textFont(f, 36);

    4.用fill规定使用颜色

    fill(0);

    第五步,用text函数绘制字体,该函数接受三个参数。第一个参数是需要绘制的文字内容,第二个和第三个参数分别是这个文字的绘制位置的x和y坐标。

    text("hello world", 10, 100);

    • 相关方法

    接下来介绍两个Processing中和绘制字体有关的函数。

    第一个是textAlign,该函数用于指定字体的对齐方式,它只需要一个参数:CENTER、LEFT、RIGHT。大家可以通过下面这张图片来看一下这三种对齐方式的区别。

    v2-ce8273b04af495e4abbab54827684aeb_b.jpg

    第二个是textWidth,该函数计算并返回字符串或者字符的宽度。

    String str = "hello world";

    char c = 'A';

    textWidth(str); // 64.78711

    textWidth(c); // 8.289297

    • 如何实现Circular Hello Curves

    现在我们就来介绍如何实现Circular Hello Curves。

    1.我们来看一下代码的主要流程

    首先我们声明一个类型为Shape的全局变量,这个就是百变怪和字母的混合体。然后在setup函数对其进行声明,传入的参数分别是这个混合体中心的坐标和需要绘制的文字内容。接下在draw函数中对这个混合体不断得进行刷新和绘制。最后监听鼠标移动事件,在鼠标进行移动的时候对字体进行旋转。

    Shape s;

    void setup() {

    size(600, 600);

    s = new Shape(width / 2, height /2, 100, "Circular Hello Curves");

    }

    void draw() {

    background(255);

    s.update();

    s.display();

    }

    void mouseMoved() {

    s.rotateText();

    }

    class Shape{}

    2.我们来看看Shape对象的构造函数,看一看这个混合体由什么构成,需要初始化什么东西。

    分析下面的构造函数我们可以得到如下的发现。

    百变怪是由一系列点围成的,每一个点由它的极坐标表示,而它所在的极坐标系是以Shape的x,y为坐标原点的。用一个PVector存储每一个点,其中x维度代表的是该点的方向,y维度代表的是该点的长度。初始化的时候在$[0, 2pi)$的范围内给每一个点设置一个方向。

    然后给每一个字符分配一个PVector,用来存储它的极坐标以及它旋转的角度,其中x维度代表的是方向,y维度代表的是长度,z维度是旋转的角度。初始化的时候只用初始化每一个字符的方向。假设该字符所占用的弧长近似等于它的宽度,根据弧度制角度的计算公式,可以计算出它对应的夹角,从而依次计算每个字符的方向。

    Shape(float _x, float _y, float _r, String _text) {

    x = _x;

    y = _y;

    r = _r;

    text = _text;

    //初始化构成百变怪的点。

    points = new ArrayList();

    for (int i = 0; i < SEGMENT; i++) {

    float theta = map(i, 0, SEGMENT - 1, 0, TAU);

    //初始化每一个的方向

    points.add(new PVector(theta, 0));

    }

    //初始化需要用到的字体,并进行设置。

    f = createFont("Helvetica", _r / 2 * 1.5);

    textFont(f);

    textAlign(CENTER);

    //初始化需要展现的字母。

    chars = new ArrayList();

    float theta = 0;

    for (int i = 0; i < text.length(); i++) {

    char currentChar = text.charAt(i);

    float thetaStep = textWidth(currentChar) / (_r * 1.5);

    theta += thetaStep / 2;

    //初始化每一个的方向

    chars.add(new PVector(theta, 0, 0));

    theta += thetaStep / 2;

    }

    }

    然后我们再看看Shape的成员变量的声明。

    class Shape{

    //构成百变怪点的数量

    final int SEGMENT = 200;

    //百变怪的扭曲程度

    final float NOISE_SCALE = 1;

    ArrayList<PVector> points;

    ArrayList<PVector> chars;

    float x, y, r;

    //绘制字体的启始角度

    float startAngle;

    String text;

    PFont f;

    //...

    }

    3.update

    在每一次update的时候,我们会更新每一个点的位置,这个主要是更新它到原点的距离来实现的。同时也会更新每一个字符的位置和旋转角度,每个字符的位置也是通过更新它到原点的距离实现的。

    void update() {

    for (PVector p : points) {

    p.y = rByTheta(p.x);

    }

    for (PVector c : chars) {

    c.y = rByTheta(c.x + startAngle);

    c.z = angleByTheta(c.x + startAngle);

    }

    }

    下面我们首先来看一下每一个点如何根据它的方向来确定它到原点的距离。我们会对r乘上一个scale来达到扭曲效果,而scale就是我们前面提到的周期性随机数。不同的是,我们传入了第三个参数,使得每一次刷新的时候,每一个点的到原点的距离发生变化,这样才会有膨胀和收缩的效果。

    float rByTheta(float theta) {

    float time = float(frameCount) / 100;

    float scale = noise(cos(theta) + 1, sin(theta) + 1, time) * NOISE_SCALE + 1;

    return r * scale;

    }

    然后我们来分析如何通过该点的方向来确定每个字符的旋转角度。我们首先获得该字符附近左右的两个点,然后根据这两个点到原点的距离获得该字符的旋转角度。具体方法如代码所示。

    float angleByTheta(float theta) {

    final float offset = 0.06;

    float theta1 = theta - offset, theta2 = theta + offset;

    float a = rByTheta(theta1);

    float b = rByTheta(theta2);

    return atan2(a * sin(theta1) - b * sin(theta2), a * cos(theta1) - b * cos(theta2)) + PI;

    }

    在该部分的最后我们再来看如何实现文字随着鼠标旋转的效果。我们是通过更新文字的起始角度来实现的,而该角度是鼠标与坐标原点的连线和起始边的夹角的角度,我们通过如下的方式计算而得。

    void rotateText() {

    startAngle = atan2(mouseY - y, mouseX - x);

    }

    4.最后来我们来看一下Shape函数,看它是如何绘制这个混合体的。

    首先将points中所有点绘制并连接起来,然后填充为黑色。这样就将混合体中的百变怪部分绘制完成了。

    接下来就是根据chars里面存储的数据对每一个字符进行绘制。值得注意的是每个字符保存的方向是相对于起始角度的,所以在绘制的时候应该加上startAngle。

    void display() {

    //绘制百变怪

    translate(x, y);

    beginShape();

    fill(0);

    for (PVector p : points) {

    vertex(p.y * cos(p.x), p.y * sin(p.x));

    }

    endShape();

    //绘制文字

    for (int i = 0; i < text.length(); i++) {

    PVector c = chars.get(i);

    pushMatrix();

    translate(c.y * cos(c.x + startAngle), c.y * sin(c.x + startAngle));

    rotate(c.z);

    text(text.charAt(i), 0, 0);

    popMatrix();

    }

    }

    • 拓展:Broken Heart

    接下来给大家简单讲解一下我在Circular Hello Curves基础上实现的Broken Heart。主要分为两步,第一步将扭曲前的图形从圆形变成心形,第二步添加一双随着鼠标转动的眼睛。

    1.变成心形

    从圆形变成心形很简单,用我们之前提到的心型线就ok,修改rByTheta如下。这里改变余弦函数初相的目的是将心型线顺势针旋转九十度,使得心尖向下。

    float rByTheta(float theta) {

    float time = float(frameCount) / 100;

    float scale = noise(cos(theta) + 1, sin(theta) + 1, time) * NOISE_SCALE + 1;

    return r * (1 + cos(theta - PI / 2)) * scale ;

    }

    2.添加眼睛

    添加眼睛我们需要对Shape这个类做如下的修改。最主要的是增加了一个rotateEye的函数,该函数的作用是让眼睛跟着鼠标转动。

    class Shape{

    //...

    Eye left, right;

    Shape(float _x, float _y, float _r, String _text){

    //...

    left = new Eye(-r / 1.8, r, r );

    right = new Eye(r / 1.8, r, r);

    }

    void rotateEye() {

    left.update(mouseX - x, mouseY - y);

    right.update(mouseX - x, mouseY - y);

    }

    void display(){

    //draw Eyes

    left.display();

    right.display();

    }

    //...

    }

    接下来我们将监听鼠标移动事件函数中修改如下。

    void mouseMoved() {

    s.rotateText();

    s.rotateEye();

    }

    同时也修改传入Shape的位置和需要绘制的文字。

    s = new Shape(width / 2, height / 3, 100, "Sad news!!!");

    最后我们来看一下Eye这个类的定义,绘制一个眼睛的时候会绘制两个圆,分别代表眼白和眼珠,其中眼珠的方向是朝着鼠标的方向。

    class Eye {

    float x, y, size, angle;

    Eye(float _x, float _y, float _size) {

    x = _x;

    y = _y;

    size = _size;

    }

    void update(float mx, float my) {

    angle = atan2(my - y, mx - x);

    }

    void display() {

    pushMatrix();

    translate(x, y);

    fill(255);

    ellipse(0, 0, size, size);

    rotate(angle);

    fill(0);

    ellipse(size/4, 0, size/2, size/2);

    popMatrix();

    }

    }

    • 更多拓展

    代码部分就讲解完了,下面再给大家说两个我能想到的继续拓展的方向。

    泪汪汪的眼睛:Broken Heart的眼睛只是简单的圆形,说句实话,看上去不太像伤心的样子。如果我们能用上面的方法把眼睛扭曲一下,增加一种泪汪汪的感觉,是不是能看上去更悲痛欲绝?

    更多的形状:我们目前只是在圆形和心形基础上进行扭曲,大家可以去找更多的方程,将它们的图像进行扭曲,可能会得到一些更加炫酷的效果!

    • 作者小结

    那么又到了和大家说再见的时候了。今天我们一起看了字母在百变怪上翩翩起舞,也看了一颗扭曲到变形的伤心的心。

    使用Processing制造翻版宠物小精灵是不是很有趣呢,现在Processing基本已经成为设计师与艺术家行业的新宠!使用它可以快速实现自己的交互创意想法,还可以与硬件进行体感互动、人脸识别、语音控制等。

    v2-17edee7968729dcbfea02b8d1057fb13_b.gif
    展开全文
  • HTML中,图像标签是,img英文意思就是image,它是一个自闭合标签,常用的属性包括src、alt和title三个。img标签符常用属性属性说明src图像的文件地址alt图片未加载时替换显示的文字title鼠标移动到图片上提示的...
  • 英文 |https://www.ibrahima-ndaw.com/blog/parallax-effect-with-10-lines-of-javascript/翻译 | web前端开发(web_qdkf)在本文中,我们将使用HTML,CSS和仅10行JavaScript代码来制作一个漂亮的视差效果。...
  • 知识点:tqdmrequestsBeautifulSoup多线程JavaScript动态加载开发环境:Python 3.6Pycharm目标地址https://www.dmzj.com/info/yaoshenji.html代码导入工具import requests import os import re...
  • 玫瑰图是弗罗伦斯·南丁格尔所发明的。又名为极坐标面积图,是一种圆形的直方图。 南丁格尔自己常昵称这类图为...今天,总结了Python代码绘制南丁格尔玫瑰图的方法,代码亲跑无误哦!另外,还是老样子,值得深入学习...
  • html5仿Windows画图工具代码html5在线网页画板插件,界面风格跟功能非常的相似,不过是英文版的。
  • HTML5画板画图工具是一款可定义笔刷和画布的HTML5 Canvas画板画图工具。
  • 5个html5画图程序 源代码
  • 在写代码过程,有时需要...difflib模块difflib模块是python的标准库模块,无需安装,它的作用是对比文本、文件之间的差异,并且可以输出HTML格式的对比分析结果报告。还可以使用该模块对比代码和配置文件的差异,...
  • html5文字特效canvas画图文字粒子动画效果代码
  • H5仿Windows画图工具代码是一款html5仿Windows画图板工具软件代码
  • H5仿Windows画图工具代码是一款html5仿Windows画图板工具软件代码
  • 代码画图,太COOL了 解压后用IE打开Java2Demo.html就可以欣赏了
  • 这篇文章给大家介绍的内容是关于HTML5 canvas实现画图程序(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。项目简介整个项目分为两大部分场景场景负责canvas控制,事件监听,动画处理精灵...
  • Java程序实现图像正逆90度的旋转代码来源:http://www.itivy.com/java/archive/2012/3/9/634668887297849382.html1.[代码][Java]代码import java.awt.BorderLayout;import java.awt.Container;import java.awt....
  • 【Matplotlib】教程:https://morvanzhou.github.io/tutorials/data-manipulation/plt/官方文档:https://matplotlib.org/api/pyplot_summary.html这个模块是一个Python上用于进行绘图的模块。做科研的人经常会使用...
  • 【Matplotlib】教程:https://morvanzhou.github.io/tutorials/data-manipulation/plt/官方文档:https://matplotlib.org/api/pyplot_summary.html这个模块是一个Python上用于进行绘图的模块。做科研的人经常会使用...
  • From:http://blog.chinaunix.net/uid-11829250-id-3472528.html %单y轴 plot(t*1e+9,abs(iGG)/max(abs(iGG)),'k','linewidth',2); axis([-5,5,0,1]) xlabel('时间/ns'); ...
  • 我很高兴这么多人对我的画图版感兴趣,向我索要源代码。因此要再次作一下生明:我去年系统崩溃,所有文档都丢失了,包括这份元代吗,本人有刚刚开始研究生的学习,平时比较忙,所以关于源代码的重新实现还要有一段...
  • 一个有趣的画图板,用了HTML5中的本地存储、下载、canvas等技术,这个项目中用到了canvas的很多基础功能,初学者可以学习一下。 建议开发童鞋使用统一开发环境UDE来进行查看、调试、开发~~~统一开发环境是一款...
  • 开发工具Python版本:3.6.4相关模块...效果如下:turtle文档:https://docs.python.org/zh-cn/3.7/library/turtle.html代码里有不懂的可以参考这个turtle文档~这里只介绍一下用到的:seth:设置朝向;fd:前进;circ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 619
精华内容 247
关键字:

html画图代码