Shoelace formula

本文介绍了一种用于计算简单多边形面积的数学算法——鞋带公式。该算法通过交叉相乘坐标来确定多边形所包围的面积,并从周围多边形中减去这部分面积以得到内部多边形的面积。文章提供了详细的计算步骤和实例。
From Wikipedia, the free encyclopedia

The shoelace formula, or shoelace algorithm, is a mathematical algorithm to determine the area of a simple polygon whose vertices are described by ordered pairs in the plane[1]. The user cross-multiplies corresponding coordinates to find the area encompassing the polygon, and subtracts it from the surrounding polygon to find the area of the polygon within. It is called the shoelace formula because of the constant cross-multiplying for the coordinates making up the polygon, like tying shoelaces[2]. It is also sometimes called the shoelace method. It is also known as Gauss' area formula, after Carl Friedrich Gauss. It has applications in surveying and forestry,[3] among other areas. It is also called the surveyor's formula[4].

The formula can be represented by the expression:

 \mathbf{A} = {1 \over 2} \Big | \sum_{i=1}^{n-1} x_iy_{i+1} + x_ny_1 - \sum_{i=1}^{n-1} x_{i+1}y_i - x_1y_n \Big |
   = {1 \over 2}|x_1y_2 + x_2y_3 + \cdots + x_{n-1}y_n + x_ny_1 - x_2y_1 - x_3y_2 - \cdots - x_ny_{n-1} - x_1y_n|

where

  • A is the area of the polygon,
  • n is the number of sides of the polygon, and
  • (xiyi), i = 1, ,..., n are the vertices (or "corners") of the polygon.[5]

Alternatively:[3][6]

\mathbf{A} = {1 \over 2} \Big | \sum_{i=1}^{n} x_i(y_{i+1}-y_{i-1}) \Big | = {1 \over 2} \Big | \sum_{i=1}^{n} y_i(x_{i+1}-x_{i-1}) \Big | = {1 \over 2} \Big | \sum_{i=1}^{n} x_iy_{i+1}-x_{i+1}y_i \Big |

where xn+1 = x1 and x0 = xn, as well as yn+1 = y1 and y0 = yn.

If the points are labeled sequentially in the counterclockwise direction, then the above determinants are positive and the absolute value signs can be omitted;[4] if they are labeled in the clockwise direction, the determinants will be negative. This is because the formula can be viewed as a special case of Green's Theorem.

