使用p5.js臨摹動態(tài)圖形
一、臨摹
最近正在學(xué)習(xí)用代碼繪圖,于是按照下面的動態(tài)圖形自己臨摹了一幅圖形

臨摹結(jié)果
觀察發(fā)現(xiàn),整個圖案都是由基礎(chǔ)的正六邊形組成
首先創(chuàng)建一個畫布
function setup() {
createCanvas(400, 400);
}
畫六邊形的函數(shù)為
function polygon(x, y, radius, npoints) {//繪制正多邊形函數(shù)
let angle = TWO_PI / npoints;
beginShape();
for (let a = 0; a < TWO_PI; a += angle) {
let sx = x + sin(a) * radius;
let sy = y + cos(a) * radius;
vertex(sx, sy);
}
endShape(CLOSE);
}
x,y分別表示六邊形的位置,radius表示圖形的邊長,npoints表示圖形的邊數(shù)
發(fā)現(xiàn)六邊形一直在繞著自己的中心旋轉(zhuǎn),并未發(fā)生其他變換,因此只需要將六邊形批量創(chuàng)建,并使它不斷旋轉(zhuǎn)即可。
通過循環(huán)以及平移函數(shù)畫出六邊形
通過translate函數(shù)不斷更改六邊形的中心位置,

通過時間函數(shù),達到不斷旋轉(zhuǎn)的效果
完整代碼如下
function setup() {
createCanvas(400, 400);
}
function draw() {
background(10,10,10);
var t=millis()/2000;
fill(123,0,0);
for(var j=0;j<=4;j++){
for(var h=0;h<=4;h++){
push();
translate(width *(0.1+j*0.2),height*(0.17+h*0.34));
rotate(t);
polygon(0,0,40 ,6);
pop();
}
}
for(var i=0;i<=5;i++){
for(var k=0;k<=5;k++){
push();
translate(width *i*0.2,height*k*0.34);
rotate(t);
polygon(0,0,40 ,6);
pop();
}
}
}
function polygon(x, y, radius, npoints) {//繪制正多邊形函數(shù)
let angle = TWO_PI / npoints;
beginShape();
for (let a = 0; a < TWO_PI; a += angle) {
let sx = x + sin(a) * radius;
let sy = y + cos(a) * radius;
vertex(sx, sy);
}
endShape(CLOSE);
}
效果圖

圖形改編
只做了微小的改變,顏色可以隨機切換,且有一個由小變大的過程

代碼如下
function setup() {
createCanvas(400, 400);
}
function draw() {
background(0,10,200);
var t=5*millis()/1000;
//fill(211,0,0);
for(var j=0;j<=4;j++){
for(var h=0;h<=4;h++){
push();
translate(width *(0.1+j*0.2),height*(0.17+h*0.34));
rotate(frameCount / 22.0);
let c2=random(100,255);
fill(0,c2,0);
if (t<50)
{polygon(0,0,t ,6);}
if(t>50)
{
fill(255,0,0);
polygon(0,0,50 ,6);
}
pop();
}
}
for(var i=0;i<=5;i++){
for(var k=0;k<=5;k++){
push();
translate(width *(0+i*0.2),height*(0+k*0.34));
rotate(frameCount / 22.0);
let c2=random(100,255);
fill(0,c2,0);
if (t<50)
{polygon(0,0,t ,6);}
if(t>50)
{
fill(0,255,0);
polygon(0,0,50 ,6);
}
pop();
}
}
}
function polygon(x, y, radius, npoints) {//繪制正多邊形函數(shù)
let angle = TWO_PI / npoints;
beginShape();
for (let a = 0; a < TWO_PI; a += angle) {
let sx = x + sin(a) * radius;
let sy = y + cos(a) * radius;
vertex(sx, sy);
}
endShape(CLOSE);
}
總結(jié)
本次實驗讓我對代碼編程有了初步的了解,逐漸學(xué)回了分析問題和解決問題,雖然目前解決的都還是很簡單的問題。做的圖形也不夠有創(chuàng)意,這門課程很有意思,希望后面自己可以抽出更多的時間來進行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Javascript中eval函數(shù)的詳細用法與說明
Javascript中eval函數(shù)的詳細用法與說明...2007-03-03
JavaScript 嚴格模式(use strict)用法實例分析
這篇文章主要介紹了JavaScript 嚴格模式(use strict)用法,結(jié)合實例形式分析了JavaScript 嚴格模式的基本功能、用法及操作注意事項,需要的朋友可以參考下2020-03-03
在JavaScript中添加css樣式(js追加類)代碼示例
這篇文章主要給大家介紹了關(guān)于在JavaScript中如何添加css樣式,也就是js追加類的相關(guān)資料,JavaScript是一種廣泛應(yīng)用于互聯(lián)網(wǎng)開發(fā)的編程語言,它能夠幫助網(wǎng)頁實現(xiàn)動態(tài)效果和交互性,需要的朋友可以參考下2024-01-01
bootstrap 路徑導(dǎo)航 分頁 進度條的實例代碼
本文通過實例代碼給大家介紹了bootstrap 路徑導(dǎo)航 分頁 進度條的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
Java通過WebSocket實現(xiàn)異步導(dǎo)出解決思路
這篇文章主要介紹了通過WebSocket實現(xiàn)異步導(dǎo)出,本篇文章記錄大批量數(shù)據(jù)導(dǎo)出時間過長,導(dǎo)致接口請求超時問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01
javascript觸發(fā)模擬鼠標(biāo)點擊事件
這篇文章主要介紹了javascript觸發(fā)模擬鼠標(biāo)點擊事件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-06-06

