從turtle海龜動畫學習 Python - 高中彈性課程系列 8.1 碎形(分形) L-system

47 篇文章 1 订阅
33 篇文章 1 订阅

Goal: 藉由有趣的「海龜繪圖」學會基礎的 Python 程式設計
本課程帶領同學以 Python 實現 Logo 烏龜繪圖,藉由有趣的「烏龜繪圖」學會基礎的 Python 程式設計


“Talk is cheap. Show me the code.”
― Linus Torvalds

老子第41章
上德若谷
大白若辱
大方無隅
大器晚成
大音希聲
大象無形
道隱無名

拳打千遍, 身法自然

“There’s no shortage of remarkable ideas, what’s missing is the will to execute them.” – Seth Godin
「很棒的點子永遠不會匱乏,然而缺少的是執行點子的意志力。」—賽斯.高汀

本系列文章之連結

  • 從turtle海龜動畫學習Python-高中彈性課程1 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 2 安裝 Python, 線上執行 Python link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 3 烏龜繪圖 所需之Python基礎 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 4 烏龜開始畫圖 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 5 用函數封裝重複性指令-呼叫函數令烏龜畫正 n 邊形 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 6 畫多重旋轉圓,螺旋正方形 link

  • 從turtle海龜動畫 學習 Python - 7 遞歸 recursive - 高中彈性課程系列 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 8 碎形 (分形 fractal) link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 8.1 碎形 L-system link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 9 Python 物件導向介紹 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 9.1 Python 物件導向的練習 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 10 藝術畫 自定義海龜形狀 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 10.1 藝術畫 python繪製天然雪花結晶 https://blog.csdn.net/m0_47985483/article/details/122262036 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 10.2 藝術畫 Python 製作生成式藝術 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 11.1 氣泡排序 - 用 turtle 呈現演算法之執行動作 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 11.2 maze 迷宮 - 用 turtle 呈現演算法之執行動作 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 11.3 連分數演算法與轉轉相除法- 用 turtle 呈現演算法之執行動作 link

  • 從turtle海龜動畫 學習 Python - 高中彈性課程系列 11.4 最短路徑 Dijkstra- 用 turtle 呈現演算法之執行動作 link



L-system 介紹

以下是部分參考自維基百科 link:

Lindenmayer 系統,簡稱 L 系統,是由荷蘭烏特勒支大學(the University of Utrecht) 的理論生物學和植物學家,匈牙利裔的林登麥爾(Aristid Lindenmayer)於1968年提出的有關生長發展中的細胞交互作用的數學模型,尤其被廣泛應用於植物生長過程的研究。

L-system的自然遞歸規則導致自相似性,也因此使得分形一類形式可以很容易的使用 L-system 描述。植物模型和自然界的有機結構生成,非常相似並很容易被定義,因此通過增加遞歸的層數,可以緩慢生長並逐漸變得更複雜。L-system 同樣也可應用在人造生命(人工生命)領域。 L-system 語法與 IT資工的 Chomsky 語法非常相似,說到 L-system 通常指的是帶參數的 L-system,定義如下:

Lindenmayer 最經典的書中的定義

在 Lindenmayer 最經典的書中, 一開始是用以下的符號等跟名詞定義 L-systme:
他稱最簡單的 L-system 是, 決定性的 deterministic (就是指非隨機), 與上下文無關 context-free, 的一種 L-systme, 此種最簡單的 L-system 就用 deterministic, context-free 的第一個字母來取名為 DOL-system:
“the simplest class of L-systems, those which are
deterministic and context-free, called DOL-systems.”
(註: 如果你的迭代規則會跟上下文有關, 則這是更進階的模型, 叫做 context sensitive, 這在後面再介紹.)


最好先看一個實際的小例子ˋ, 再看以下的定義, 會較容易懂, 否則 (至少我本人在第一次看時)會覺得頭有點痛!