Contents

 [hide

[edit] Examples

The user must know the points of the polygon in a Cartesian plane. For example, take a triangle with coordinates {(2, 1), (4, 5), (7, 8)}. Take the first x-coordinate and multiply it by the second y-value, and repeat, and keep repeating this process. This can be defined by this formula:

 \mathbf{A}_\text{tri.} = {1 \over 2}|x_1y_2 + x_2y_3 + x_3y_1 - x_2y_1 - x_3y_2 - x_1y_3|

for xn and yn representing each respective coordinate. This formula is just the expansion of those given above for the case n = 3. Using it, one can find that the area of the triangle equals one half of the absolute value of 10 + 32 + 7 − 4 − 35 − 16, which equals 3. The number of variables depends on the number of sides of the polygon. For example, a pentagon will be defined up to x5 and y5:

 \mathbf{A}_\text{pent.} = {1 \over 2}|x_1y_2 + x_2y_3 + x_3y_4 + x_4y_5 + x_5y_1 - x_2y_1 - x_3y_2 - x_4y_3 - x_5y_4 - x_1y_5|

A quadrilateral will be defined up to x4 and y4:

 \mathbf{A}_\text{quad.} = {1 \over 2}|x_1y_2 + x_2y_3 +x_3y_4 + x_4y_1 - x_2y_1 - x_3y_2 - x_4y_3 - x_1y_4|

[edit] More complex example

Consider the polygon defined by the points (3,4), (5,11), (12,8), (9,5), and (5,6), and illustrated in the following diagram:

Figure of this example

The area of this polygon is:

\begin{align}\mathbf{A} & = {1 \over 2}|3 \times 11 + 5 \times 8 + 12 \times 5 + 9 \times 6 + 5 \times 4 \\& {} \qquad\qquad {} - 4 \times 5 - 11 \times 12 - 8 \times 9 - 5 \times 5 - 6 \times 3| \\[10pt]& = {60 \over 2} = 30\end{align}

[edit] Explanation of name

The reason this formula is called the shoelace formula is because of a common method used to evaluate it. This method uses matrices. As an example, choose the triangle with vertices (2,4), (3,−8), and (1,2). Then construct the following matrix by “walking around” the triangle and ending with the initial point.

 \begin{bmatrix} 2 & 4 \\ 3 & -8 \\ 1 & 2 \\ 2 & 4 \end{bmatrix} [7]

First, draw diagonal down and to the right slashes (as shown below),

   ShoelaceMatrix2.GIF

and multiply the two numbers connected by each slash, then add all the products: (2 × −8) + (3 × 2) + (1 × 4) = −6. Do the same with slashes diagonal down and to the left (shown below with former slashes):

   ShoelaceMatrix3.GIF

(4 × 3) + (−8 × 1) + (2 × 2) = 8. Then, subtract these two numbers and take the absolute value of the difference: |−6 − 8| = 14. Halving this gives the area of the triangle: 7. Organizing the numbers like this makes the formula easier to recall and evaluate. With all the slashes drawn, the matrix loosely resembles a shoe with the laces done up, giving rise to the algorithm's name.

[edit] References

  1. ^ http://staff.imsa.edu/math/journal/volume2/articles/Shoelace.pdf
  2. ^ Shoelace Formula
  3. ^ a b Hans Pretzsch, Forest Dynamics, Growth and Yield: From Measurement to Model, Springer, 2009, ISBN 3540883061, p. 232.
  4. ^ a b Bart Braden (1986). "The Surveyor’s Area Formula". The College Mathematics Journal 17 (4): 326–337.
  5. ^ Geometry for Enjoyment and Challenge section 16.2
  6. ^ Shoelace Theorem, Art of Problem Solving Wiki.
  7. ^ IMSA JHMC Guide, Page. 10 "Shoelace" by Cindy Xi

import numpy as np import pandas as pd from scipy.optimize import minimize_scalar from scipy.spatial import ConvexHull # -------------------------- Basic Function Definitions -------------------------- def trapezoidal_integral(f, lambda_nm): """ Trapezoidal integration for spectral data :param f: Integrand array :param lambda_nm: Wavelength array :return: Integration result """ return np.sum((f[:-1] + f[1:]) / 2 * np.diff(lambda_nm)) def compute_xyz(spd, x_bar, y_bar, z_bar, lambda_nm): """ Calculate CIE XYZ tristimulus values :param spd: Spectral power distribution :param x_bar, y_bar, z_bar: CIE 1931 standard observer functions :param lambda_nm: Wavelength array :return: X, Y, Z tristimulus values """ X = trapezoidal_integral(spd * x_bar, lambda_nm) Y = trapezoidal_integral(spd * y_bar, lambda_nm) Z = trapezoidal_integral(spd * z_bar, lambda_nm) return X, Y, Z def planckian_locus_xy(T): """ Calculate chromaticity coordinates (x_b, y_b) on Planckian locus for given color temperature T :param T: Color temperature (K) :return: x_b, y_b chromaticity coordinates on Planckian locus """ if T < 1000 or T > 25000: raise ValueError("Color temperature should be between 1000-25000K") # Calculate x_b (Planckian locus x coordinate) if T <= 4000: x_b = -0.2661239e9 / T**3 - 0.2343580e6 / T**2 + 0.8776956e3 / T + 0.179910 else: x_b = -3.0258469e9 / T**3 + 2.1070379e6 / T**2 + 0.2226347e3 / T + 0.240390 # Calculate y_b (Planckian locus y coordinate) if T <= 2222: y_b = -1.1063814 * x_b**3 - 1.34811020 * x_b**2 + 2.18555832 * x_b - 0.20219683 elif T <= 4000: y_b = -0.9549476 * x_b**3 - 1.37418593 * x_b**2 + 2.09137015 * x_b - 0.16748867 else: y_b = 3.0817580 * x_b**3 - 5.87338670 * x_b**2 + 3.75112997 * x_b - 0.37001483 return x_b, y_b def ciede2000_delta_e(lab_sample, lab_standard): """ Calculate CIEDE2000 color difference :param lab_sample: LAB coordinates of test color sample under test light source [L*, a*, b*] :param lab_standard: LAB coordinates of test color sample under standard light source [L*0, a*0, b*0] :return: delta_E00 color difference """ L, a, b = lab_sample L0, a0, b0 = lab_standard # Lightness difference delta_L = L - L0 # Chroma calculation C = np.sqrt(a**2 + b**2) C0 = np.sqrt(a0**2 + b0**2) C_avg = (C + C0) / 2 # Chroma difference delta_C = C - C0 # Hue angle calculation h = np.degrees(np.arctan2(b, a)) if C != 0 else 0 h0 = np.degrees(np.arctan2(b0, a0)) if C0 != 0 else 0 # Hue difference delta_h = h - h0 if C * C0 == 0: delta_H = 0 else: if np.abs(delta_h) <= 180: delta_H = delta_h else: delta_H = delta_h - 360 if delta_h > 0 else delta_h + 360 # Hue difference in polar coordinates delta_H = 2 * np.sqrt(C * C0) * np.sin(np.radians(delta_H) / 2) # Average hue angle h_avg = (h + h0) / 2 if np.abs(h - h0) <= 180 else (h + h0 + 360) / 2 if h + h0 < 360 else (h + h0 - 360) / 2 # Calculate T for hue rotation term T = 1 - 0.17 * np.cos(np.radians(h_avg - 30)) + 0.24 * np.cos(np.radians(2 * h_avg)) + \ 0.32 * np.cos(np.radians(3 * h_avg + 6)) - 0.20 * np.cos(np.radians(4 * h_avg - 63)) # Rotation term delta_theta = 30 * np.exp(-(((h_avg - 275) / 25) ** 2)) R_C = 2 * np.sqrt((C_avg ** 7) / (C_avg ** 7 + 25 ** 7)) R_T = -R_C * np.sin(np.radians(2 * delta_theta)) # Calculate parametric factors L_avg = (L + L0) / 2 S_L = 1 + (0.015 * (L_avg - 50) ** 2) / np.sqrt(20 + (L_avg - 50) ** 2) S_C = 1 + 0.045 * C_avg S_H = 1 + 0.015 * C_avg # Calculate delta_E00 delta_E00 = np.sqrt( (delta_L / (1 * S_L)) ** 2 + (delta_C / (1 * S_C)) ** 2 + (delta_H / (1 * S_H)) ** 2 + R_T * (delta_C / S_C) * (delta_H / S_H) ) return delta_E00 def xy_to_uv_prime(x, y): """ Convert xy chromaticity coordinates to CIE u'v' chromaticity coordinates :param x, y: xy chromaticity coordinates :return: u', v' chromaticity coordinates """ denominator = -2 * x + 12 * y + 3 # Corrected denominator formula u_prime = 4 * x / denominator v_prime = 9 * y / denominator return u_prime, v_prime def shoelace_area(points): """ Calculate polygon area using shoelace formula :param points: Polygon vertex coordinate array (n, 2) :return: Polygon area """ points = np.vstack([points, points[0]]) # Close the polygon return 0.5 * np.abs(np.sum(points[:-1, 0] * points[1:, 1] - points[1:, 0] * points[:-1, 1])) # -------------------------- Main Calculation Program -------------------------- def main(): """Main program: Read data and calculate all spectral characteristic parameters""" # -------------------------- Data Reading -------------------------- # Read Excel data (assuming all data is in different sheets of the same Excel file) # In practical applications, modify the file path and sheet names according to data storage location excel_file = "Problem 1.xlsx" try: # Read LED spectral power distribution (SPD) led_spd_df = pd.read_excel(excel_file, sheet_name="LED_SPD") lambda_nm = led_spd_df["Wavelength"].values # Wavelength array (380-780nm) spd_led = led_spd_df["SPD"].values # LED spectral power distribution # Read CIE 1931 standard observer functions cie_xyz_df = pd.read_excel(excel_file, sheet_name="CIE_1931_XYZ") x_bar = cie_xyz_df["x_bar"].values # xbar function y_bar = cie_xyz_df["y_bar"].values # ybar function z_bar = cie_xyz_df["z_bar"].values # zbar function # Read 24 CIE test color sample reflectances color_samples_df = pd.read_excel(excel_file, sheet_name="CIE_24_Colors") rho = color_samples_df.iloc[:, 1:25].values # Reflectance array (401x24) # Read standard light source D65 SPD d65_spd_df = pd.read_excel(excel_file, sheet_name="D65_SPD") spd_d65 = d65_spd_df["SPD"].values # D65 spectral power distribution # Read melanopic efficiency function melanopic_df = pd.read_excel(excel_file, sheet_name="Melanopic_S") s_mel = melanopic_df["S"].values # melanopic efficiency function except FileNotFoundError: print(f"Error: Excel file '{excel_file}' not found.") return except KeyError as e: print(f"Error: Missing column in Excel file - {e}") return # Validate data arrays have the same length data_arrays = [lambda_nm, spd_led, x_bar, y_bar, z_bar, spd_d65, s_mel] if len(set(len(arr) for arr in data_arrays)) != 1: print("Error: All spectral data arrays must have the same length") return # -------------------------- Color Characteristic Parameters Calculation (CCT, Duv) -------------------------- # Calculate LED's XYZ tristimulus values and chromaticity coordinates X_led, Y_led, Z_led = compute_xyz(spd_led, x_bar, y_bar, z_bar, lambda_nm) sum_xyz_led = X_led + Y_led + Z_led if sum_xyz_led == 0: print("Error: XYZ sum is zero, cannot calculate chromaticity coordinates") return x_led = X_led / sum_xyz_led y_led = Y_led / sum_xyz_led # Convert to u', v' coordinates for more accurate CCT calculation u_led, v_led = xy_to_uv_prime(x_led, y_led) # Function to calculate distance to Planckian locus in u', v' coordinates def distance_to_locus(T): x_b, y_b = planckian_locus_xy(T) u_b, v_b = xy_to_uv_prime(x_b, y_b) return (u_led - u_b)**2 + (v_led - v_b)** 2 # Find CCT by minimizing distance to Planckian locus try: result = minimize_scalar(distance_to_locus, bounds=(1000, 25000), method='bounded') cct = result.x # Correlated color temperature # Calculate Duv (distance from Planckian locus) x_b, y_b = planckian_locus_xy(cct) u_b, v_b = xy_to_uv_prime(x_b, y_b) duv = (v_led - v_b) / 0.0014 # 0.0014 is the scaling factor for Duv except ValueError as e: print(f"Error calculating CCT: {e}") cct, duv = None, None # -------------------------- Color Rendering Parameters Calculation (Rf, Rg) -------------------------- n_samples = 24 # Number of CIE test color samples xyz_led_samples = np.zeros((n_samples, 3)) # XYZ values of color samples under LED xyz_d65_samples = np.zeros((n_samples, 3)) # XYZ values of color samples under D65 # Calculate XYZ tristimulus values for all color samples under LED and D65 for i in range(n_samples): rho_i = rho[:, i] # Reflectance of the i-th color sample # XYZ under LED spd_led_i = spd_led * rho_i X, Y, Z = compute_xyz(spd_led_i, x_bar, y_bar, z_bar, lambda_nm) xyz_led_samples[i] = (X, Y, Z) # XYZ under D65 spd_d65_i = spd_d65 * rho_i X, Y, Z = compute_xyz(spd_d65_i, x_bar, y_bar, z_bar, lambda_nm) xyz_d65_samples[i] = (X, Y, Z) # Calculate XYZ tristimulus values of D65 (white reference) X_d65, Y_d65, Z_d65 = compute_xyz(spd_d65, x_bar, y_bar, z_bar, lambda_nm) sum_xyz_d65 = X_d65 + Y_d65 + Z_d65 # Calculate LAB coordinates for all color samples def xyz_to_lab(xyz, xyz_ref): """XYZ to LAB color space conversion""" x, y, z = xyz x_ref, y_ref, z_ref = xyz_ref # Avoid division by zero if x_ref == 0 or y_ref == 0 or z_ref == 0: return [0, 0, 0] x /= x_ref y /= y_ref z /= z_ref # Non-linear transformation function def f(t): return t**(1/3) if t > (6/29)**3 else (t * (29/6)**2)/3 + 4/29 L = 116 * f(y) - 16 a = 500 * (f(x) - f(y)) b = 200 * (f(y) - f(z)) return np.array([L, a, b]) # Calculate LAB values using respective white references lab_led = np.array([xyz_to_lab(xyz, (X_led, Y_led, Z_led)) for xyz in xyz_led_samples]) lab_d65 = np.array([xyz_to_lab(xyz, (X_d65, Y_d65, Z_d65)) for xyz in xyz_d65_samples]) # Calculate fidelity index Rf rf = None try: delta_e00_list = [ciede2000_delta_e(lab_led[i], lab_d65[i]) for i in range(n_samples)] avg_delta_e00 = np.mean(delta_e00_list) rf = 100 - 4.6 * avg_delta_e00 # ANSI/IES TM-30-15 formula rf = max(0, min(100, rf)) # Ensure Rf is within 0-100 range except Exception as e: print(f"Error calculating Rf: {e}") # Calculate gamut index Rg rg = None try: def get_uv_prime_points(xyz_samples): """Convert XYZ color samples to u'v' coordinate array""" uv_points = [] for xyz in xyz_samples: X, Y, Z = xyz sum_xyz = X + Y + Z if sum_xyz == 0: uv_points.append([0, 0]) continue x = X / sum_xyz y = Y / sum_xyz u, v = xy_to_uv_prime(x, y) uv_points.append([u, v]) return np.array(uv_points) # Calculate gamut areas using convex hulls for LED and D65 uv_led = get_uv_prime_points(xyz_led_samples) uv_d65 = get_uv_prime_points(xyz_d65_samples) # Compute convex hulls to get the gamut boundaries hull_led = ConvexHull(uv_led) hull_d65 = ConvexHull(uv_d65) # Calculate areas using shoelace formula on convex hull vertices area_led = shoelace_area(uv_led[hull_led.vertices]) area_d65 = shoelace_area(uv_d65[hull_d65.vertices]) rg = (area_led / area_d65) * 100 if area_d65 != 0 else 0 except Exception as e: print(f"Error calculating Rg: {e}") # -------------------------- Circadian Rhythm Parameter Calculation (mel-DER) -------------------------- mel_der = None try: # Calculate melanopic irradiance for LED e_mel_led = trapezoidal_integral(spd_led * s_mel, lambda_nm) # Calculate melanopic irradiance for D65 for comparison e_mel_d65 = trapezoidal_integral(spd_d65 * s_mel, lambda_nm) # melanopic Daylight Equivalent Ratio mel_der = e_mel_led / e_mel_d65 if e_mel_d65 != 0 else 0 except Exception as e: print(f"Error calculating mel-DER: {e}") # -------------------------- Result Output -------------------------- print("LED Light Source Spectral Characteristic Parameters Calculation Results:") print(f"1. Correlated Color Temperature (CCT): {cct:.1f} K" if cct is not None else "1. Correlated Color Temperature (CCT): Error") print(f"2. Distance from Planckian Locus (Duv): {duv:.4f}" if duv is not None else "2. Distance from Planckian Locus (Duv): Error") print(f"3. Fidelity Index (Rf): {rf:.1f}" if rf is not None else "3. Fidelity Index (Rf): Error") print(f"4. Gamut Index (Rg): {rg:.1f} %" if rg is not None else "4. Gamut Index (Rg): Error") print(f"5. Melatonin Daylight Illuminance Ratio (mel-DER): {mel_der:.3f}" if mel_der is not None else "5. Melatonin Daylight Illuminance Ratio (mel-DER): Error") # -------------------------- Program Entry -------------------------- if __name__ == "__main__": main() 能把他转化为MATLAB的代码并加上注释
08-09
请把以下內容转成markdown语法 向量叉积求三角形面积详解 一、向量叉积的基本概念 向量叉积(Cross Product)是向量运算中的一种重要运算,在二维和三维空间中有着不同的表现形式。在二维空间中,两个向量的叉积是一个标量;在三维空间中,两个向量的叉积是一个向量。 二维空间中的叉积: 对于两个二维向量 u = (x₁, y₁) 和 v = (x₂, y₂),它们的叉积定义为: u × v = x 1 y 2 − x 2 y 1 u×v=x 1 ​ y 2 ​ −x 2 ​ y 1 ​ 这个结果是一个标量,其绝对值等于这两个向量所张的平行四边形的面积。 二、叉积的几何意义 模长意义: 叉积的绝对值 |u × v| 等于以 u 和 v 为邻边的平行四边形的面积。 因此,三角形的面积就是平行四边形面积的一半: Area = 1 2 ∣ u × v ∣ Area= 2 1 ​ ∣u×v∣ 方向意义: 叉积的正负号表示两个向量的相对方向: 正值表示 v 在 u 的逆时针方向 负值表示 v 在 u 的顺时针方向 零表示两个向量共线 三、三角形面积的计算方法 给定平面上的三个点 A(x₁,y₁)、B(x₂,y₂)、C(x₃,y₃),要计算它们构成的三角形面积: 构造向量: 向量 AB = B - A = (x₂ - x₁, y₂ - y₁) 向量 AC = C - A = (x₃ - x₁, y₃ - y₁) 计算叉积: A B × A C = ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) AB×AC=(x 2 ​ −x 1 ​ )(y 3 ​ −y 1 ​ )−(x 3 ​ −x 1 ​ )(y 2 ​ −y 1 ​ ) 计算面积: Area = 1 2 ∣ A B × A C ∣ Area= 2 1 ​ ∣AB×AC∣ 四、计算步骤详解 让我们通过一个具体例子来说明计算过程: 示例: 给定三个点 A(0,0)、B(4,0)、C(0,3) 计算向量: AB = (4-0, 0-0) = (4, 0) AC = (0-0, 3-0) = (0, 3) 计算叉积: A B × A C = 4 × 3 − 0 × 0 = 12 AB×AC=4×3−0×0=12 计算面积: Area = 1 2 × ∣ 12 ∣ = 6 Area= 2 1 ​ ×∣12∣=6 六、特殊情况的处理 三点共线: 当三个点共线时,叉积为0,面积为0。 这是判断三点是否共线的一个有效方法。 点的顺序: 点的输入顺序不影响面积计算结果,因为取的是绝对值。 但是会影响叉积的正负号,这在某些应用中(如判断点是否在三角形内)很重要。 七、与其他方法的比较 海伦公式: 需要先计算三边长度,再进行开方运算。 计算量较大,且存在精度问题。 公式: Area = s ( s − a ) ( s − b ) ( s − c ) Area= s(s−a)(s−b)(s−c) ​ 其中 s = a + b + c 2 s= 2 a+b+c ​ 底乘高公式: 需要额外计算高度。 不如叉积法直接。 叉积法的优势: 计算简单,只需加减乘运算。 精度高,没有开方运算。 可以直接判断方向性。 八、应用扩展 多边形面积计算: 可以将多边形分解为多个三角形,用叉积法求和。 或者使用鞋带公式(Shoelace formula),本质也是基于叉积。 点与三角形的位置关系: 通过叉积可以判断点是否在三角形内。 计算点与三角形各边构成的子三角形面积。 凸包算法: 在Graham扫描等凸包算法中,叉积用于判断点的转向。 九、常见问题解答 为什么叉积能表示面积? 从行列式的几何意义来看,二阶行列式的绝对值就是两个向量张成的平行四边形的面积。 三维空间中的叉积有何不同? 三维叉积结果是一个向量,方向垂直于两个向量所在的平面。 模长仍然表示平行四边形的面积。 如何判断三角形的方向(顺时针/逆时针)? 看叉积的符号:正为逆时针,负为顺时针。 十、练习题 给定三点A(1,1)、B(4,1)、C(1,5),计算三角形面积。 证明三点A(0,0)、B(x1,y1)、C(x2,y2)共线的充要条件是x1y2 - x2y1 = 0。 编写一个函数,判断第四个点D是否在三角形ABC内。 总结 向量叉积法求三角形面积是计算几何中最基础也最重要的技术之一。它不仅计算高效、精度高,而且可以扩展到许多其他几何问题的求解。掌握这个方法,对于学习更高级的计算几何算法有很大帮助。
最新发布
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值