Compare commits
10
Commits
2eea319e54
...
5fa619a73a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5fa619a73a | ||
|
|
4125e3b375 | ||
|
|
baee74ef27 | ||
|
|
47cf734493 | ||
|
|
055d4531f0 | ||
|
|
b17eb6490f | ||
|
|
fdc7c33fe8 | ||
|
|
41389c04da | ||
|
|
a5c077c5db | ||
|
|
7096f66a6d |
@@ -28,6 +28,8 @@ export default defineUserConfig({
|
|||||||
lastUpdated: false,
|
lastUpdated: false,
|
||||||
repo: "https://github.com/thejinchao/thejinchao.github.io",
|
repo: "https://github.com/thejinchao/thejinchao.github.io",
|
||||||
colorMode: "light",
|
colorMode: "light",
|
||||||
|
editLink : false,
|
||||||
|
contributors : false,
|
||||||
}),
|
}),
|
||||||
head:[
|
head:[
|
||||||
['link', { rel: 'icon', href: 'favicon.png' }]
|
['link', { rel: 'icon', href: 'favicon.png' }]
|
||||||
|
|||||||
@@ -40,7 +40,15 @@ module.exports = [
|
|||||||
"2025/02/DH.md",
|
"2025/02/DH.md",
|
||||||
"2025/02/SegmentCircle.md",
|
"2025/02/SegmentCircle.md",
|
||||||
"2025/02/Ellipse.md",
|
"2025/02/Ellipse.md",
|
||||||
"2025/02/Fibonacci.md"
|
"2025/02/Fibonacci.md",
|
||||||
|
{
|
||||||
|
text: '匀速贝塞尔曲线运动的实现',
|
||||||
|
collapsible: true,
|
||||||
|
children: [
|
||||||
|
{ text: "Part1", link: "2025/03/BezierLine01.md" },
|
||||||
|
{ text: "Part2", link: "2025/03/BezierLine02.md" }
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/p5@1.4.2/lib/p5.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/p5@1.4.2/lib/p5.js"></script>
|
||||||
<script src="/js/bezier_app.js"></script>
|
<script src="/js/bezier_quad.js"></script>
|
||||||
<script src="/js/bezier_base.js"></script>
|
<script src="/js/bezier_base.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body style="margin:0px; padding:0px; overflow: hidden">
|
<body style="margin:0px; padding:0px; overflow: hidden">
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/p5@1.4.2/lib/p5.js"></script>
|
||||||
|
<script src="/js/bezier_cubic.js"></script>
|
||||||
|
<script src="/js/bezier_base.js"></script>
|
||||||
|
</head>
|
||||||
|
<body style="margin:0px; padding:0px; overflow: hidden">
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var lineSegments;
|
||||||
|
var cubicBezierLine;
|
||||||
|
var P0={x:10.0, y:10.0}, P1={x:100.0, y:160.0}, P2={x:350.0, y:200.0}, P3={x:300.0, y:80.0};
|
||||||
|
|
||||||
|
function setup() {
|
||||||
|
const searchParams = new URLSearchParams(window.location.search);
|
||||||
|
let uniformSpeed = searchParams.get('uniformSpeed')!=0;
|
||||||
|
|
||||||
|
canvas = createCanvas(windowWidth, windowHeight);
|
||||||
|
|
||||||
|
lineSegments = new LineSegments();
|
||||||
|
lineSegments.addPoint(P0.x, P0.y);
|
||||||
|
lineSegments.addPoint(P1.x, P1.y);
|
||||||
|
lineSegments.addPoint(P2.x, P2.y);
|
||||||
|
lineSegments.addPoint(P3.x, P3.y);
|
||||||
|
|
||||||
|
cubicBezierLine = new CubicBezierLine(P0, P1, P2, P3, 20, uniformSpeed)
|
||||||
|
}
|
||||||
|
|
||||||
|
function draw() {
|
||||||
|
clear();
|
||||||
|
background('white');
|
||||||
|
noStroke();
|
||||||
|
|
||||||
|
lineSegments.draw();
|
||||||
|
cubicBezierLine.draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
function mousePressed(){
|
||||||
|
lineSegments.handleMousePressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
function mouseDragged(){
|
||||||
|
lineSegments.handleMouseDragged();
|
||||||
|
}
|
||||||
|
|
||||||
|
function mouseReleased(){
|
||||||
|
lineSegments.handleMouseReleased();
|
||||||
|
cubicBezierLine.updatePoints(lineSegments.points[0], lineSegments.points[1], lineSegments.points[2], lineSegments.points[3]);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 211 KiB |
@@ -0,0 +1,116 @@
|
|||||||
|
class CubicBezierLine {
|
||||||
|
constructor(_p0, _p1, _p2, _p3, _step, _uniformSpeedMode) {
|
||||||
|
this.step=_step;
|
||||||
|
this.points=[];
|
||||||
|
this.uniformSpeedMode=_uniformSpeedMode;
|
||||||
|
this.updatePoints(_p0, _p1, _p2, _p3);
|
||||||
|
}
|
||||||
|
|
||||||
|
position(t) {
|
||||||
|
let it = 1-t;
|
||||||
|
let x = it*it*it*this.p0.x + 3*it*it*t*this.p1.x +
|
||||||
|
3*it*t*t*this.p2.x + t*t*t*this.p3.x;
|
||||||
|
let y =it*it*it*this.p0.y + 3*it*it*t*this.p1.y +
|
||||||
|
3*it*t*t*this.p2.y + t*t*t*this.p3.y;
|
||||||
|
return {x:x, y:y}
|
||||||
|
}
|
||||||
|
|
||||||
|
speed(t) {
|
||||||
|
let it = 1-t;
|
||||||
|
let sx = -3 * this.p0.x*it*it + 3*this.p1.x*it*it -
|
||||||
|
6*this.p1.x*it*t + 6*this.p2.x*it*t - 3*this.p2.x*t*t + 3*this.p3.x*t*t;
|
||||||
|
let sy = -3 * this.p0.y*it*it + 3*this.p1.y*it*it -
|
||||||
|
6*this.p1.y*it*t + 6*this.p2.y*it*t - 3*this.p2.y*t*t + 3*this.p3.y*t*t;
|
||||||
|
return Math.sqrt(sx*sx+sy*sy);
|
||||||
|
}
|
||||||
|
|
||||||
|
length(t){
|
||||||
|
//使用simpson算法的分割数
|
||||||
|
const TOTAL_SIMPSON_STEP = 1000;
|
||||||
|
//分割份数
|
||||||
|
let stepCounts = Math.floor(TOTAL_SIMPSON_STEP*t);
|
||||||
|
if(stepCounts & 1) stepCounts++; //偶数
|
||||||
|
if(stepCounts==0) return 0.0;
|
||||||
|
|
||||||
|
let halfCounts = stepCounts/2;
|
||||||
|
let sum1=0.0, sum2=0.0;
|
||||||
|
let dStep = t/stepCounts;
|
||||||
|
|
||||||
|
for(var i=0; i<halfCounts; i++) {
|
||||||
|
sum1 += this.speed((2*i+1)*dStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(var i=1; i<halfCounts; i++) {
|
||||||
|
sum2 += this.speed((2*i)*dStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (this.speed(0.0) + this.speed(1.0)+2*sum2+4*sum1)*dStep/3.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
length_from_table(t) {
|
||||||
|
//通过查表获取t对应的曲线长度
|
||||||
|
if(t<=0) return 0;
|
||||||
|
if(t>=1.0) return this.length_table[this.length_table.length-1];
|
||||||
|
|
||||||
|
let step=t*this.step;
|
||||||
|
let low_bounder = Math.floor(step);
|
||||||
|
let lerp = step-low_bounder;
|
||||||
|
|
||||||
|
return this.length_table[low_bounder]*(1-lerp)+this.length_table[low_bounder+1]*lerp;
|
||||||
|
}
|
||||||
|
|
||||||
|
//根据t推导出匀速运动自变量t'的方程(使用牛顿切线法)
|
||||||
|
invertLength(t, target_length) {
|
||||||
|
let t1 = t, t2;
|
||||||
|
do {
|
||||||
|
t2 = t1 - (this.length_from_table(t1)-target_length)/this.speed(t1);
|
||||||
|
if(abs(t1-t2)<0.00001) break;
|
||||||
|
t1=t2;
|
||||||
|
}while(true);
|
||||||
|
return t2;
|
||||||
|
}
|
||||||
|
|
||||||
|
updatePoints(_p0, _p1, _p2, _p3) {
|
||||||
|
this.p0=_p0;
|
||||||
|
this.p1=_p1;
|
||||||
|
this.p2=_p2;
|
||||||
|
this.p3=_p3;
|
||||||
|
|
||||||
|
let ax = this.p0.x - 2 * this.p1.x + this.p2.x;
|
||||||
|
let ay = this.p0.y - 2 * this.p1.y + this.p2.y;
|
||||||
|
let bx = 2 * this.p1.x - 2 * this.p0.x;
|
||||||
|
let by = 2 * this.p1.y - 2 * this.p0.y;
|
||||||
|
|
||||||
|
this.A = 4 * (ax * ax + ay *ay);
|
||||||
|
this.B = 4 * (ax * bx + ay *by);
|
||||||
|
this.C = bx * bx + by * by;
|
||||||
|
|
||||||
|
this.points.length = 0;
|
||||||
|
let totalLength = this.length(1);
|
||||||
|
|
||||||
|
//构建一个length table
|
||||||
|
this.length_table=[];
|
||||||
|
for (let index = 0; index <= this.step; index++) {
|
||||||
|
let t = index / this.step;
|
||||||
|
this.length_table.push(this.length(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let index = 1; index < this.step; index++) {
|
||||||
|
let t = index / this.step;
|
||||||
|
let target_length=totalLength*t;
|
||||||
|
|
||||||
|
if(this.uniformSpeedMode) {
|
||||||
|
t = this.invertLength(t, target_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.points.push(this.position(t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
draw() {
|
||||||
|
this.points.forEach(pt => {
|
||||||
|
fill('green');
|
||||||
|
ellipse(pt.x, pt.y, 5, 5);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
class QuadBezierLine {
|
class QuadBezierLine {
|
||||||
constructor(_p0, _p1, _p2, _step, _uniformSpeed) {
|
constructor(_p0, _p1, _p2, _step, _uniformSpeedMode) {
|
||||||
this.step=_step;
|
this.step=_step;
|
||||||
this.points=[];
|
this.points=[];
|
||||||
this.uniformSpeed=_uniformSpeed;
|
this.uniformSpeedMode=_uniformSpeedMode;
|
||||||
this.updatePoints(_p0, _p1, _p2);
|
this.updatePoints(_p0, _p1, _p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12,29 +12,29 @@ class QuadBezierLine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Length(t) = Integrate[Speed[t], t]
|
//Length(t) = Integrate[Speed[t], t]
|
||||||
//Length(t_)=((2*Sqrt[A]*(2*A*t*Sqrt[C+t*(B+A*t)]+B*(Sqrt[C + t*(B + A*t)]-Sqrt[C])) +
|
//Length(t_) = ((2*Sqrt[A]*((2*A*t + B)*Sqrt[A*t^2 + B*t + C] - B*Sqrt[C]) +
|
||||||
// (B^2-4*A*C)(Log[B+2*Sqrt[A]*Sqrt[C]]-Log[B+2*A*t+2*Sqrt[A]*Sqrt[C+t*(B+A*t)]]))/
|
// (B^2 - 4*A*C)*(Log[B + 2*Sqrt[A]*Sqrt[C]] -
|
||||||
// (8* A^(3/2)));
|
// Log[B + 2*A*t + 2*Sqrt[A]*Sqrt[A*t^2 + B*t + C]]))/(8*A^(3/2)))
|
||||||
length(t) {
|
length(t) {
|
||||||
let temp1 = Math.sqrt(this.C + t * (this.B + this.A * t));
|
let temp1 = Math.sqrt(this.C + t * (this.B + this.A * t));
|
||||||
let temp2 = (2 * this.A * t * temp1 + this.B * (temp1 - Math.sqrt(this.C)));
|
let temp2 = (2 * this.A * t + this.B) * temp1 - this.B * Math.sqrt(this.C);
|
||||||
let temp3 = Math.log(this.B + 2 * Math.sqrt(this.A) * Math.sqrt(this.C));
|
let temp3 = Math.log(this.B + 2 * Math.sqrt(this.A * this.C));
|
||||||
let temp4 = Math.log(this.B + 2 * this.A * t + 2 * Math.sqrt(this.A) * temp1);
|
let temp4 = Math.log(this.B + 2 * this.A * t + 2 * Math.sqrt(this.A) * temp1);
|
||||||
let temp5 = 2 * Math.sqrt(this.A) * temp2;
|
let temp5 = 2 * Math.sqrt(this.A) * temp2;
|
||||||
let temp6 = (this.B * this.B - 4 * this.A * this.C) * (temp3 - temp4);
|
let temp6 = (this.B * this.B - 4 * this.A * this.C) * (temp3 - temp4);
|
||||||
return (temp5 + temp6) / (8 * Math.pow(this.A, 1.5));
|
return (temp5 + temp6) / (8 * Math.pow(this.A, 1.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
//X(n+1) = Xn - F(Xn)/F'(Xn)
|
//u'=u-(Length(u)-len)/Speed(u)
|
||||||
invertLength(t, len) {
|
invertLength(u0, len) {
|
||||||
let t1 = t, t2;
|
let u1 = u0, u2;
|
||||||
do {
|
do {
|
||||||
t2 = t1 - (this.length(t1) - len) / this.speed(t1);
|
u2 = u1 - (this.length(u1) - len) / this.speed(u1);
|
||||||
if (Math.abs(t1 - t2) < 0.000001)
|
if (Math.abs(u1 - u2) < 0.000001)
|
||||||
break;
|
break;
|
||||||
t1 = t2;
|
u1 = u2;
|
||||||
} while (true);
|
} while (true);
|
||||||
return t2;
|
return u2;
|
||||||
}
|
}
|
||||||
|
|
||||||
updatePoints(_p0, _p1, _p2) {
|
updatePoints(_p0, _p1, _p2) {
|
||||||
@@ -57,8 +57,7 @@ class QuadBezierLine {
|
|||||||
for (let index = 1; index < this.step; index++) {
|
for (let index = 1; index < this.step; index++) {
|
||||||
let t = index / this.step;
|
let t = index / this.step;
|
||||||
|
|
||||||
if(this.uniformSpeed) {
|
if(this.uniformSpeedMode) {
|
||||||
//根据 L 函数的反函数,求得 l 对应的 t 值
|
|
||||||
t = this.invertLength(t, totalLength*t);
|
t = this.invertLength(t, totalLength*t);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
---
|
|
||||||
title: "匀速贝塞尔曲线运动的实现"
|
|
||||||
tags: 程序 算法
|
|
||||||
---
|
|
||||||
# 匀速贝塞尔曲线运动的实现
|
|
||||||
|
|
||||||
二次贝塞尔曲线通常以如下方式构建,给定二维平面上的固定点$P_0$, $P_1$, $P_2$,用$B(t)$表示该条曲线
|
|
||||||
$$
|
|
||||||
\boldsymbol{B}(t)=(1-t)^2 \boldsymbol{P_0}+2t(1-t) \boldsymbol{P_1}+t^2 \boldsymbol{P_2}
|
|
||||||
$$
|
|
||||||
用一个动画来演示,可以更加清楚的表明这条曲线的构建过程
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
如果$t$变量本身是线性变化的话,这条贝塞尔曲线的生成过程是并不是匀速的,通常都是两头快中间慢。
|
|
||||||
|
|
||||||
<iframe width="100%" height="270" frameborder=0 src="/html/bezier.html?uniformSpeed=0"></iframe>
|
|
||||||
|
|
||||||
可以看出中间的点较为密集,而两边则较为稀疏。
|
|
||||||
如何想要得到匀速的贝塞尔曲线运动呢?比如我们在某款游戏中设计了一条贝塞尔曲线的路径,如何实现玩家匀速在这条路径上运动呢?
|
|
||||||
首先需要求得$B(t)$相对于$t$的速度公式$s(t)$
|
|
||||||
$$
|
|
||||||
s(t)=\sqrt{B_{x}^{'}(t)^2+B_{y}^{'}(t)^2}
|
|
||||||
$$
|
|
||||||
为了简化公式,定义如下变量
|
|
||||||
$$
|
|
||||||
\begin{aligned}
|
|
||||||
\boldsymbol{a}&=\boldsymbol{P_0}-2\boldsymbol{P_1}+\boldsymbol{P_2}\\
|
|
||||||
\boldsymbol{b}&=2\boldsymbol{P_1}-2\boldsymbol{P_0}\\
|
|
||||||
A&=4(a_x^2+a_y^2)\\
|
|
||||||
B&=4(a_xb_x+a_yb_y)\\
|
|
||||||
C&=b_x^2+b_y^2
|
|
||||||
\end{aligned}
|
|
||||||
$$
|
|
||||||
计算出$s(t)$可以表达为
|
|
||||||
$$
|
|
||||||
s(t)=\sqrt{At^2+Bt+C}
|
|
||||||
$$
|
|
||||||
根据这个公式,求得贝塞尔曲线的长度公式$L(t)$为
|
|
||||||
$$
|
|
||||||
\begin{aligned}
|
|
||||||
L(t)&=\int_0^t\sqrt{Ax^2+Bx+C}dx\\
|
|
||||||
&=\frac{1}{8A^{3/2}}\biggl(2\sqrt{A}\left[2At\sqrt{At^2+Bt+C}+B\left(\sqrt{At^2+Bt+C}-\sqrt{C}\right)\right] \\
|
|
||||||
&\quad+(B^2-4AC)\left[ln(B+2\sqrt{AC})-ln\left(B+2At+2\sqrt{A}\sqrt{At^2+Bt+C}\right)\right]\biggr)
|
|
||||||
\end{aligned}
|
|
||||||
$$
|
|
||||||
特别当$t=1.0$时,$L(1.0)$就是这条曲线的总长度。
|
|
||||||
设$t'$是能够使$L$实现匀速运动的自变量,那么此时曲线长度应该满足线性增长,也就是
|
|
||||||
$$
|
|
||||||
L(t')=L(1.0)t\tag{1}
|
|
||||||
$$
|
|
||||||
也就是$t'=L^{-1}(L(1.0)t)$,由于$L(t)$函数非常复杂,直接求其逆函数的解析解几乎不可能,还好我们知道它的导数为$s(t)$,在实际使用中,可以使用[牛顿切线法](https://en.wikipedia.org/wiki/Newton%27s_method)获得$t'$的数值解。
|
|
||||||
设$L_t=L(1.0)t$,视$t'$为未知数,根据公式1有以下方程
|
|
||||||
$$
|
|
||||||
L(t')-L_t=0
|
|
||||||
$$
|
|
||||||
根据牛顿切线法,求解的迭代公式为:
|
|
||||||
$$
|
|
||||||
t'_{n+1}=t'_n-\frac{L(t'_n)-L_t}{s(t'_n)}
|
|
||||||
$$
|
|
||||||
由于$t$和$t'$相差不大,可以设$t_0=t$来开始求解,以下是修正后的匀速贝塞尔曲线
|
|
||||||
|
|
||||||
<iframe width="100%" height="270" frameborder=0 src="/html/bezier.html?uniformSpeed=1"></iframe>
|
|
||||||
|
|
||||||
上面是使用javascript实现的互动曲线,核心代码如下
|
|
||||||
|
|
||||||
@[code js :no-line-numbers](@public/js/bezier_app.js)
|
|
||||||
|
|
||||||
## End
|
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
---
|
||||||
|
title: "匀速贝塞尔曲线运动的实现(一)"
|
||||||
|
tags: 程序 算法
|
||||||
|
---
|
||||||
|
# 匀速贝塞尔曲线运动的实现(一)
|
||||||
|
|
||||||
|
贝塞尔曲线([Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve))是一种常用的曲线,以最简单的二次贝塞尔曲线为例,通常以如下方式构建,给定二维平面上的固定点$P_0$, $P_1$, $P_2$,用$B(t)$表示该条曲线
|
||||||
|
$$
|
||||||
|
\boldsymbol{B}(t)=(1-t)^2 \boldsymbol{P_0}+2t(1-t) \boldsymbol{P_1}+t^2 \boldsymbol{P_2}, t\in[0, 1]
|
||||||
|
$$
|
||||||
|
用一个动画来演示,可以更加清楚的表明这条曲线的构建过程
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
如果$t$变量本身是线性变化的话,这条贝塞尔曲线的生成过程是并不是匀速的,通常都是两头快中间慢。
|
||||||
|
|
||||||
|
<iframe width="100%" height="270" frameborder=0 src="/html/bezier01.html?uniformSpeed=0"></iframe>
|
||||||
|
|
||||||
|
可以看出中间的点较为密集,而两边则较为稀疏。
|
||||||
|
如何得到匀速的贝塞尔曲线运动呢?比如我们在某款游戏中设计了一条贝塞尔曲线的路径,如何实现NPC匀速在这条路径上运动?
|
||||||
|
首先需要求得$B(t)$相对于$t$的速度公式$s(t)$
|
||||||
|
$$
|
||||||
|
s(t)=\sqrt{B_{x}^{'}(t)^2+B_{y}^{'}(t)^2}
|
||||||
|
$$
|
||||||
|
为了简化公式,定义如下变量
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
\boldsymbol{a}&=\boldsymbol{P_0}-2\boldsymbol{P_1}+\boldsymbol{P_2}\\
|
||||||
|
\boldsymbol{b}&=2\boldsymbol{P_1}-2\boldsymbol{P_0}\\
|
||||||
|
A&=4(a_x^2+a_y^2)\\
|
||||||
|
B&=4(a_xb_x+a_yb_y)\\
|
||||||
|
C&=b_x^2+b_y^2
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
计算出$s(t)$可以表达为
|
||||||
|
$$
|
||||||
|
s(t)=\sqrt{At^2+Bt+C}
|
||||||
|
$$
|
||||||
|
根据这个公式,求得贝塞尔曲线的长度公式$L(t)$为
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
L(t)&=\int_0^t\sqrt{Ax^2+Bx+C}dx\\
|
||||||
|
&=\frac{1}{8A^{3/2}}\biggl(2\sqrt{A}\left[(2At+B)\sqrt{At^2+Bt+C}-B\sqrt{C}\right] \\
|
||||||
|
&\quad+(B^2-4AC)\left[ln(B+2\sqrt{AC})-ln\left(B+2At+2\sqrt{A}\sqrt{At^2+Bt+C}\right)\right]\biggr)
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
特别当$t=1.0$时,$L(1.0)$就是这条曲线的总长度。
|
||||||
|
设$u$是能够使$L(u)$实现匀速运动的自变量,那么此时曲线长度应该满足随着时间$t$线性增长,也就是
|
||||||
|
$$
|
||||||
|
L(u)=L(1.0)t\tag{1}
|
||||||
|
$$
|
||||||
|
也就是$u=L^{-1}(L(1.0)t)$,由于$L(t)$函数非常复杂,直接求其逆函数的解析解几乎不可能,还好我们知道它的导数为$s(t)$,在实际使用中,可以使用[牛顿切线法](https://en.wikipedia.org/wiki/Newton%27s_method)获得$u$的数值解。
|
||||||
|
视$u$为未知数,根据公式1有以下方程
|
||||||
|
$$
|
||||||
|
F(u)=L(u)-L(1.0)t=0
|
||||||
|
$$
|
||||||
|
根据牛顿切线法,求解$u$的迭代公式为:
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
u_{n+1}&=u_n-\frac{F(u_n)}{F'(u_n)}\\&=u_n-\frac{L(u_n)-L(1.0)t}{s(u_n)}
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
由于$t$和$u$相差不大,可以设$u_0=t$来开始求解,以下是修正后的匀速贝塞尔曲线
|
||||||
|
|
||||||
|
<iframe width="100%" height="270" frameborder=0 src="/html/bezier01.html?uniformSpeed=1"></iframe>
|
||||||
|
|
||||||
|
上面是使用javascript实现的互动曲线,核心代码如下
|
||||||
|
|
||||||
|
@[code js :no-line-numbers](@public/js/bezier_quad.js)
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
title: "匀速贝塞尔曲线运动的实现(二)"
|
||||||
|
tags: 程序 算法
|
||||||
|
---
|
||||||
|
# 匀速贝塞尔曲线运动的实现(二)
|
||||||
|
|
||||||
|
实际工程应用中最为常见的是三次贝塞尔曲线,也就是下面这种用4个控制点生成的曲线
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
三次贝塞尔曲线的一个方便之处在于可以将相邻的两个控制点之间的连线视作控制点的“切线”,进而便于使用者编辑,因此在很多软件中的贝塞尔曲线编辑器都是使用的三次贝塞尔曲线。比如下面这段曲线,其实就是由几段三次贝塞尔曲线组成的。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
三次贝塞尔曲线的公式为:
|
||||||
|
$$
|
||||||
|
\boldsymbol{B}(t)=(1-t)^3 \boldsymbol{P_0}+3t(1-t)^2 \boldsymbol{P_1}+3(1-t)t^2 \boldsymbol{P_2}+t^3\boldsymbol{P_3}, t\in[0, 1]
|
||||||
|
$$
|
||||||
|
虽然仍然可以按照相同的思路去实现匀速运动,但是由于三次贝塞尔曲线的长度计算已经非常复杂,根本无法通过对速度进行积分得到解析解,更别说通过反函数去求解匀速需要的自变量了。 因此在实际计算中,一般也只能通过提前建立一个曲线的长度查询表辅助运算。 这个长度查询表可以利用一般的数值积分的方式建立,比如[辛普森积分法](https://en.wikipedia.org/wiki/Simpson%27s_rule)
|
||||||
|
下面是一个JavaScript实现的互动范例,代码可以直接查看这个<a href="/html/bezier02.html" target="_blank">页面</a>的<a href="/js/bezier_cubic.js" target="_blank">JS源码</a>
|
||||||
|
|
||||||
|
<iframe width="100%" height="270" frameborder=0 src="/html/bezier02.html?uniformSpeed=1"></iframe>
|
||||||
|
|
||||||
+2
-1
@@ -14,4 +14,5 @@
|
|||||||
* [如何计算线段和圆的交点](/blog/2025/02/SegmentCircle.md)
|
* [如何计算线段和圆的交点](/blog/2025/02/SegmentCircle.md)
|
||||||
* [一道数学趣题](/blog/2025/02/Ellipse.md)
|
* [一道数学趣题](/blog/2025/02/Ellipse.md)
|
||||||
* [斐波那契数列和1/89](/blog/2025/02/Fibonacci.md)
|
* [斐波那契数列和1/89](/blog/2025/02/Fibonacci.md)
|
||||||
* [匀速贝塞尔曲线运动实现](/blog/2025/03/BezierLine.md)
|
* 匀速贝塞尔曲线运动实现
|
||||||
|
* [Part1](/blog/2025/03/BezierLine01.md), [Part2](/blog/2025/03/BezierLine02.md)
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
* [如何计算线段和圆的交点](/blog/2025/02/SegmentCircle.md)
|
* [如何计算线段和圆的交点](/blog/2025/02/SegmentCircle.md)
|
||||||
* [一道数学趣题](/blog/2025/02/Ellipse.md)
|
* [一道数学趣题](/blog/2025/02/Ellipse.md)
|
||||||
* [斐波那契数列和1/89](/blog/2025/02/Fibonacci.md)
|
* [斐波那契数列和1/89](/blog/2025/02/Fibonacci.md)
|
||||||
|
* 匀速贝塞尔曲线运动实现
|
||||||
|
* [Part1](/blog/2025/03/BezierLine01.md), [Part2](/blog/2025/03/BezierLine02.md)
|
||||||
|
|
||||||
## 开源项目
|
## 开源项目
|
||||||
* [Turbolink](https://github.com/thejinchao/turbolink)
|
* [Turbolink](https://github.com/thejinchao/turbolink)
|
||||||
|
|||||||
@@ -178,3 +178,188 @@ c+(1-c)x^2& (1-c)xy-sz&(1-c)xz+sy\\
|
|||||||
(1-c)xz-sy&(1-c)yz+sx&c+(1-c)z^2
|
(1-c)xz-sy&(1-c)yz+sx&c+(1-c)z^2
|
||||||
\end{bmatrix}
|
\end{bmatrix}
|
||||||
$$
|
$$
|
||||||
|
|
||||||
|
### 3.4 四元数
|
||||||
|
|
||||||
|
#### 3.4.1 复数
|
||||||
|
复数([Complex Number](https://simple.wikipedia.org/wiki/Complex_number))可以表达为
|
||||||
|
$$\begin{aligned}
|
||||||
|
z=a+bi\\
|
||||||
|
a,b\in\mathbb{R}, i^2=-1
|
||||||
|
\end{aligned}$$
|
||||||
|
其中$a$被成为实部(Real Part), $b$被称为虚部(Imaginary Part), 复数的基本运算规律如下,设$z_1=a_1+b_1i, z_2=a_2+b_2i$,那么
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
z_1+z_2&=(a_1+a_2)+(b_1+b_2)i\\
|
||||||
|
z_1-z_2&=(a_1-a_2)+(b_1-b_2)i\\
|
||||||
|
z_1z_2&=(a_1a_2-b_1b_2)+(a_1b_2+a_2b_1)i
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
|
||||||
|
#### 3.4.2 四元数定义
|
||||||
|
四元数([Quaternion](https://en.wikipedia.org/wiki/Quaternion))可以视为对复数的扩充。 四元数有1个实部,3个虚部,形式如下
|
||||||
|
$$
|
||||||
|
q=s+xi+yj+zk
|
||||||
|
$$
|
||||||
|
其中$s,x,y,z\in\mathbb{R}$,$i,j,k$满足如下计算性质
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
i^2&=j^2=k^2=ijk=-1\\
|
||||||
|
ij&=k\quad ji=-k\\
|
||||||
|
jk&=i\quad kj=-i\\
|
||||||
|
ki&=j\quad ik=-j\\
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
汇总到如下表格中
|
||||||
|
| | $i$ | $j$ | $k$ |
|
||||||
|
| :--- | :--- | :--- | :--- |
|
||||||
|
| $i$ | $-1$ | $k$ | $-j$ |
|
||||||
|
| $j$ | $-k$ | $-1$ | $i$ |
|
||||||
|
| $k$ | $j$ | $-i$ | $-1$ |
|
||||||
|
|
||||||
|
四元数也可以表达成将实数部和虚数部分开的形式,对于四元数$q=s+xi+yj+zk$,设$\vec{v}=[x,y,z]^T$,则这个四元数可以表达为
|
||||||
|
$$
|
||||||
|
q=[s,\vec{v}]
|
||||||
|
$$
|
||||||
|
|
||||||
|
#### 3.4.3 四元数的基本运算
|
||||||
|
对于两个四元数$q_1=[s_1,\vec{v_1}], q_2=[s_2,\vec{v_2}]$,基本运算规律如下
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
q_1+q_2&=[s_1+s_2,\quad \vec{v_1}+\vec{v_2}]\\
|
||||||
|
q_1-q_2&=[s_1-s_2,\quad \vec{v_1}-\vec{v_2}]\\
|
||||||
|
q_1q_2&=[s_1s_2-\vec{v_1}\cdot\vec{v_2},\quad s_1\vec{v_2}+s_2\vec{v_1}+\vec{v_1}\times\vec{v_2}]
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
四元数的乘法满足满足结合律,但不满足交换律
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
(q_1q_2)q_3&=q_1(q_2q_3)\\
|
||||||
|
q_1q_2&\neq q_2q_1
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
但如果$q_1,q_2$中的两个向量部分平行,由于$\vec{v_1}\times\vec{v_2}=0$,易证
|
||||||
|
$$
|
||||||
|
q_1q_2=q_2q_1\quad(when\quad \vec{v_1}\parallel\vec{v_2})
|
||||||
|
\tag{3.4.3.1}
|
||||||
|
$$
|
||||||
|
定义四元数$q=s+xi+yj+zk$的模为
|
||||||
|
$$
|
||||||
|
\|q\|=\sqrt{s^2+x^2+y^2+z^2}
|
||||||
|
$$
|
||||||
|
如果一个四元数的模为1,那么称这个四元数为单位四元数
|
||||||
|
|
||||||
|
#### 3.4.4 四元数的共轭和逆
|
||||||
|
定义四元数$q=[s, \vec{v}]$的共轭四元数$\overline{q}$为
|
||||||
|
$$
|
||||||
|
\overline{q}=[s, -\vec{v}]
|
||||||
|
$$
|
||||||
|
共轭四元数满足如下运算
|
||||||
|
$$
|
||||||
|
q\overline{q}=\overline{q}q=\|q\|^2\tag{3.4.4.1}
|
||||||
|
$$
|
||||||
|
对于单位四元数,有$q\overline{q}=1$
|
||||||
|
定义四元数$q$的逆为$q^{-1}$,满足$qq^{-1}=1$,由公式3.4.4.1可知
|
||||||
|
$$
|
||||||
|
qq^{-1}=1=\frac{q\overline{q}}{\|q\|}
|
||||||
|
$$
|
||||||
|
所以
|
||||||
|
$$
|
||||||
|
q^{-1}=\frac{\overline{q}}{\|q\|^2}\tag{3.4.4.2}
|
||||||
|
$$
|
||||||
|
四元数的逆满足如下运算
|
||||||
|
$$
|
||||||
|
(q_1q_2)^{-1}=q_2^{-1}q_1^{-1}
|
||||||
|
$$
|
||||||
|
#### 3.4.5 四元数与向量
|
||||||
|
如果一个四元数的实部为0,那么称之为纯四元数(Pure Quaternion),由于纯四元数仅有3个虚部,可以将一个3D向量转换为一个纯四元数。设$q_v=[0,\vec{v}]$,那么
|
||||||
|
$$\begin{aligned}
|
||||||
|
\lambda q_v&=[0, \lambda\vec{v}]\\
|
||||||
|
q_{u}\pm q_{v}&=[0, \vec{u}\pm\vec{v}]
|
||||||
|
\end{aligned}$$
|
||||||
|
由此可见,向量的线性运算,都可以使用与之对应的纯四元数来代替。但乘法则不同,设两个纯四元数$q_u=[0, \vec{u}], q_v=[0, \vec{v}]$,相乘后结果为
|
||||||
|
$$
|
||||||
|
q_uq_v=[-\vec{u}\cdot\vec{v}, \vec{u}\times\vec{v}]\tag{3.4.5.1}
|
||||||
|
$$
|
||||||
|
对于向量$\vec{v}$,记四元数$q(\theta, \vec{v})=[\cos\theta, \vec{v}\sin\theta]$,这种四元数有一些很有用的特性,首先如果$\vec{v}$是单位向量,那么$q(\theta, \vec{v})$是单位四元数,易证:
|
||||||
|
$$
|
||||||
|
\|q(\theta, \vec{v})\|=\sqrt{\cos^2\theta+\sin^2\theta(v_x^2+v_y^2+v_z^2)}=1
|
||||||
|
$$
|
||||||
|
另外
|
||||||
|
$$\begin{aligned}
|
||||||
|
q(\alpha, \vec{v})q(\theta, \vec{v})&=[\cos\alpha,\quad\vec{v}\sin\alpha][\cos\theta,\quad\vec{v}\sin\theta]\\
|
||||||
|
&=[\cos\alpha\cos\theta-\sin\alpha\sin\theta,\quad\vec{v}(\cos\alpha\sin\theta+\cos\theta\sin\alpha)]\\
|
||||||
|
&=[\cos(\alpha+\theta),\quad\vec{v}\sin(\alpha+\theta)]\\
|
||||||
|
&=q(\alpha+\theta, \vec{v})\\
|
||||||
|
q(\theta, \vec{v})^2&=q(2\theta, \vec{v})
|
||||||
|
\end{aligned}\tag{3.4.5.2}$$
|
||||||
|
|
||||||
|
#### 3.4.6 使用四元数表达旋转
|
||||||
|
观察上面推导罗德里格旋转公式过程中的公式3.3.2.5,其中
|
||||||
|
$$\begin{aligned}
|
||||||
|
\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v}}&=\vec{\boldsymbol{n}}\times(\boldsymbol{v_1}+\boldsymbol{v_2})\\
|
||||||
|
&=\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_1}}+\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}}\\
|
||||||
|
&=\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}}
|
||||||
|
\end{aligned}$$
|
||||||
|
带入公式3.3.2.5,可以得到
|
||||||
|
$$
|
||||||
|
R_n(\vec{\boldsymbol{v}}_2)=\vec{\boldsymbol{v}}_2\cos(\theta)+(\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}})\sin(\theta)\tag{3.4.6.1}
|
||||||
|
$$
|
||||||
|
设两个纯四元数$q_n, q_v$
|
||||||
|
$$\begin{aligned}
|
||||||
|
q_n&=[0, \vec{n}]\\
|
||||||
|
q_{v2}&=[0, \vec{v_2}]
|
||||||
|
\end{aligned}\tag{3.4.6.2}
|
||||||
|
$$
|
||||||
|
根据公式3.4.5.1
|
||||||
|
$$\begin{aligned}
|
||||||
|
q_nq_{v2}&=[-\vec{n}\cdot\vec{v_2},\quad\vec{n}\times\vec{v_2}]\\
|
||||||
|
&=[0,\quad\vec{n}\times\vec{v_2}]
|
||||||
|
\end{aligned}\tag{3.4.6.3}$$
|
||||||
|
所以$q_nq_{v2}$是一个纯四元数
|
||||||
|
由于3.4.6.1中都是线性计算,将3.4.6.2和3.4.6.3代入其中,可以得到$R_n(\vec{\boldsymbol{v}}_2)$的四元数形式
|
||||||
|
$$\begin{aligned}
|
||||||
|
R_n(\vec{\boldsymbol{v}}_2)&=\vec{\boldsymbol{v}}_2\cos\theta+(\vec{\boldsymbol{n}}\times\vec{\boldsymbol{v_2}})\sin\theta\\
|
||||||
|
&= q_v\cos\theta+q_nq_{v2}\sin\theta\\
|
||||||
|
&=(\cos\theta+q_n\sin\theta)q_{v2}\\
|
||||||
|
&=[\cos\theta, \vec{n}\sin\theta]q_{v2}\\
|
||||||
|
&=q(\theta, \vec{n})q_{v2}
|
||||||
|
\end{aligned}\tag{3.4.6.4}$$
|
||||||
|
设一个新的四元数$p$
|
||||||
|
$$
|
||||||
|
p=q(\frac{\theta}{2}, \vec{n})=[\cos\frac{\theta}{2},\vec{n}\sin\frac{\theta}{2}]\tag{3.4.6.5}
|
||||||
|
$$
|
||||||
|
根据公式3.4.5.2,可以得到
|
||||||
|
$$
|
||||||
|
pp=q(\theta, \vec{n})
|
||||||
|
$$
|
||||||
|
且由于$p$是单位四元数,可以知道
|
||||||
|
$$
|
||||||
|
pp^{-1}=p\overline{p}=1
|
||||||
|
$$
|
||||||
|
将3.4.6.4带入3.3.2.4中,可以得到罗德里格旋转公式的四元数形式为
|
||||||
|
$$\begin{aligned}
|
||||||
|
R_n(\vec{\boldsymbol{v}})&=\vec{\boldsymbol{v}}_1+R_n(\vec{\boldsymbol{v}}_2)\\
|
||||||
|
&=q_{v1}+q(\theta, \vec{n})q_{v2}\\
|
||||||
|
&=p\overline{p}q_{v1}+ppq_{v2}
|
||||||
|
\end{aligned}\tag{3.4.6.6}
|
||||||
|
$$
|
||||||
|
由于$\vec{n}\parallel\vec{v_1}$,根据公式3.4.3.1,可知$\overline{p}q_{v1}=q_{v1}\overline{p}$
|
||||||
|
由于$\vec{n}\perp\vec{v_2}$,可以推断出$pq_{v2}=q_{v2}\overline{p}$,证明如下:
|
||||||
|
$$\begin{aligned}
|
||||||
|
pq_{v2}&=[\cos\frac{\theta}{2},\vec{n}\sin\frac{\theta}{2}][0, \vec{v_2}]\\
|
||||||
|
&=[0,\vec{v_2}\cos\frac{\theta}{2}+(\vec{n}\times\vec{v_2})\sin\frac{\theta}{2}]\\
|
||||||
|
q_{v2}\overline{p}&=[0, \vec{v_2}][\cos\frac{\theta}{2},-\vec{n}\sin\frac{\theta}{2}]\\
|
||||||
|
&=[0,\vec{v_2}\cos\frac{\theta}{2}-(\vec{v_2}\times\vec{n})\sin\frac{\theta}{2}]
|
||||||
|
\end{aligned}$$
|
||||||
|
带入3.4.6.6,可以得到
|
||||||
|
$$\begin{aligned}
|
||||||
|
R_n(\vec{\boldsymbol{v}})&=pq_{v1}\overline{p}+pq_{v2}\overline{p}\\
|
||||||
|
&=p(q_{v1}+q_{v2})\overline{p}\\
|
||||||
|
&=pq_v\overline{p}
|
||||||
|
\end{aligned}\tag{3.4.6.7}
|
||||||
|
$$
|
||||||
|
也就是说,对于向量$\vec{v}$,围绕单位向量$\vec{n}$旋转$\theta$,只需要构造四元数$[\cos\frac{\theta}{2}, \vec{n}\sin\frac{\theta}{2}]$,可以利用下面的等式计算旋转后的向量$\vec{v'}$
|
||||||
|
$$
|
||||||
|
[0, \vec{v'}]=[\cos\frac{\theta}{2}, \vec{n}\sin\frac{\theta}{2}][0,\vec{v}][\cos\frac{\theta}{2}, -\vec{n}\sin\frac{\theta}{2}]
|
||||||
|
$$
|
||||||
@@ -24,16 +24,86 @@
|
|||||||
inkscape:deskcolor="#d1d1d1"
|
inkscape:deskcolor="#d1d1d1"
|
||||||
inkscape:document-units="mm"
|
inkscape:document-units="mm"
|
||||||
inkscape:zoom="2.9682216"
|
inkscape:zoom="2.9682216"
|
||||||
inkscape:cx="133.75012"
|
inkscape:cx="133.58167"
|
||||||
inkscape:cy="62.326883"
|
inkscape:cy="62.495334"
|
||||||
inkscape:window-width="2560"
|
inkscape:window-width="2560"
|
||||||
inkscape:window-height="1476"
|
inkscape:window-height="1494"
|
||||||
inkscape:window-x="-12"
|
inkscape:window-x="-11"
|
||||||
inkscape:window-y="-12"
|
inkscape:window-y="-11"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="layer1" />
|
inkscape:current-layer="layer1" />
|
||||||
<defs
|
<defs
|
||||||
id="defs1" />
|
id="defs1">
|
||||||
|
<g
|
||||||
|
id="g7079">
|
||||||
|
<g
|
||||||
|
id="g2461">
|
||||||
|
<path
|
||||||
|
d="M 2.03125,-1.328125 C 1.609375,-0.625 1.203125,-0.375 0.640625,-0.34375 0.5,-0.328125 0.40625,-0.328125 0.40625,-0.125 c 0,0.078125 0.0625,0.125 0.140625,0.125 0.21875,0 0.75,-0.03125 0.96875,-0.03125 C 1.859375,-0.03125 2.25,0 2.578125,0 c 0.078125,0 0.21875,0 0.21875,-0.234375 0,-0.09375 -0.09375,-0.109375 -0.171875,-0.109375 -0.265625,-0.03125 -0.5,-0.125 -0.5,-0.40625 0,-0.171875 0.078125,-0.296875 0.234375,-0.5625 l 0.90625,-1.515625 H 6.3125 c 0.015625,0.109375 0.015625,0.203125 0.015625,0.3125 0.046875,0.3125 0.1875,1.5625 0.1875,1.78125 0,0.359375 -0.609375,0.390625 -0.796875,0.390625 -0.140625,0 -0.265625,0 -0.265625,0.21875 C 5.453125,0 5.5625,0 5.625,0 5.828125,0 6.078125,-0.03125 6.28125,-0.03125 H 6.953125 C 7.6875,-0.03125 8.21875,0 8.21875,0 8.3125,0 8.4375,0 8.4375,-0.234375 8.4375,-0.34375 8.328125,-0.34375 8.15625,-0.34375 7.5,-0.34375 7.484375,-0.453125 7.453125,-0.8125 L 6.71875,-8.265625 c -0.03125,-0.25 -0.078125,-0.265625 -0.203125,-0.265625 -0.125,0 -0.1875,0.015625 -0.296875,0.203125 z M 3.46875,-3.171875 5.875,-7.1875 6.28125,-3.171875 Z m 0,0"
|
||||||
|
id="path3973" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4626">
|
||||||
|
<path
|
||||||
|
d="M 4.375,-7.34375 C 4.484375,-7.796875 4.53125,-7.8125 5,-7.8125 h 1.546875 c 1.359375,0 1.359375,1.140625 1.359375,1.25 0,0.96875 -0.96875,2.203125 -2.546875,2.203125 h -1.71875 z m 2.015625,3.078125 C 7.703125,-4.5 8.875,-5.421875 8.875,-6.515625 8.875,-7.453125 8.0625,-8.15625 6.703125,-8.15625 H 2.875 c -0.234375,0 -0.34375,0 -0.34375,0.21875 0,0.125 0.109375,0.125 0.296875,0.125 0.71875,0 0.71875,0.09375 0.71875,0.21875 0,0.03125 0,0.09375 -0.046875,0.28125 L 1.890625,-0.890625 C 1.78125,-0.46875 1.75,-0.34375 0.921875,-0.34375 c -0.234375,0 -0.34375,0 -0.34375,0.21875 0,0.125 0.0625,0.125 0.3125,0.125 h 4.09375 C 6.8125,0 8.21875,-1.390625 8.21875,-2.59375 c 0,-0.984375 -0.859375,-1.578125 -1.828125,-1.671875 z m -1.6875,3.921875 h -1.625 c -0.15625,0 -0.1875,0 -0.25,-0.015625 -0.140625,-0.015625 -0.15625,-0.03125 -0.15625,-0.125 0,-0.09375 0.03125,-0.15625 0.046875,-0.265625 L 3.5625,-4.125 h 2.25 c 1.40625,0 1.40625,1.3125 1.40625,1.40625 0,1.15625 -1.03125,2.375 -2.515625,2.375 z m 0,0"
|
||||||
|
id="path9803" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g2998">
|
||||||
|
<path
|
||||||
|
d="m 4.65625,-3.328125 -2.390625,-2.375 C 2.109375,-5.84375 2.09375,-5.875 2,-5.875 c -0.125,0 -0.25,0.109375 -0.25,0.25 0,0.078125 0.03125,0.109375 0.15625,0.234375 l 2.390625,2.40625 -2.390625,2.40625 C 1.78125,-0.453125 1.75,-0.4375 1.75,-0.34375 c 0,0.125 0.125,0.234375 0.25,0.234375 0.09375,0 0.109375,-0.015625 0.265625,-0.171875 l 2.375,-2.375 2.46875,2.484375 c 0.03125,0 0.109375,0.0625 0.1875,0.0625 0.140625,0 0.234375,-0.109375 0.234375,-0.234375 0,-0.03125 0,-0.078125 -0.03125,-0.140625 C 7.484375,-0.5 5.578125,-2.375 4.984375,-2.984375 l 2.1875,-2.1875 C 7.234375,-5.25 7.40625,-5.40625 7.46875,-5.46875 7.484375,-5.5 7.53125,-5.546875 7.53125,-5.625 c 0,-0.140625 -0.09375,-0.25 -0.234375,-0.25 -0.09375,0 -0.15625,0.046875 -0.28125,0.1875 z m 0,0"
|
||||||
|
id="path1407" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g5120">
|
||||||
|
<g
|
||||||
|
id="g6425">
|
||||||
|
<path
|
||||||
|
d="M 7.703125,-8.15625 C 7.65625,-8.453125 7.609375,-8.5 7.296875,-8.5 c -0.25,0 -0.359375,0.046875 -0.515625,0.296875 l -4.703125,7.1875 c -0.140625,0.234375 -0.28125,0.4375 -1.15625,0.453125 -0.171875,0 -0.390625,0 -0.390625,0.34375 C 0.53125,-0.125 0.625,0 0.765625,0 1.125,0 1.53125,-0.03125 1.90625,-0.03125 2.34375,-0.03125 2.796875,0 3.234375,0 c 0.078125,0 0.3125,0 0.3125,-0.34375 0,-0.21875 -0.21875,-0.21875 -0.3125,-0.21875 -0.09375,0 -0.421875,0 -0.6875,-0.125 l 1.09375,-1.671875 H 6.875 L 7.140625,-0.625 c -0.21875,0.046875 -0.59375,0.0625 -0.765625,0.0625 -0.25,0 -0.453125,0 -0.453125,0.34375 C 5.921875,-0.0625 6.0625,0 6.1875,0 c 0.40625,0 1.390625,-0.03125 1.78125,-0.03125 0.28125,0 0.546875,0 0.828125,0 0.28125,0 0.5625,0.03125 0.84375,0.03125 0.09375,0 0.328125,0 0.328125,-0.34375 0,-0.21875 -0.171875,-0.21875 -0.484375,-0.21875 -0.15625,0 -0.296875,0 -0.453125,-0.015625 -0.15625,0 -0.15625,-0.015625 -0.203125,-0.21875 z m -1.4375,1.78125 0.53125,3.453125 h -2.78125 z m 0,0"
|
||||||
|
id="path3287" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g7426">
|
||||||
|
<path
|
||||||
|
d="m 1.953125,-0.796875 c -0.046875,0.1875 -0.0625,0.203125 -0.28125,0.21875 -0.203125,0.015625 -0.4375,0.015625 -0.625,0.015625 -0.3125,0 -0.34375,0 -0.390625,0.03125 -0.140625,0.078125 -0.140625,0.265625 -0.140625,0.3125 C 0.515625,0 0.734375,0 0.921875,0 h 5.0625 c 2.5,0 3.625,-1.578125 3.625,-2.640625 0,-1.03125 -0.890625,-1.546875 -2,-1.640625 1.921875,-0.34375 2.59375,-1.453125 2.59375,-2.25 0,-0.984375 -0.859375,-1.671875 -2.546875,-1.671875 H 2.875 c -0.25,0 -0.453125,0 -0.453125,0.34375 0,0.21875 0.15625,0.21875 0.5,0.21875 0.25,0 0.484375,0.015625 0.734375,0.03125 z m 3.203125,-6.625 c 0.046875,-0.1875 0.0625,-0.1875 0.125,-0.203125 0.109375,-0.015625 0.1875,-0.015625 0.328125,-0.015625 h 1.78125 c 0.234375,0 1.203125,0 1.203125,1.046875 0,0.828125 -0.671875,2.109375 -2.296875,2.109375 H 4.40625 Z M 3.734375,-0.5625 c -0.1875,0 -0.203125,0 -0.296875,-0.015625 l 0.859375,-3.46875 h 2.34375 c 0.296875,0 1.3125,0 1.3125,1.21875 0,0.921875 -0.609375,2.265625 -2.3125,2.265625 z m 0,0"
|
||||||
|
id="path8540" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g637">
|
||||||
|
<path
|
||||||
|
d="m 4.65625,-3.328125 -2.390625,-2.375 C 2.109375,-5.84375 2.09375,-5.875 2,-5.875 c -0.125,0 -0.25,0.109375 -0.25,0.25 0,0.078125 0.03125,0.109375 0.15625,0.234375 l 2.390625,2.40625 -2.390625,2.40625 C 1.78125,-0.453125 1.75,-0.4375 1.75,-0.34375 c 0,0.125 0.125,0.234375 0.25,0.234375 0.09375,0 0.109375,-0.015625 0.265625,-0.171875 l 2.375,-2.375 2.46875,2.484375 c 0.03125,0 0.109375,0.0625 0.1875,0.0625 0.140625,0 0.234375,-0.109375 0.234375,-0.234375 0,-0.03125 0,-0.078125 -0.03125,-0.140625 C 7.484375,-0.5 5.578125,-2.375 4.984375,-2.984375 l 2.1875,-2.1875 C 7.234375,-5.25 7.40625,-5.40625 7.46875,-5.46875 7.484375,-5.5 7.53125,-5.546875 7.53125,-5.625 c 0,-0.140625 -0.09375,-0.25 -0.234375,-0.25 -0.09375,0 -0.15625,0.046875 -0.28125,0.1875 z m 0,0"
|
||||||
|
id="path1557" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g416">
|
||||||
|
<g
|
||||||
|
id="g7855">
|
||||||
|
<path
|
||||||
|
d="M 7.703125,-8.15625 C 7.65625,-8.453125 7.609375,-8.5 7.296875,-8.5 c -0.25,0 -0.359375,0.046875 -0.515625,0.296875 l -4.703125,7.1875 c -0.140625,0.234375 -0.28125,0.4375 -1.15625,0.453125 -0.171875,0 -0.390625,0 -0.390625,0.34375 C 0.53125,-0.125 0.625,0 0.765625,0 1.125,0 1.53125,-0.03125 1.90625,-0.03125 2.34375,-0.03125 2.796875,0 3.234375,0 c 0.078125,0 0.3125,0 0.3125,-0.34375 0,-0.21875 -0.21875,-0.21875 -0.3125,-0.21875 -0.09375,0 -0.421875,0 -0.6875,-0.125 l 1.09375,-1.671875 H 6.875 L 7.140625,-0.625 c -0.21875,0.046875 -0.59375,0.0625 -0.765625,0.0625 -0.25,0 -0.453125,0 -0.453125,0.34375 C 5.921875,-0.0625 6.0625,0 6.1875,0 c 0.40625,0 1.390625,-0.03125 1.78125,-0.03125 0.28125,0 0.546875,0 0.828125,0 0.28125,0 0.5625,0.03125 0.84375,0.03125 0.09375,0 0.328125,0 0.328125,-0.34375 0,-0.21875 -0.171875,-0.21875 -0.484375,-0.21875 -0.15625,0 -0.296875,0 -0.453125,-0.015625 -0.15625,0 -0.15625,-0.015625 -0.203125,-0.21875 z m -1.4375,1.78125 0.53125,3.453125 h -2.78125 z m 0,0"
|
||||||
|
id="path1271" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g9568">
|
||||||
|
<g
|
||||||
|
id="g833">
|
||||||
|
<path
|
||||||
|
d="m 10.1875,-8.046875 c 0.01563,-0.0625 0.03125,-0.109375 0.03125,-0.1875 0,-0.171875 -0.171875,-0.171875 -0.296875,-0.171875 L 8.8125,-7.546875 C 8.265625,-8.15625 7.453125,-8.40625 6.625,-8.40625 c -3.859375,0 -5.96875,2.9375 -5.96875,5.375 0,2.265625 1.8125,3.234375 3.890625,3.234375 1.015625,0 2.03125,-0.3125 2.9375,-0.984375 1.15625,-0.859375 1.375,-1.953125 1.375,-2.015625 0,-0.171875 -0.171875,-0.171875 -0.28125,-0.171875 -0.21875,0 -0.234375,0.03125 -0.296875,0.234375 -0.484375,1.515625 -2.046875,2.375 -3.40625,2.375 -0.734375,0 -1.375,-0.171875 -1.859375,-0.546875 -0.65625,-0.5 -0.703125,-1.3125 -0.703125,-1.625 0,-0.34375 0.203125,-2.578125 1.375,-3.96875 0.65625,-0.765625 1.8125,-1.34375 3.125,-1.34375 1.453125,0 2.0625,1.109375 2.0625,2.15625 0,0.125 -0.03125,0.296875 -0.03125,0.421875 0,0.171875 0.15625,0.171875 0.328125,0.171875 0.265625,0 0.265625,-0.015625 0.328125,-0.265625 z m 0,0"
|
||||||
|
id="path3634" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g7818">
|
||||||
|
<g
|
||||||
|
id="g9050">
|
||||||
|
<path
|
||||||
|
d="m 1.953125,-0.796875 c -0.046875,0.1875 -0.0625,0.203125 -0.28125,0.21875 -0.203125,0.015625 -0.4375,0.015625 -0.625,0.015625 -0.3125,0 -0.34375,0 -0.390625,0.03125 -0.140625,0.078125 -0.140625,0.265625 -0.140625,0.3125 C 0.515625,0 0.734375,0 0.921875,0 h 5.0625 c 2.5,0 3.625,-1.578125 3.625,-2.640625 0,-1.03125 -0.890625,-1.546875 -2,-1.640625 1.921875,-0.34375 2.59375,-1.453125 2.59375,-2.25 0,-0.984375 -0.859375,-1.671875 -2.546875,-1.671875 H 2.875 c -0.25,0 -0.453125,0 -0.453125,0.34375 0,0.21875 0.15625,0.21875 0.5,0.21875 0.25,0 0.484375,0.015625 0.734375,0.03125 z m 3.203125,-6.625 c 0.046875,-0.1875 0.0625,-0.1875 0.125,-0.203125 0.109375,-0.015625 0.1875,-0.015625 0.328125,-0.015625 h 1.78125 c 0.234375,0 1.203125,0 1.203125,1.046875 0,0.828125 -0.671875,2.109375 -2.296875,2.109375 H 4.40625 Z M 3.734375,-0.5625 c -0.1875,0 -0.203125,0 -0.296875,-0.015625 l 0.859375,-3.46875 h 2.34375 c 0.296875,0 1.3125,0 1.3125,1.21875 0,0.921875 -0.609375,2.265625 -2.3125,2.265625 z m 0,0"
|
||||||
|
id="path1150" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</defs>
|
||||||
<g
|
<g
|
||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
@@ -50,12 +120,9 @@
|
|||||||
class="st0"
|
class="st0"
|
||||||
points="83.167328,33.668629 73.855377,34.215168 74.459168,36.032917 35.842651,48.859608 36.15741,49.807209 74.773926,36.980518 75.377624,38.798115 "
|
points="83.167328,33.668629 73.855377,34.215168 74.459168,36.032917 35.842651,48.859608 36.15741,49.807209 74.773926,36.980518 75.377624,38.798115 "
|
||||||
style="fill:#a7a9ac" />
|
style="fill:#a7a9ac" />
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
</g>
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_1_"
|
id="XMLID_1_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)">
|
||||||
@@ -66,12 +133,9 @@
|
|||||||
<polygon
|
<polygon
|
||||||
id="XMLID_14_"
|
id="XMLID_14_"
|
||||||
points="92.370575,59.105213 83.906097,55.185535 83.57901,57.072773 36.085251,48.84148 35.914734,49.825336 83.408508,58.056629 83.081451,59.943745 " />
|
points="92.370575,59.105213 83.906097,55.185535 83.57901,57.072773 36.085251,48.84148 35.914734,49.825336 83.408508,58.056629 83.081451,59.943745 " />
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
</g>
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_2_"
|
id="XMLID_2_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)">
|
||||||
@@ -82,12 +146,9 @@
|
|||||||
<polygon
|
<polygon
|
||||||
id="XMLID_67_"
|
id="XMLID_67_"
|
||||||
points="36.002075,8.6666765 33.585434,17.676138 35.500824,17.676138 35.500824,49.333332 36.499344,49.333332 36.499344,17.676138 38.414566,17.676138 " />
|
points="36.002075,8.6666765 33.585434,17.676138 35.500824,17.676138 35.500824,49.333332 36.499344,49.333332 36.499344,17.676138 38.414566,17.676138 " />
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
</g>
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_4_"
|
id="XMLID_4_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)">
|
||||||
@@ -98,12 +159,9 @@
|
|||||||
<polygon
|
<polygon
|
||||||
id="XMLID_26_"
|
id="XMLID_26_"
|
||||||
points="57.501709,18.001181 50.411652,24.062674 51.990997,25.146353 35.588409,49.050892 36.411743,49.615864 52.814301,25.711325 54.393524,26.794912 " />
|
points="57.501709,18.001181 50.411652,24.062674 51.990997,25.146353 35.588409,49.050892 36.411743,49.615864 52.814301,25.711325 54.393524,26.794912 " />
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
</g>
|
</g>
|
||||||
|
</g>
|
||||||
</g>
|
|
||||||
<line
|
<line
|
||||||
id="XMLID_5_"
|
id="XMLID_5_"
|
||||||
class="st1"
|
class="st1"
|
||||||
@@ -127,7 +185,7 @@
|
|||||||
y1="35.013"
|
y1="35.013"
|
||||||
x2="138.2822"
|
x2="138.2822"
|
||||||
y2="44.782825"
|
y2="44.782825"
|
||||||
style="fill:none;stroke:#a7a9ac;stroke-miterlimit:10" />
|
style="fill:none;stroke:#a7a9ac;stroke-miterlimit:10;stroke-width:1.00031497;stroke-dasharray:none" />
|
||||||
<line
|
<line
|
||||||
id="XMLID_8_"
|
id="XMLID_8_"
|
||||||
class="st2"
|
class="st2"
|
||||||
@@ -176,101 +234,125 @@
|
|||||||
x2="159.7822"
|
x2="159.7822"
|
||||||
y2="13.449496"
|
y2="13.449496"
|
||||||
style="fill:none;stroke:#000000;stroke-miterlimit:10" />
|
style="fill:none;stroke:#000000;stroke-miterlimit:10" />
|
||||||
<g
|
|
||||||
id="XMLID_16_"
|
|
||||||
transform="translate(-1.2553831,1.346337)">
|
|
||||||
<g
|
|
||||||
id="XMLID_17_">
|
|
||||||
<path
|
|
||||||
id="XMLID_51_"
|
|
||||||
class="st3"
|
|
||||||
d="m 84.331055,49.637043 h -2.791016 l -0.332031,0.767578 c -0.108887,0.255859 -0.163574,0.467773 -0.163574,0.633789 0,0.22168 0.08935,0.383789 0.268066,0.489258 0.10498,0.06152 0.363281,0.108398 0.775391,0.139648 v 0.214844 h -2.628418 v -0.214844 c 0.283691,-0.04297 0.516601,-0.160156 0.699218,-0.352539 0.182618,-0.191406 0.408203,-0.58789 0.67627,-1.189453 l 2.826172,-6.293457 h 0.11084 l 2.850097,6.468262 c 0.271485,0.612305 0.495117,0.998047 0.669922,1.157226 0.131836,0.120118 0.31836,0.19043 0.559571,0.209961 V 51.88216 H 84.02832 v -0.214844 h 0.158203 c 0.306641,0 0.521485,-0.04297 0.646485,-0.127929 0.08496,-0.0625 0.12793,-0.151368 0.12793,-0.267578 0,-0.07031 -0.01172,-0.141602 -0.03516,-0.215821 -0.0078,-0.03516 -0.06641,-0.179687 -0.174804,-0.435547 z m -0.197266,-0.430664 -1.177734,-2.716309 -1.211914,2.716309 z"
|
|
||||||
style="fill:#010101" />
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="XMLID_18_"
|
|
||||||
transform="translate(-1.2553831,1.346337)">
|
|
||||||
<g
|
|
||||||
id="XMLID_19_">
|
|
||||||
<path
|
|
||||||
id="XMLID_47_"
|
|
||||||
class="st0"
|
|
||||||
d="m 68.577148,29.485189 c 0.761719,0.173828 1.296875,0.385743 1.604493,0.633789 0.441406,0.35254 0.663085,0.810547 0.663085,1.372071 0,0.593748 -0.243164,1.083982 -0.728515,1.471678 -0.595703,0.469726 -1.461914,0.704101 -2.598145,0.704101 h -4.078125 v -0.214844 c 0.371094,0 0.622559,-0.03418 0.754883,-0.102539 0.131836,-0.06738 0.22461,-0.155273 0.277832,-0.264648 0.05371,-0.108398 0.08008,-0.375977 0.08008,-0.802734 V 27.1639 c 0,-0.426757 -0.02637,-0.695312 -0.08008,-0.805664 -0.05322,-0.110351 -0.146973,-0.19873 -0.280761,-0.264648 -0.134278,-0.06592 -0.384766,-0.09863 -0.751954,-0.09863 v -0.215332 h 3.847168 c 0.919922,0 1.570313,0.08057 1.953125,0.241211 0.382813,0.161133 0.684571,0.401367 0.90625,0.721191 0.220703,0.319825 0.331055,0.660157 0.331055,1.020996 0,0.379883 -0.139648,0.718262 -0.419922,1.015137 -0.280273,0.296387 -0.773437,0.532227 -1.480469,0.707031 z m -2.153808,0.295899 v 2.530271 l -0.0059,0.291016 c 0,0.208984 0.0542,0.367188 0.162598,0.473633 0.108398,0.107422 0.269043,0.160156 0.482422,0.160156 0.31543,0 0.606445,-0.06836 0.873047,-0.206055 0.266602,-0.137695 0.470703,-0.33789 0.612305,-0.599609 0.142578,-0.261719 0.21289,-0.552733 0.21289,-0.874998 0,-0.368164 -0.08691,-0.699219 -0.259765,-0.992188 -0.173828,-0.291992 -0.413086,-0.49707 -0.715821,-0.613281 -0.304687,-0.116211 -0.758301,-0.172851 -1.361816,-0.168945 z m 0,-0.454102 c 0.560058,0 0.973633,-0.06152 1.239746,-0.185547 0.266601,-0.124023 0.470703,-0.298339 0.612305,-0.523437 0.142578,-0.224609 0.213867,-0.511719 0.213867,-0.86084 0,-0.349121 -0.07031,-0.634766 -0.210938,-0.85791 -0.139648,-0.223145 -0.339844,-0.392578 -0.600586,-0.508789 -0.260254,-0.116699 -0.678711,-0.172852 -1.254394,-0.168946 z"
|
|
||||||
style="fill:#a7a9ac" />
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="XMLID_20_"
|
|
||||||
transform="translate(-1.2553831,1.346337)">
|
|
||||||
<g
|
|
||||||
id="XMLID_30_">
|
|
||||||
<path
|
|
||||||
id="XMLID_45_"
|
|
||||||
class="st3"
|
|
||||||
d="M 56.84082,8.0706377 V 10.820638 H 56.610351 C 56.436523,10.102864 56.113281,9.5530596 55.639648,9.1707354 55.166016,8.7884112 54.628906,8.5974932 54.029297,8.5974932 c -0.500977,0 -0.960449,0.1420898 -1.378907,0.4267578 -0.417968,0.2851563 -0.724121,0.6577148 -0.91748,1.117676 -0.248535,0.589355 -0.372559,1.244629 -0.372559,1.966308 0,0.709961 0.09082,1.356446 0.271973,1.939454 0.181641,0.583007 0.46582,1.024414 0.852539,1.322265 0.386719,0.298828 0.888184,0.448242 1.503418,0.448242 0.504883,0 0.967774,-0.109375 1.387695,-0.328125 0.420899,-0.21875 0.863282,-0.594726 1.329102,-1.128906 v 0.68457 c -0.450195,0.463868 -0.918945,0.800782 -1.40625,1.00879 -0.487305,0.208985 -1.055664,0.313477 -1.707031,0.313477 -0.856445,0 -1.617188,-0.169922 -2.281738,-0.509767 -0.66504,-0.338867 -1.178223,-0.826172 -1.539063,-1.461914 -0.36084,-0.635742 -0.541504,-1.313476 -0.541504,-2.03125 0,-0.756347 0.200195,-1.474121 0.600586,-2.152832 0.400391,-0.6787107 0.941406,-1.2055662 1.62207,-1.5795896 0.680664,-0.3745117 1.403321,-0.5620117 2.168946,-0.5620117 0.564453,0 1.160156,0.1210938 1.788085,0.362793 0.362305,0.140625 0.59375,0.2109375 0.692383,0.2109375 0.125977,0 0.235352,-0.045898 0.328125,-0.1376953 0.09277,-0.091797 0.153321,-0.2368164 0.180664,-0.4360352 z"
|
|
||||||
style="fill:#010101" />
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
</g>
|
|
||||||
<g
|
|
||||||
id="XMLID_31_"
|
|
||||||
transform="translate(-1.2553831,1.346337)">
|
|
||||||
<g
|
|
||||||
id="XMLID_34_">
|
|
||||||
<path
|
|
||||||
id="XMLID_43_"
|
|
||||||
class="st3"
|
|
||||||
d="m 12.708008,14.328939 2.172851,2.152344 2.171875,-2.152344 0.403321,0.395507 -2.166992,2.169923 2.166992,2.152344 -0.403321,0.407226 -2.171875,-2.158203 -2.172851,2.158203 -0.408692,-0.407226 2.172364,-2.158203 -2.172364,-2.152345 z"
|
|
||||||
style="fill:#010101" />
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
<g
|
|
||||||
id="XMLID_33_">
|
|
||||||
<path
|
|
||||||
id="XMLID_35_"
|
|
||||||
class="st3"
|
|
||||||
d="M 6.4746094,17.691244 H 3.6772461 l -0.3330078,0.767578 c -0.1088867,0.25586 -0.1630859,0.467774 -0.1630859,0.633789 0,0.22168 0.089355,0.383789 0.2685547,0.489258 0.1049805,0.06152 0.3637695,0.108398 0.7763672,0.139648 v 0.214844 H 1.5922852 v -0.214844 c 0.2841797,-0.04297 0.5180664,-0.160156 0.7011719,-0.352539 0.1826172,-0.191406 0.4086914,-0.58789 0.6772461,-1.189453 l 2.8325195,-6.293458 h 0.1108398 l 2.8554688,6.468263 c 0.2724609,0.612305 0.496582,0.998047 0.671875,1.157227 0.1323242,0.120117 0.3193359,0.190429 0.5605467,0.20996 v 0.214844 H 6.1708984 v -0.214844 h 0.1577148 c 0.3076172,0 0.5234375,-0.04297 0.6484375,-0.127929 0.085449,-0.0625 0.128418,-0.151367 0.128418,-0.267578 0,-0.07031 -0.011719,-0.141602 -0.035156,-0.215821 -0.00781,-0.03516 -0.066406,-0.179687 -0.175293,-0.435547 z M 6.2758789,17.26058 5.0961914,14.544271 3.8818359,17.26058 Z"
|
|
||||||
style="fill:#010101" />
|
|
||||||
|
|
||||||
<path
|
|
||||||
id="XMLID_39_"
|
|
||||||
class="st3"
|
|
||||||
d="m 24.941406,15.75472 c 0.750977,0.173828 1.278321,0.385743 1.582032,0.63379 0.436523,0.352539 0.654296,0.810547 0.654296,1.37207 0,0.59375 -0.239257,1.083984 -0.717773,1.47168 -0.587891,0.469726 -1.442383,0.704101 -2.564453,0.704101 H 19.87207 v -0.214844 c 0.366211,0 0.614258,-0.03418 0.745118,-0.102539 0.129882,-0.06738 0.221679,-0.155273 0.274414,-0.264648 0.05176,-0.108398 0.07813,-0.375977 0.07813,-0.802734 v -5.118165 c 0,-0.426758 -0.02637,-0.695313 -0.07813,-0.805664 -0.05273,-0.110352 -0.145508,-0.198731 -0.277344,-0.264649 -0.132813,-0.06592 -0.379883,-0.09863 -0.742188,-0.09863 v -0.215332 h 3.795899 c 0.907226,0 1.549805,0.08057 1.927734,0.241211 0.376953,0.161133 0.674805,0.401367 0.893555,0.721192 0.217773,0.319824 0.326172,0.660156 0.326172,1.020996 0,0.379883 -0.137695,0.718261 -0.414063,1.015136 -0.276367,0.296387 -0.763672,0.532227 -1.459961,0.707032 z m -2.125976,0.295899 v 2.530273 l -0.0059,0.291016 c 0,0.208984 0.05371,0.367188 0.161133,0.473633 0.106445,0.107422 0.265625,0.160156 0.475586,0.160156 0.311523,0 0.598633,-0.06836 0.861328,-0.206055 0.262695,-0.137695 0.463867,-0.33789 0.604492,-0.599609 0.139649,-0.261719 0.209961,-0.552734 0.209961,-0.875 0,-0.368164 -0.08496,-0.699219 -0.256836,-0.992187 -0.170898,-0.291993 -0.407226,-0.497071 -0.706054,-0.613282 -0.300782,-0.116211 -0.748047,-0.172851 -1.34375,-0.168945 z m 0,-0.454102 c 0.552734,0 0.960937,-0.06152 1.223632,-0.185547 0.262696,-0.124024 0.463868,-0.29834 0.604493,-0.523438 0.139648,-0.224609 0.209961,-0.511719 0.209961,-0.86084 0,-0.349121 -0.06934,-0.634765 -0.207032,-0.85791 -0.138672,-0.223144 -0.335937,-0.392578 -0.592773,-0.508789 -0.256836,-0.116699 -0.669922,-0.172851 -1.238281,-0.168945 z"
|
|
||||||
style="fill:#010101" />
|
|
||||||
|
|
||||||
</g>
|
|
||||||
|
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_15_"
|
id="XMLID_15_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)" />
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_55_"
|
id="XMLID_55_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)" />
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_56_"
|
id="XMLID_56_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)" />
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_58_"
|
id="XMLID_58_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)" />
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_59_"
|
id="XMLID_59_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)" />
|
||||||
</g>
|
|
||||||
<g
|
<g
|
||||||
id="XMLID_60_"
|
id="XMLID_60_"
|
||||||
transform="translate(-1.2553831,1.346337)">
|
transform="translate(-1.2553831,1.346337)" />
|
||||||
</g>
|
<g
|
||||||
|
inkscape:label=""
|
||||||
|
transform="translate(0.56145591,10.668609)"
|
||||||
|
id="g1">
|
||||||
|
<g
|
||||||
|
fill="#000000"
|
||||||
|
fill-opacity="1"
|
||||||
|
id="g4"
|
||||||
|
transform="matrix(0.888889,0,0,0.888889,-2.24378,-1.50667)">
|
||||||
|
<g
|
||||||
|
id="use3"
|
||||||
|
transform="translate(1.993,10.195)">
|
||||||
|
<path
|
||||||
|
d="M 7.703125,-8.15625 C 7.65625,-8.453125 7.609375,-8.5 7.296875,-8.5 c -0.25,0 -0.359375,0.046875 -0.515625,0.296875 l -4.703125,7.1875 c -0.140625,0.234375 -0.28125,0.4375 -1.15625,0.453125 -0.171875,0 -0.390625,0 -0.390625,0.34375 C 0.53125,-0.125 0.625,0 0.765625,0 1.125,0 1.53125,-0.03125 1.90625,-0.03125 2.34375,-0.03125 2.796875,0 3.234375,0 c 0.078125,0 0.3125,0 0.3125,-0.34375 0,-0.21875 -0.21875,-0.21875 -0.3125,-0.21875 -0.09375,0 -0.421875,0 -0.6875,-0.125 l 1.09375,-1.671875 H 6.875 L 7.140625,-0.625 c -0.21875,0.046875 -0.59375,0.0625 -0.765625,0.0625 -0.25,0 -0.453125,0 -0.453125,0.34375 C 5.921875,-0.0625 6.0625,0 6.1875,0 c 0.40625,0 1.390625,-0.03125 1.78125,-0.03125 0.28125,0 0.546875,0 0.828125,0 0.28125,0 0.5625,0.03125 0.84375,0.03125 0.09375,0 0.328125,0 0.328125,-0.34375 0,-0.21875 -0.171875,-0.21875 -0.484375,-0.21875 -0.15625,0 -0.296875,0 -0.453125,-0.015625 -0.15625,0 -0.15625,-0.015625 -0.203125,-0.21875 z m -1.4375,1.78125 0.53125,3.453125 h -2.78125 z m 0,0"
|
||||||
|
id="path6" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
fill="#000000"
|
||||||
|
fill-opacity="1"
|
||||||
|
id="g5"
|
||||||
|
transform="matrix(0.888889,0,0,0.888889,-2.24378,-1.50667)">
|
||||||
|
<g
|
||||||
|
id="use4"
|
||||||
|
transform="translate(15.043,10.195)">
|
||||||
|
<path
|
||||||
|
d="m 4.65625,-3.328125 -2.390625,-2.375 C 2.109375,-5.84375 2.09375,-5.875 2,-5.875 c -0.125,0 -0.25,0.109375 -0.25,0.25 0,0.078125 0.03125,0.109375 0.15625,0.234375 l 2.390625,2.40625 -2.390625,2.40625 C 1.78125,-0.453125 1.75,-0.4375 1.75,-0.34375 c 0,0.125 0.125,0.234375 0.25,0.234375 0.09375,0 0.109375,-0.015625 0.265625,-0.171875 l 2.375,-2.375 2.46875,2.484375 c 0.03125,0 0.109375,0.0625 0.1875,0.0625 0.140625,0 0.234375,-0.109375 0.234375,-0.234375 0,-0.03125 0,-0.078125 -0.03125,-0.140625 C 7.484375,-0.5 5.578125,-2.375 4.984375,-2.984375 l 2.1875,-2.1875 C 7.234375,-5.25 7.40625,-5.40625 7.46875,-5.46875 7.484375,-5.5 7.53125,-5.546875 7.53125,-5.625 c 0,-0.140625 -0.09375,-0.25 -0.234375,-0.25 -0.09375,0 -0.15625,0.046875 -0.28125,0.1875 z m 0,0"
|
||||||
|
id="path7" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
fill="#000000"
|
||||||
|
fill-opacity="1"
|
||||||
|
id="g6"
|
||||||
|
transform="matrix(0.888889,0,0,0.888889,-2.24378,-1.50667)">
|
||||||
|
<g
|
||||||
|
id="use5"
|
||||||
|
transform="translate(26.999001,10.195)">
|
||||||
|
<path
|
||||||
|
d="m 1.953125,-0.796875 c -0.046875,0.1875 -0.0625,0.203125 -0.28125,0.21875 -0.203125,0.015625 -0.4375,0.015625 -0.625,0.015625 -0.3125,0 -0.34375,0 -0.390625,0.03125 -0.140625,0.078125 -0.140625,0.265625 -0.140625,0.3125 C 0.515625,0 0.734375,0 0.921875,0 h 5.0625 c 2.5,0 3.625,-1.578125 3.625,-2.640625 0,-1.03125 -0.890625,-1.546875 -2,-1.640625 1.921875,-0.34375 2.59375,-1.453125 2.59375,-2.25 0,-0.984375 -0.859375,-1.671875 -2.546875,-1.671875 H 2.875 c -0.25,0 -0.453125,0 -0.453125,0.34375 0,0.21875 0.15625,0.21875 0.5,0.21875 0.25,0 0.484375,0.015625 0.734375,0.03125 z m 3.203125,-6.625 c 0.046875,-0.1875 0.0625,-0.1875 0.125,-0.203125 0.109375,-0.015625 0.1875,-0.015625 0.328125,-0.015625 h 1.78125 c 0.234375,0 1.203125,0 1.203125,1.046875 0,0.828125 -0.671875,2.109375 -2.296875,2.109375 H 4.40625 Z M 3.734375,-0.5625 c -0.1875,0 -0.203125,0 -0.296875,-0.015625 l 0.859375,-3.46875 h 2.34375 c 0.296875,0 1.3125,0 1.3125,1.21875 0,0.921875 -0.609375,2.265625 -2.3125,2.265625 z m 0,0"
|
||||||
|
id="path8" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:label=""
|
||||||
|
transform="translate(82.091757,45.706425)"
|
||||||
|
id="g3">
|
||||||
|
<g
|
||||||
|
fill="#000000"
|
||||||
|
fill-opacity="1"
|
||||||
|
id="g2"
|
||||||
|
transform="matrix(0.888889,0,0,0.888889,-2.24378,-1.50667)">
|
||||||
|
<g
|
||||||
|
id="use1"
|
||||||
|
transform="translate(1.993,10.195)">
|
||||||
|
<path
|
||||||
|
d="M 7.703125,-8.15625 C 7.65625,-8.453125 7.609375,-8.5 7.296875,-8.5 c -0.25,0 -0.359375,0.046875 -0.515625,0.296875 l -4.703125,7.1875 c -0.140625,0.234375 -0.28125,0.4375 -1.15625,0.453125 -0.171875,0 -0.390625,0 -0.390625,0.34375 C 0.53125,-0.125 0.625,0 0.765625,0 1.125,0 1.53125,-0.03125 1.90625,-0.03125 2.34375,-0.03125 2.796875,0 3.234375,0 c 0.078125,0 0.3125,0 0.3125,-0.34375 0,-0.21875 -0.21875,-0.21875 -0.3125,-0.21875 -0.09375,0 -0.421875,0 -0.6875,-0.125 l 1.09375,-1.671875 H 6.875 L 7.140625,-0.625 c -0.21875,0.046875 -0.59375,0.0625 -0.765625,0.0625 -0.25,0 -0.453125,0 -0.453125,0.34375 C 5.921875,-0.0625 6.0625,0 6.1875,0 c 0.40625,0 1.390625,-0.03125 1.78125,-0.03125 0.28125,0 0.546875,0 0.828125,0 0.28125,0 0.5625,0.03125 0.84375,0.03125 0.09375,0 0.328125,0 0.328125,-0.34375 0,-0.21875 -0.171875,-0.21875 -0.484375,-0.21875 -0.15625,0 -0.296875,0 -0.453125,-0.015625 -0.15625,0 -0.15625,-0.015625 -0.203125,-0.21875 z m -1.4375,1.78125 0.53125,3.453125 h -2.78125 z m 0,0"
|
||||||
|
id="path2" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:label=""
|
||||||
|
transform="translate(45.257131,11.567015)"
|
||||||
|
id="g7">
|
||||||
|
<g
|
||||||
|
fill="#000000"
|
||||||
|
fill-opacity="1"
|
||||||
|
id="g2-1"
|
||||||
|
transform="matrix(0.888889,0,0,0.888889,-2.35489,-1.59)">
|
||||||
|
<g
|
||||||
|
id="use1-1"
|
||||||
|
transform="translate(1.993,10.195)">
|
||||||
|
<path
|
||||||
|
d="m 10.1875,-8.046875 c 0.01563,-0.0625 0.03125,-0.109375 0.03125,-0.1875 0,-0.171875 -0.171875,-0.171875 -0.296875,-0.171875 L 8.8125,-7.546875 C 8.265625,-8.15625 7.453125,-8.40625 6.625,-8.40625 c -3.859375,0 -5.96875,2.9375 -5.96875,5.375 0,2.265625 1.8125,3.234375 3.890625,3.234375 1.015625,0 2.03125,-0.3125 2.9375,-0.984375 1.15625,-0.859375 1.375,-1.953125 1.375,-2.015625 0,-0.171875 -0.171875,-0.171875 -0.28125,-0.171875 -0.21875,0 -0.234375,0.03125 -0.296875,0.234375 -0.484375,1.515625 -2.046875,2.375 -3.40625,2.375 -0.734375,0 -1.375,-0.171875 -1.859375,-0.546875 -0.65625,-0.5 -0.703125,-1.3125 -0.703125,-1.625 0,-0.34375 0.203125,-2.578125 1.375,-3.96875 0.65625,-0.765625 1.8125,-1.34375 3.125,-1.34375 1.453125,0 2.0625,1.109375 2.0625,2.15625 0,0.125 -0.03125,0.296875 -0.03125,0.421875 0,0.171875 0.15625,0.171875 0.328125,0.171875 0.265625,0 0.265625,-0.015625 0.328125,-0.265625 z m 0,0"
|
||||||
|
id="path2-1" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:label=""
|
||||||
|
transform="translate(65.246654,27.289112)"
|
||||||
|
id="g8"
|
||||||
|
style="fill:#a7a9ac;fill-opacity:1;stroke:none;stroke-width:1.00031;stroke-dasharray:none;stroke-opacity:1">
|
||||||
|
<g
|
||||||
|
fill="#000000"
|
||||||
|
fill-opacity="1"
|
||||||
|
id="g2-1-1"
|
||||||
|
transform="matrix(0.888889,0,0,0.888889,-2.22989,-1.77056)"
|
||||||
|
style="fill:#a7a9ac;fill-opacity:1;stroke:none;stroke-width:1.12535;stroke-dasharray:none;stroke-opacity:1">
|
||||||
|
<g
|
||||||
|
id="use1-1-1"
|
||||||
|
transform="translate(1.993,10.195)"
|
||||||
|
style="fill:#a7a9ac;fill-opacity:1;stroke:none;stroke-width:1.12535;stroke-dasharray:none;stroke-opacity:1">
|
||||||
|
<path
|
||||||
|
d="m 1.953125,-0.796875 c -0.046875,0.1875 -0.0625,0.203125 -0.28125,0.21875 -0.203125,0.015625 -0.4375,0.015625 -0.625,0.015625 -0.3125,0 -0.34375,0 -0.390625,0.03125 -0.140625,0.078125 -0.140625,0.265625 -0.140625,0.3125 C 0.515625,0 0.734375,0 0.921875,0 h 5.0625 c 2.5,0 3.625,-1.578125 3.625,-2.640625 0,-1.03125 -0.890625,-1.546875 -2,-1.640625 1.921875,-0.34375 2.59375,-1.453125 2.59375,-2.25 0,-0.984375 -0.859375,-1.671875 -2.546875,-1.671875 H 2.875 c -0.25,0 -0.453125,0 -0.453125,0.34375 0,0.21875 0.15625,0.21875 0.5,0.21875 0.25,0 0.484375,0.015625 0.734375,0.03125 z m 3.203125,-6.625 c 0.046875,-0.1875 0.0625,-0.1875 0.125,-0.203125 0.109375,-0.015625 0.1875,-0.015625 0.328125,-0.015625 h 1.78125 c 0.234375,0 1.203125,0 1.203125,1.046875 0,0.828125 -0.671875,2.109375 -2.296875,2.109375 H 4.40625 Z M 3.734375,-0.5625 c -0.1875,0 -0.203125,0 -0.296875,-0.015625 l 0.859375,-3.46875 h 2.34375 c 0.296875,0 1.3125,0 1.3125,1.21875 0,0.921875 -0.609375,2.265625 -2.3125,2.265625 z m 0,0"
|
||||||
|
id="path2-1-1"
|
||||||
|
style="fill:#a7a9ac;fill-opacity:1;stroke:none;stroke-width:1.12535;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 23 KiB |
@@ -11,6 +11,7 @@
|
|||||||
"@vuepress/plugin-markdown-math": "^2.0.0-rc.78",
|
"@vuepress/plugin-markdown-math": "^2.0.0-rc.78",
|
||||||
"@vuepress/theme-default": "^2.0.0-rc.78",
|
"@vuepress/theme-default": "^2.0.0-rc.78",
|
||||||
"mathjax-full": "^3.2.2",
|
"mathjax-full": "^3.2.2",
|
||||||
|
"p5": "^1.11.3",
|
||||||
"sass-embedded": "^1.85.0",
|
"sass-embedded": "^1.85.0",
|
||||||
"vuepress": "^2.0.0-rc.19"
|
"vuepress": "^2.0.0-rc.19"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1852,6 +1852,11 @@ ora@^8.1.1:
|
|||||||
string-width "^7.2.0"
|
string-width "^7.2.0"
|
||||||
strip-ansi "^7.1.0"
|
strip-ansi "^7.1.0"
|
||||||
|
|
||||||
|
p5@^1.11.3:
|
||||||
|
version "1.11.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/p5/-/p5-1.11.3.tgz#94478d5ba685cedf9f3f934a3db702155cbb36c6"
|
||||||
|
integrity sha512-5eiyuZ3Pvo6ucr3nr8AzD+qwpoleiIEF2a2HmiO6PJM1tnbD0LmLlckZyYGJATs0tdmRjc37Muh6KPS4d1FHHg==
|
||||||
|
|
||||||
parse-ms@^4.0.0:
|
parse-ms@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz"
|
resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz"
|
||||||
|
|||||||
Reference in New Issue
Block a user