這裡我先用一個很單純的例子示範:
例如先看 Koch 曲線的例子,
如果我們想用 L-system 的語法去生成以下 Koch curve 的 碎形遞歸圖,
如果稱第0代是一條線段, 則以下分別是第1代, 第2代, 3代的圖,

在这里插入图片描述
我們先寫下產生第一代的圖, 所需要用到的 L-system 指令, 先定義需要的符號(或稱變數或常數)
註: 所謂變數或常數, 取決於此符號他是否有迭代規則,
變數: 有迭代規則就會隨著代數前進而演化, 稱為變數, 例如底下的 F, 因為每進入下一代, 會先將每個 F 替換成 F + F − − F + F F+F−−F+F F+FF+F,
常數: 無迭代規則, 不會演化, 稱為常數, 例如底下的 d, ) δ \delta δ, +, -), 每進入下一代, 他的定義(內容)保持一樣.

  • d: 代表海龜每次前進時走的距離, 可先設為常數, 例如設為 50像素.
  • F: 代表海龜前進一段距離 d
  • δ \delta δ: 海龜轉頭之角度, 可設為常數 60°, 60角度.
  • +: 代表逆時針轉 δ \delta δ 度, 可視為常數符號
  • -: 代表順時針轉 δ \delta δ 度, 可視為常數符號

則要產生第一代的, 像一個小尖山的圖, 動作 指令就是:
F + F − − F + F F+F−−F+F F+FF+F
前進 → 左轉 60 ° → 前進 → 右轉 60 ° → 右轉 60 ° → 前進 → 左轉 60 ° → 前進 前進 \rightarrow 左轉 60° \rightarrow 前進 \rightarrow 右轉 60° \rightarrow 右轉 60° \rightarrow 前進 \rightarrow 左轉 60° \rightarrow 前進 前進左轉60°前進右轉60°右轉60°前進左轉60°前進

基本上就是表示: 前進 -> 左轉 60° -> 前進 -> 右轉 60° -> 右轉 60°-> 前進 -> 左轉 60° -> 前進.

在程式中, 每當讀到這條指令時, 就是執行海龜:
前進 ( 50 像素 ) → 逆時針 ( 左轉 ) 轉頭 60 ° → 前進 → 順時針 ( 右轉 ) 轉頭 60 ° → 順時針 ( 右轉 ) 轉頭 60 ° ( 就是總共順時針轉 120 ° , 或逆時針轉 − 120 ° ( 負 120 ° ) ) → 前進 → 逆時針轉頭 60 ° → 前進 前進(50像素) \rightarrow 逆時針(左轉)轉頭 60° \rightarrow 前進 \rightarrow 順時針(右轉)轉頭 60° \rightarrow 順時針(右轉)轉頭 60° \\ (就是總共 順時針轉 120°, 或 逆時針轉 -120°(負120°)) \rightarrow 前進 \rightarrow 逆時針轉頭 60° \rightarrow 前進 前進(50像素)逆時針(左轉)轉頭60°前進順時針(右轉)轉頭60°順時針(右轉)轉頭60°(就是總共順時針轉120°,或逆時針轉120°(120°))前進逆時針轉頭60°前進

以下我們將符號與執行之圖形連起來, 較好懂, 用 GeGeobra 畫較容易加工呈現 (GeoGebra 裡也有簡易的 turtle 繪圖指令).
F: 遇到 F 令海龜前進一段距離 d
在这里插入图片描述
+: 遇到 + 號 令turtle 逆時針(左轉)轉頭 60°

plus_turtle逆時針(左轉)轉頭 60°_2
F: 遇到 F 令海龜前進一段距離 d

在这里插入图片描述

