WebGL

博客分类: 江河计划

WebGL

算法

字谜分组

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
var groupAnagrams = function(strs) {
    var map = [];
    for(var i=0; i<strs.length; i++){
        var sortStr = strs[i].split('').sort().join('');
        if(!map[sortStr]){
            map[sortStr] = [];
            
        }
        map[sortStr].push(strs[i]);
    }
    return Object.values(map)
};

webGL 基础图形

点          gl.POINT
线段        gl.LINES
线条        gl.LINE_STRIP
回路        gl.LINE_LOOP
三角形      gl.TRIANGLES
三角带      gl.TRIANGLE_STRIP
三角扇      gl.TRIANGLE_FAN
var canvas = this.$refs.canvas
canvas.width = window.innerWidth - 200;
canvas.height = window.innerHeight - 56;
var VSHADER_SOURCE = `
    attribute vec4 a_Position;
    uniform float u_CosB, u_SinB;
    void main() {
        gl_Position.x = a_Position.x * u_CosB - a_Position.y * u_SinB;
        gl_Position.y = a_Position.x * u_SinB + a_Position.y * u_CosB;
        gl_Position.z = a_Position.z;
        gl_Position.w = 1.0;
    }
`;
var FSHADER_SOURCE = `
    precision mediump float;
    uniform vec4 u_FragColor;
    void main() {
        gl_FragColor = u_FragColor;
    }
`;
var gl = canvas.getContext('webgl');
this.gl = gl;
this.points = [];
initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE);
this.a_Position = gl.getAttribLocation(gl.program, 'a_Position');
var radian = Math.PI * 90 / 180;
var cosB = Math.cos(radian)
var sinB = Math.sin(radian)
this.u_CosB = gl.getUniformLocation(gl.program, 'u_CosB');
this.u_SinB = gl.getUniformLocation(gl.program, 'u_SinB');
gl.uniform1f(this.u_CosB, cosB)
gl.uniform1f(this.u_SinB, sinB)
this.u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

clickAction(e) {
    var canvas = this.$refs.canvas
    var x = (e.offsetX - canvas.width / 2) / canvas.width * 2;
    var y = (canvas.height / 2 - e.offsetY) / canvas.height * 2;
    this.points.push({
        x,
        y,
        colorR: `${Math.round(Math.random())}.0`,
        colorG: `${Math.round(Math.random())}.0`,
        colorB: `${Math.round(Math.random())}.0`

    })
    this.gl.clearColor(0.0, 0.0, 0.0, 1.0);
    this.gl.clear(this.gl.COLOR_BUFFER_BIT);
    var vertexBuffer = this.gl.createBuffer();
    var arr = []
    this.points.map(item => {
        arr.push(item.x);
        arr.push(item.y);
    })
    this.gl.bindBuffer(this.gl.ARRAY_BUFFER, vertexBuffer)
    this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(arr), this.gl.STATIC_DRAW);
    this.gl.vertexAttribPointer(this.a_Position, 2, this.gl.FLOAT, false, 0, 0);
    this.gl.enableVertexAttribArray(this.a_Position);
    // this.points.map(item => {
    //     this.gl.vertexAttrib3f(this.a_Position, item.x, item.y, 0.0);
    //     this.gl.uniform4f(this.u_FragColor, item.colorR, item.colorG, item.colorB, 1.0)
    // })
    this.gl.drawArrays(this.gl.TRIANGLES, 0, this.points.length);
}

移动、旋转和缩放

平移

对顶点进行逐点操作,平移所有顶点向量

attribute vec4 a_Position;
attribute vec4 a_Translation;
void main() {
    gl_Position = a_Position + a_Translation;
}

旋转

旋转需要:旋转轴、旋转方向、旋转角度

attribute vec4 a_Position;
uniform float u_CosB, u_SinB;
void main() {
    gl_Position.x = a_Position.x * u_CosB - a_Position.y * u_SinB;
    gl_Position.y = a_Position.x * u_SinB + a_Position.y * u_CosB;
    gl_Position.z = a_Position.z;
    gl_Position.w = 1.0;
}

var radian = Math.PI * 90 / 180;
var cosB = Math.cos(radian)
var sinB = Math.sin(radian)
this.u_CosB = gl.getUniformLocation(gl.program, 'u_CosB');
this.u_SinB = gl.getUniformLocation(gl.program, 'u_SinB');
gl.uniform1f(this.u_CosB, cosB)
gl.uniform1f(this.u_SinB, sinB)