p5.js绘制七巧板图案2020-09-02

七巧板

七巧板大家都熟悉的,有一段时间因缘巧合,了解到七巧板在幼儿数学中应用比较普遍。有道幼儿数学思维课的教具中也有七巧板。上图是一个五年级的小朋友,自己用p5.js画的七巧板,钻研了很久,我表示很开心。下面是他的代码:

function setup() {
    createCanvas(300,300);
    strokeWeight(2)
}

function draw() {
    background(255 ,165 ,0)
    noStroke()
    fill(0, 255, 255)
    triangle(0,0,width,0,width/2,height/2)
    fill(192 ,255 ,62)
    triangle(0,0,0,height,width/2,height/2)
    fill(255, 215 ,0    )
    triangle(width,height,width/2,height,width,height/2)
    fill(205, 92, 92    )
    triangle(0,height,width/2,height,width/2/2,height/4*3)
    fill(255, 255, 0)
    triangle(width/2,height/2,width/2,height,width/2/2,height/4*3)
    triangle(width/2,height/2,width/2,height,width/4*3,height/4*3)
    fill(191, 62 ,255   )
    triangle(width/2,height/2,width/4*3,height/4*3,width/4*3,height/4)
}

他绘制的过程中,因为涉及到平行四边形,所以问我平行四边形怎么绘制,我回答说用vertext不过想来是没想通,其实他的画法是正方形用了2个三角形拼出来的,橙色的平行四边形其实没有绘制,是底下漏出来的背景色,如果把background(255 ,165 ,0)改成background(255 ,0,0)就可以发现了:

红色背景色

不过解决了问题还是挺好的,能够用width和height表示宽度和高度的变量,表示三角形各个顶点,也是很不错的。这里平行四边形用vertex是可以的,因为实际上坐标他已经知道了(如下图),看起来是vertex用的不熟悉。包括正方形也是可以画的,当然正方形也可以话个正方形,然后用poppush旋转45°。

image.png
beginShape()
vertext(x1, y1)
vertext(x2, y2)
vertext(x3, y3)
vertext(x4, y4)
endShape(CLOSE)

从这里说开去,有没有其他的画法呢?有的,可以绘制小一点,然后放大,然后画一个三角形然后利用平移得到其他三角形,方法还是挺多的。本身坐标不是很复杂,可以直接画出来,计算出每个点的坐标,也可以在原点复制,然后考虑平移变换,涉及到的知识点有所差别。
先用坐标计算的方法绘制

function setup() {
    createCanvas(300, 300);
  }
  
  
  function draw() {
    background(0);
    fill('red')
    triangle(0,0,0,height,width/2,height/2)
    fill('blue')
    triangle(0,0,width,0,width/2,height/2)
    fill('green')
    triangle(0,height,width/4,height*3/4,width/2,height)
    fill('orange')
    triangle(width*3/4, height/4, width/2, height/2,width*3/4,height*3/4)    
    fill('purple')
    triangle(width,height/2,width/2,height,width,height)
    // 长方形


    // 平行四边形
  }

这样就剩下平行四边形和正方形了,黑色的背景露出来了


黑色背景露出
function setup() {
    createCanvas(300, 300);
  }
  
  
  function draw() {
    background(0);
    // 不需要边框
    noStroke()
    fill('red')
    triangle(0,0,0,height,width/2,height/2)
    fill('blue')
    triangle(0,0,width,0,width/2,height/2)
    fill('green')
    triangle(0,height,width/4,height*3/4,width/2,height)
    fill('orange')
    triangle(width*3/4, height/4, width/2, height/2,width*3/4,height*3/4)    
    fill('purple')
    triangle(width,height/2,width/2,height,width,height)
    // 长方形
    fill('pink')
    beginShape()
    vertex(width/2,height/2)
    vertex(width/4,height*3/4)
    vertex(width/2,height)
    vertex(width*3/4,height*3/4)
    endShape(CLOSE)

    // 平行四边形
    fill('yellow')
    beginShape()
    vertex(width,0)
    vertex(width, height/2)
    vertex(3*width/4,3*height/4)
    vertex(width*3/4,height/4)
    endShape(CLOSE)
  }
绘制结束

当然了,除了vertex还有就是,四边形函数了,实际上最佳单:

四边形函数,实际上简单

function setup() {
    createCanvas(300, 300);
  }
  
  
  function draw() {
    background(0);
    // 不需要边框
    noStroke()
    fill('red')
    triangle(0,0,0,height,width/2,height/2)
    fill('blue')
    triangle(0,0,width,0,width/2,height/2)
    fill('green')
    triangle(0,height,width/4,height*3/4,width/2,height)
    fill('orange')
    triangle(width*3/4, height/4, width/2, height/2,width*3/4,height*3/4)    
    fill('purple')
    triangle(width,height/2,width/2,height,width,height)
    // 长方形
    fill('pink')
    quad(width/2,height/2,width/4,height*3/4,width/2,height,width*3/4,height*3/4)

    // 平行四边形
    fill('yellow')
    quad(width,0,width, height/2,3*width/4,3*height/4,width*3/4,height/4)
  }

当然对于几何图形理解的点不同,理解图形有多少个顶点,顶点连线形成图形;或者在理解图形的概念,掌握图形含义的基础上直接操作图形。

function setup() {
    createCanvas(300, 300);
    angleMode(DEGREES)
  }
  
  
  function draw() {
    background(0);
    // 不需要边框
    noStroke()
    fill('red') 
    push()
    triangle(0, 0,width/2,height/2,0,height)
    pop()

    fill('blue')
    push()
    translate(width,0)
    rotate(90)
    triangle(0, 0,width/2,height/2,0,height)
    pop()
    
    fill('green')
    push()
    translate(width*3/4,height*3/4)
    scale(1/2)
    rotate(180)
    triangle(0, 0,width/2,height/2,0,height)
    pop()
    
    fill('orange')
    push()
    translate(width*3/4,height*3/4)
    scale(1/2)
    rotate(180)
    triangle(0, 0,width/2,height/2,0,height)
    pop()
    
    fill('purple')
    
    // 长方形
    fill('pink')
    quad(width/2,height/2,width/4,height*3/4,width/2,height,width*3/4,height*3/4)

    // 平行四边形
    fill('yellow')
    quad(width,0,width, height/2,3*width/4,3*height/4,width*3/4,height/4)
  }
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269