以上大家看了之後, 可能會想這不過是把海龜的動作用英文字母來濃縮表示而已, 但是, L-system 最重要的是迭代規則, 就是 P 那個部分, P : (F → F+F− −F+F).
如果我們要產生 Koch 碎形, 必須每次將第一代之線段, 替換成一個小山形, 並持續這樣的替代動作, 直到無窮多次, 才是理論定義的碎形, 當然電腦圖形只需要做到, 例如, 第5代, 第6代看起來就很像 Koch 碎形了.
所以 以上, 我們還要加上一個 P規則(原書是指 production rule 的意思), 用 P : (F → F+F− −F+F), 來定義, 每次將直線段, 替換成一個小山形, 的動作,
這應該就是 L-system 有價值的地方, 他將一個直覺式的替換迭代動作, 用嚴謹的科學語言呈現.

最後實作還要,

  • 指定迭代次數, 例如 n=2
  • 迭代(產生)規則 production rule P : (F → F+F− −F+F), 依迭代次數 n =2, 進行字母替換動作, 演化, 就演化出最後一代的動作指令,
  • 再按照最後一代的指令, 令海龜繪圖, 才畫出想要的碎形圖.

例如

n = 0:
初始狀態
F

n = 1:
接著, 對於 n=0 中的初始狀態 F, 替換成 F+F−F−F+F (按照 產生規則 production rule P : (F → F+F− −F+F)),
得到
F+F−F−F+F

n = 2:
接著, 對於 n=1 中得到的 F+F−F−F+F, 中的所有 F, 通通替換成 F+F−F−F+F,
得到
(F+F−F−F+F)+(F+F−F−F+F)−(F+F−F−F+F)−(F+F−F−F+F)+(F+F−F−F+F),

再令海龜按照 F+F−F−F+F + F+F−F−F+F − F+F−F−F+F − F+F−F−F+F + F+F−F−F+F
繪圖, 按照 F + 等符號, 前進, 轉頭等畫圖, 就會畫出 迭代第二代之 Koch 曲線.


Lindenmayer 最經典的書中, DOL-systems 形式上的定義如下
Formal definitions describing DOL-systems and their operation are
given below:
A string DOL-system

  • is an ordered triplet G = (V, ω, P) where

  • V is the alphabet of the system
    (符號所成之集合, 符號表或稱字母表, 有的會再細分為常數constant與變數variable),

  • ω ∈ V ∗ V^{*} V is a nonempty word called the axiom (即初始狀態或初始值, 他用axiom公設這個字是有道理, 但是容易讓人無法望文生義, word 指由字母構成的單字, V ∗ V^{*} V={所有的 word }, V + V^{+} V+={所有的非空的 word })

  • and P ⊂ V × V + V × V^{+} V×V+ is a finite set of productions (即迭代規則, 產生規則 production rule, 常簡稱為 rule 規則).

也就是說, A string DOL-system 是一個 有序的3個符號組成的

  • G = (V, ω, P),

  • V 是存放你要用到的字母, V = { F , δ , + , − } V=\{ F, \delta, +, -\} V={F,δ,+,}, 例如 代表前進之 F, δ \delta δ 代表轉向之角度, + 代表逆時針轉, - 代表順時針轉,
    V = { F , δ , + , − } V=\{ F, \delta, +, -\} V={F,δ,+,} ,

  • V ∗ =    由字母    F , δ , + , − V^{*}= \; 由字母\; F, \delta, +, - V=由字母F,δ,+, 構成的單字word 所成的集合
    V ∗ = {    由字母 F , δ , + , − 構成的單字    } V^{*}=\{ \; 由字母F, \delta, +, -構成的單字 \; \} V={由字母F,δ,+,構成的單字}
    ={ 例如, 畫Koch之單字 F+F−−F+F, 畫Koch長城之單字 F+F−F−F+F, , 等等 }

  • ω \omega ω 初始狀態或初始值 (各書的符號不盡相同 ω \omega ω, omega, axiom, start 等)
    ω    ( i n i t i a l    c o n d i t i o n    初始狀態 )    =    F \omega\; (initial \; condition \;初始狀態)\; = \; F ω(initialcondition初始狀態)=F

  • P 迭代(產生)規則 (各書的符號不盡相同 P, rules, production rules 等)
    P : ( F → F + F − − F + F ) . P : (F → F+F− −F+F). P:(FF+FF+F).

