@IT·互联网手绘

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

2018-11-19  本文已影响30人  DDA中值微分法

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

码绘是啥?

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

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

那你再看这个,又是啥?

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

这颗大白菜其实是圆心出发每一个弧度上半径都不一样的一个圆,然后嵌套另外一个圆,用迭代的方法生成不同的弧度然后根据弧度生成不同的半径,然后再利用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-

上一篇下一篇

猜你喜欢

热点阅读