美文网首页@IT·互联网手绘
那个站在科学与艺术路口撸码绘的女同学(一)

那个站在科学与艺术路口撸码绘的女同学(一)

作者: DDA中值微分法 | 来源:发表于2018-11-19 22:31 被阅读30次

    > 因本学期接触了《互动媒体》这门课程,了解到了“码绘”的神奇,所以总结两篇文章,记录自己码绘路上的辛酸喜乐。《那个站在科学与艺术路口撸码绘的女同学(一)》主要为静态码绘,而(二)主要为动态码绘分享,若有错误请指出,欢迎下方留言区评论交流。

    码绘是啥?

    码绘是啥?你看这个是吗?

    这就是颗大白菜上画了几条向量,是个啥码绘啊?!博主你不要逗我。

    那你再看这个,又是啥?

    这就是刚刚那颗大白菜啊,舞动的大白菜,现在算码绘了吧?

    这颗大白菜其实是圆心出发每一个弧度上半径都不一样的一个圆,然后嵌套另外一个圆,用迭代的方法生成不同的弧度然后根据弧度生成不同的半径,然后再利用sin正弦波+时间,让半径动起来,于是就是一颗跳舞的大白菜。

    //作者:叶师傅

    //链接:用Processing写一颗跳舞的大白菜是什么感受?

    //来源:知乎

    //著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    void setup() {

    size(1280, 720, OPENGL);

    }

    void draw() {

    background(0);

    strokeWeight(2);

    stroke(255);

    noFill();

    //迭代生成带半径不停变化的圆

    for (int i = 0; i < 300; i=i+40) {

    int vertexCount = int(map(i, 0, 299, 3, 100));

    //圆上点的个数随着半径不同而不同

    mPolygon(width/2, height/2, vertexCount, i, i/10);

    }

    }

    void mPolygon(int x, int y, int numOfVertx, int br, int rOff) {

    beginShape();

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

    //正玄波结合时间给一个周而复始的时间区间

    float pingPong = sin(radians(millis()/10.0+100*i));

    //圆的半径在时间区间内循环往复

    float r = br+map(pingPong, -1, 1, -rOff, rOff);

    //根据圆心位置和半径计算圆上的点

    vertex(x+cos(radians(i*360/numOfVertx))*r,

    y+sin(radians(i*360/numOfVertx))*r);

    }

    endShape(CLOSE);

    }

    ```

    所以啥是码绘呢?简而言之就是“用代码绘画”。

    我的码绘之旅

    (答应我,看我第一幅码绘别说“chiou”!!)

    了解了什么是码绘,我就兴致勃勃的开始尝试第一幅码绘,我的工具是P5.js。((p5.js Web Editor)有自己的在线编辑器,使用js语言在VsCode中编辑也十分方便,(p5.js | reference)也可以直接翻译成中文,方便阅读。)

    本次实验,我先构思好要画的图,把他们分解成每一个基础的单一图形,比如点、线、圆形、矩形等等,然后确定每个图形的坐标和大小,最后用P5.js来编写代码,实现静态图片的绘制。而用手绘的方法,我就是照猫画虎,对照着代码画出来的图画,只考虑了图形图案的大致位置,而没有像编程一样,要精确的计算每一个元素图案的准确位置。

    这个看似丑陋并且简单的图画,当时却画了很久来调整大小、位置。完整P5.js代码如下:

    let sun_y=0;

    function setup() {

    createCanvas(1000, 500);

    // noStroke();

    }

    function draw() {

    background(237,222,139);

    strokeWeight(20);

    sun_y += 1

    if(sun_y==200){

    sun_y=1

    }

    background(204);

    // 绘制一个太阳

    fill(255,0,0)

    stroke(255, 255, 0)

    strokeWeight(6)

    ellipse(360, sun_y, 100, 100)

    // 开始绘制山的图形

    // 设置颜色为灰色

    fill(45,45,45)

    stroke(0, 0, 0)

    strokeWeight(1)

    quad(10,200,280,40,300,350,0,350);

    quad(200,160,500,100,500,350,280,350);

    quad(650,220,800,170,1000,350,680,350);

    quad(450,200,600,50,700,350,400,350);

    // 结束绘制图形

    ellipse(350, 400, 90, 90); // 车轮

    ellipse(650, 400, 90, 90);

    fill(0, 0, 160); // Red color

    quad(450,180,550,180,750,400,250,400);//顶

    fill(255, 0, 160); // Red color

    quad(250,300,750,300,750,400,250,400);//车厢

    fill(96,13,159);

    fill(0,255,0);//树

    triangle(100,200,170,300,30,300);

    triangle(100,280,170,380,30,380);

    fill(155,74,18);

    quad(95,380,105,380,105,480,95,480);

    fill(0,255,0);

    triangle(900,200,970,300,830,300);//树

    triangle(900,280,970,380,830,380);

    fill(155,74,18);

    quad(895,380,905,380,905,480,895,480);

    }

    使用P5.js作画的困难在于,需要先确定好要怎么做,做什么样,精确的计算坐标、大小,不能出现一点错误,不然会影响全局。而手绘可以边画边想,并且修改容易,局部对整体的影响没有代码的大,可以画的图形可选性也大。

    码绘不是都像我这么low的,下面我用大佬的码绘作品证明给你看。

    码绘能有多性感?

    先前,Kyle McCormick 在 StackExchange 上发起了一个叫做Tweetable Mathematical Art 的比赛,参赛者需要用三条推这么长的代码来生成一张图片。具体地说,参赛者需要用 C++ 语言编写 RD 、 GR 、 BL 三个函数,每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数(0 ≤ i, j ≤ 1023),然后需要返回一个 0 到 255 之间的整数,表示位于 (i, j) 的像素点的颜色值。举个例子,如果 RD(0, 0) 和 GR(0, 0) 返回的都是 0 ,但 BL(0, 0) 返回的是 255 ,那么图像的最左上角那个像素就是蓝色。参赛者编写的代码会被插进下面这段程序当中(我做了一些细微的改动),最终会生成一个大小为 1024×1024 的图片。

    这是网站上暂时排名第一的作品,它的代码是:

    unsigned char RD(int i,int j){

    float s=3./(j+99);

    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;

    return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;

    }

    unsigned char GR(int i,int j){

    float s=3./(j+99);

    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;

    return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;

    }

    unsigned char BL(int i,int j){

    float s=3./(j+99);

    float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;

    return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;

    }

    还有其他一些优秀作品和代码,可以进入链接查看[用三段 140 字符以内的代码生成一张 1024×1024 的图片](用三段 140 字符以内的代码生成一张 1024×1024 的图片)

    > 以上内容来自知乎——烧茄子,原文 by Matrix67

    以上就是来自刚接触码绘并且被大佬码绘震惊吸引的小白——珠珠同学。下篇博客中我将继续分享动态码绘的相关知识。欢迎各位大佬点赞、留言评论,带小白我一起飞。

    本篇首发于CSDN,引用请注明出处。

    那个站在科学与艺术路口撸码绘的女同学(一) - weixin_41662865的博客 - CSDN博客

    那个站在科学与艺术路口撸码绘的女同学(二) - weixin_41662865的博客 - CSDN博客

    知乎:Karmy - 知乎

    也欢迎微信联系交流:DDA-zhu-

    相关文章

      网友评论

        本文标题:那个站在科学与艺术路口撸码绘的女同学(一)

        本文链接:https://www.haomeiwen.com/subject/cpszfqtx.html