就構成了這個 DOL-system 的 V, i.e., 符號所成之集合, 注意, 針對不同的圖, 你會給出不同的 DOL-system,
以上你可以看出, 迭代(產生)規則 P 是 L-system 最關鍵的概念!

註: 如果你的迭代規則會跟上下文有關, 則這是更進階的模型, 叫做 context sensitive, 這在後面再介紹.

最後實作還要,

  • 指定迭代次數, 例如 n=2
  • 產生規則 production rule P : (F → F+F− −F+F), 依迭代次數 n =2, 進行字母替換動作, 演化 就演化出最後一代的動作指令,
  • 再按照最後一代的指令, 令海龜繪圖, 才畫出想要的碎形圖.

例如

n = 0:
F

n = 1:
接著, 對於 n=0 中的 F, 替換成 F+F−F−F+F (按照 產生規則 production rule P : (F → F+F− −F+F)),
得到
F+F−F−F+F

n = 2:
接著, 對於 n=1 中的所有 F, 通通替換成 F+F−F−F+F,
得到
(F+F−F−F+F)+(F+F−F−F+F)−(F+F−F−F+F)−(F+F−F−F+F)+(F+F−F−F+F),

再令海龜按照 F+F−F−F+F + F+F−F−F+F − F+F−F−F+F − F+F−F−F+F + F+F−F−F+F
繪圖, 按照 F + 等符號, 前進, 轉頭等畫圖, 就會畫出 迭代第二代之 Koch 曲線.


對照以上 Lindenmayer 最原始的符號, 不難理解以下維基百科的符號變成有點不同, 其實就是把符號表再細分為常量與變量.
註: 如之前之講解, 所謂常量與變量, 取決於此符號他是否有跌代規則

維基百科的 L-system 與 符號之定義

G={V,S,ω,P},

V: 變量符號集合

S:常量符號集合

ω (omega, 或有的叫 axiom, 有的叫 start 等等):初始狀態

P:產生式規則 (遞歸迭代規則)

自初始狀態開始疊代套入L-system的文法規則,和正規文法所產生的語言不同處在於,L-system 在一次疊代中可同時套用許多不同的文法規則。如果在一次疊代中只能夠套用一個文法規則,產生出來的結果被稱為語言而不是 L-system。由此可知,L-system 為正規文法所產生出的語言的子集合。

例子

Example 1: Algae 海藻細胞分裂生長的模式

Algae 是海藻的英文, 這個例子出自Lindenmayer 最經典的書中, 他提一個最基本的例子用來解釋 DOL-system, P.4, 模擬海藻細胞分裂生長的模式:
Lindenmayer_p.4_海藻演化規則的推導圖
他的圖是以 b 為起始值, 以下維基的圖是以 a 開始:
L-system_Algae_規則演化樹狀圖_Wiki
Wiki 海藻, 按規則推導演化的代數(文字)寫法:
L-system_Algae_規則演化表_Wiki
Wiki 也講到, 每代演化的指令, 長度會按照 費氏數列增長:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
如果是跟 Lindenmayer 的書一樣, 以 b 為起始值, 則增長模式是:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

Example 4: A variant of the Koch curve (長城形 Koch)

這個例子是可視為 Koch 的推廣, 畫長城形, 而非山形(正三角形)

A variant of the Koch curve which uses only right angles.

variables : F
constants : + −
start : F
rules : (F → F+F−F−F+F)
Here, F means “draw forward”, + means “turn left 90°”, and − means “turn right 90°” (see turtle graphics).

n = 0:
F

n = 1:
F+F−F−F+F

n = 2:
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F

n = 3:
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F+
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F−
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F−
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F+
F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F

