水排序

简介

主要是水面倾斜,水分层,水波纹三合一的效果。

有关水面倾斜计算方案

方案来源于 白玉无冰
链接: https://mp.weixin.qq.com/s/DXl7_rvI5fS3Fg-OmHvgmg

核心原理

水面倾斜后水体的体积不变,已知水体高度,水体的宽度,以及旋转的角度,那么可以求得在水倾斜到某个角度后,倾斜各点的顶点位置,即可进行水体的绘制达到倒水的效果。

那么以最底层为例子,朝着一边倒水的时候会出现两种情况:

这样就能计算出每一次水体偏高一边点的位置。

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

private drawOneWater(height: number, color: Color) {
// 三角函数中弧度值得求值方式 角度/180*Math.Pi
const radiansA = this.bottleAngle / 180 * Math.PI;
//计算临界角度
const radiansM = Math.atan(2 * height / this.bottleWidth);
// 对于梯形的情况这个是新增的高度
const tempWTan = this.bottleWidth * Math.tan(radiansA);
this.drawGraphics.fillColor = color;
// 当前角度如果小于其临界值,还有两种情况。当前角度是逆时针(负数),还是顺时针。
if (radiansA <= radiansM) {
// 这种情况是当逆时针旋转的值大于了临界值,形成了三角形
if (radiansA < -radiansM) {
// 三角形 逆时针
let hL = Math.sqrt(2 * height * -tempWTan);
// 超出高度处理
hL = hL > this.bottleHeight ? this.bottleHeight : hL;
const bW = hL / Math.tan(-radiansA);
this.drawGraphics.moveTo(this.bottleWidth, 0);
this.drawGraphics.lineTo(this.bottleWidth, hL);
this.drawGraphics.lineTo(this.bottleWidth - bW, 0);
this.drawGraphics.lineTo(this.bottleWidth, 0);
} else {
// 梯形,包含顺逆时针
this.drawGraphics.moveTo(0, 0);
let hL = height + tempWTan / 2;
// 超出高度处理
let cutOffset = 0;
if (hL > this.bottleHeight) {
cutOffset += hL - this.bottleHeight
}
let hR = height - tempWTan / 2;
if (hR > this.bottleHeight) {
cutOffset += hR - this.bottleHeight
}

this.drawGraphics.lineTo(this.bottleWidth, 0);
this.drawGraphics.lineTo(this.bottleWidth, hR - cutOffset);
this.drawGraphics.lineTo(0, hL - cutOffset);
this.drawGraphics.lineTo(0, 0);
}
} else {
// 三角形 顺时针
let hL = Math.sqrt(2 * height * tempWTan);
// 超出高度处理
hL = hL > this.bottleHeight ? this.bottleHeight : hL;
const bW = hL / Math.tan(radiansA);
this.drawGraphics.moveTo(0, 0);
this.drawGraphics.lineTo(bW, 0);
this.drawGraphics.lineTo(0, hL);
this.drawGraphics.lineTo(0, 0);
}
this.drawGraphics.fill();
}

水排序
https://chenhongjun.top/2023/02/21/水排序/
作者
Delightening
发布于
2023年2月21日
许可协议