再令海龜按照 F + 等符號前進轉頭等畫圖, 就會畫出 Koch 曲線.

L-system 之 Python turtle 模組實現

L-system 之 Matplotlib 繪圖實現

張若愚, Python 科學計算這本的 codes

以下我們先參考 張若愚, Python 科學計算這本的 codes,
Ref:

  • 張若愚, 用 Python 做科学计算, https://docs.huihoo.com/scipy/scipy-zh-cn/index.html link

  • 張若愚, 绘制 L-System 的分形图 源碼: https://docs.huihoo.com/scipy/scipy-zh-cn/example_lsystem.html link

由於他的 codes, 是 Python2, 只要修改裡面 'xrange'() 改成 Python3 的 range() 即可正常執行:
L-system-張若愚, Python 科學計算ch19

# 張若愚, Python 科學計算, ch19.
# -*- coding: utf-8 -*-
#L-System(Lindenmayer system)是一種用字串替代產生分形圖形的算法

from math import sin, cos, pi
import matplotlib.pyplot as pl


class L_System(object):
    def __init__(self, rule):
        info = rule['S']
        for i in range(rule['iter']):
            ninfo = []
            for c in info:
                if c in rule:
                    ninfo.append(rule[c])
                else:
                    ninfo.append(c)
            info = "".join(ninfo)
        self.rule = rule
        self.info = info

    def get_lines(self):
        d = self.rule['direct']
        a = self.rule['angle']
        p = (0.0, 0.0)
        l = 1.0
        lines = []
        stack = []
        for c in self.info:
            if c in "Ff":
                r = d * pi / 180
                t = p[0] + l*cos(r), p[1] + l*sin(r)
                lines.append(((p[0], p[1]), (t[0], t[1])))
                p = t
            elif c == "+":
                d += a
            elif c == "-":
                d -= a
            elif c == "[":
                stack.append((p,d))
            elif c == "]":
                p, d = stack[-1]
                del stack[-1]
        return lines

rules = [
    {
        "F":"F+F--F+F", "S":"F",
        "direct":180,
        "angle":60,
        "iter":5,
        "title":"Koch"
    },
    {
        "X":"X+YF+", "Y":"-FX-Y", "S":"FX",
        "direct":0,
        "angle":90,
        "iter":13,
        "title":"Dragon"
    },
    {
        "f":"F-f-F", "F":"f+F+f", "S":"f",
        "direct":0,
        "angle":60,
        "iter":7,
        "title":"Triangle"
    },
    
    {
        "X":"F-[[X]+X]+F[+FX]-X", "F":"FF", "S":"X",
        "direct":-45,
        "angle":25,
        "iter":6,
        "title":"Plant"
    }
    
    ,
    
    {
        "S":"X", "X":"-YF+XFX+FY-", "Y":"+XF-YFY-FX+",
        "direct":0,
        "angle":90,
        "iter":6,
        "title":"Hilbert"
    },
    {
        "S":"L--F--L--F", "L":"+R-F-R+", "R":"-L+F+L-",
        "direct":0,
        "angle":45,
        "iter":10,
        "title":"Sierpinski"
    },
    
]

from matplotlib import collections
def draw(ax, rule, iter=None):
    if iter!=None:
        rule["iter"] = iter
    lines = L_System(rule).get_lines() 
    linecollections = collections.LineCollection(lines) 
    ax.add_collection(linecollections, autolim=True) 
    ax.axis("equal")
    ax.set_axis_off()
    ax.set_xlim(ax.dataLim.xmin, ax.dataLim.xmax)
    ax.invert_yaxis()
    
    
fig = pl.figure(figsize=(7,4.5))
fig.patch.set_facecolor("w")

#for i in xrange(6):
for i in range(6):
    ax = fig.add_subplot(231+i)
    draw(ax, rules[i])

fig.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0,hspace=0)
pl.show()

以下我分析
最關鍵的張若愚程式碼部分: 執行, 依照替代規則對字母進行替換

#Prof. P-J Lai MATH NKNU 20210624
S: 初始值
將 S 改名為 Init
只看 rules 的第一個規則, 畫 Koch 的

rules = [
{
    "F":"F+F--F+F",
    "Init":"F",
    "direct":180,
    "angle":60,
    "iter":5,
    "title":"Koch"
},,,,
,,,,
]

ruleKoch = {
    "F":"F+F--F+F",
    "Init":"F",
    "direct":180,
    "angle":60,
    "iter":5,
    "title":"Koch"
}

info = ruleKoch['Init'] #取出初始值的內容
for i in range(ruleKoch['iter']):
    ninfo = []
    for c in info: #依序取出i=0初始值, i=1第一代的字母,,,
                   # info放的是前一次演化的字串
        if c in rule: # 如果此字母, 有迭代規則, 就將替換字母加入 info
            ninfo.append(rule[c])
        else:  # 如果此字母, 沒有迭代規則, 就將原字母加入 info
            ninfo.append(c)
    info = "".join(ninfo) # 用 join()將數個字串打平, 合併成一個字串


    i =0 時 
    info = "F"
    for c in info:
    c = "F"
    則 c in rule迭代規則
    ninfo.append(rule[c]): ninfo=["F+F--F+F"]

    info = "".join(ninfo): info ="F+F--F+F"

    i =1 時 
    info = "F+F--F+F"
    ninfo = []
    for c in info:
    c = "F"
    則 c in rule迭代規則
    ninfo.append(rule[c]):
    ninfo=["F+F--F+F"]

    
    for c in info:
    c = "+"
    則 c 沒in rule迭代規則
    ninfo.append(c)
    ninfo=["F+F--F+F","+"]


    外迴圈i=1 內, 做完小迴圈得到, 第二代(i=1) 的執行繪圖指令
    ninfo=["F+F−F−F+F","+","F+F−F−F+F","−","F+F−F−F+F","−",
    "F+F−F−F+F","+","F+F−F−F+F"]
    但是是一個 str構成的 list,
    以下再用 "".join() 將他轉成一個str.

    得到第二代(i=1) 的執行指令
    info = "".join(ninfo):
    info = "F+F−F−F+F+F+F−F−F+F−F+F−F−F+F−F+F−F−F+F+F+F−F−F+F"

Reference

  • 維基 L-system 介紹, https://en.wikipedia.org/wiki/L-system link.

  • Lindenmayer 最經典的書: Przemyslaw Prusinkiewicz, Aristid Lindenmayer, The Algorithmic Beauty of Plants link.

  • Lindenmayer Systems, Fractals, and Plants originated as notes for the SIGRAPH 1988 course Fractals: Introduction, basics, and applications. They were published, with minor editorial changes, as a book by Springer-Verlag, New York, in 1989, and reprinted in 1992. This electronic version has been produced from the LaTeX files for the SIGGRAPH course, retrofitted with the editorial changes made for the book. Most figures were recreated using the original L-system files.link

  • 生成式藝術和演算法創作07 L, https://zhuanlan.zhihu.com/p/50712698 link

  • Michael Hansmeyer:塑造不可思议, https://v.youku.com/v_show/id_XNDc4MDM2NzA4.html link

  • https://youtu.be/qtPi0JvmWbs
    Generative Art
    生成藝術暑期工作營
    東南大學建築學院 建築運算與應用研究所

  • Creative Algorithms - Generative Design & Creative Coding Art
    https://youtu.be/Z9NLxrkMWM4

  • 張若愚, 用 Python 做科学计算, https://docs.huihoo.com/scipy/scipy-zh-cn/index.html link

  • 張若愚, 绘制 L-System 的分形图 源碼: https://docs.huihoo.com/scipy/scipy-zh-cn/example_lsystem.html link

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值