You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找可将指定正方形S缩放至4倍面积的矩阵并使用Python实现

解决正方形缩放4倍面积的矩阵变换及Python实现

核心原理:线性变换的面积缩放因子

线性变换矩阵(M)的行列式绝对值就是面积缩放比例。要将原正方形面积放大4倍,需满足(|det(M)| = 4)(变换后面积 = 原面积 × (|det(M)|))。

原正方形面积计算:原正方形边长为2(从-1到1的距离),面积为(2×2=4)。也可以用邻边向量的行列式验证:取两个邻边向量(\vec{u}=(2,0))(从(-1,1)到(1,1))和(\vec{v}=(0,-2))(从(-1,1)到(-1,-1)),组成方阵(\begin{bmatrix}2&0\0&-2\end{bmatrix}),行列式为(2×(-2)-0×0=-4),绝对值4就是原面积。

选择合适的缩放矩阵

最直观的是均匀缩放矩阵:

M = [[2, 0],
     [0, 2]]

该矩阵的行列式为(2×2=4),满足面积放大4倍的要求。它会将每个顶点的x、y坐标都乘以2,得到边长为4的新正方形,面积为(4×4=16=4×4),正好是原面积的4倍。

如果需要非均匀缩放(比如x方向缩放4倍,y方向缩放1倍,行列式同样为4),矩阵可以是(\begin{bmatrix}4&0\0&1\end{bmatrix}),但得到的是长方形,面积同样满足要求。根据需求选择即可,以下以均匀缩放为例。

Python实现代码

用numpy处理矩阵运算更简洁:

import numpy as np

# 原顶点矩阵:每列对应一个顶点,行分别为x、y坐标
original_vertices = np.array([
    [-1, 1, 1, -1],  # x坐标
    [1, 1, -1, -1]   # y坐标
])

# 定义缩放矩阵(均匀缩放,行列式=4)
scale_matrix = np.array([
    [2, 0],
    [0, 2]
])

# 矩阵乘法:缩放后的顶点矩阵
scaled_vertices = scale_matrix @ original_vertices

# 计算原面积(用邻边向量行列式)
u = original_vertices[:, 1] - original_vertices[:, 0]  # 从顶点0到顶点1的向量
v = original_vertices[:, 3] - original_vertices[:, 0]  # 从顶点0到顶点3的向量
original_area = abs(np.linalg.det(np.column_stack((u, v))))

# 计算缩放后面积
scaled_u = scaled_vertices[:, 1] - scaled_vertices[:, 0]
scaled_v = scaled_vertices[:, 3] - scaled_vertices[:, 0]
scaled_area = abs(np.linalg.det(np.column_stack((scaled_u, scaled_v))))

# 输出结果
print("原顶点矩阵:")
print(original_vertices)
print("\n缩放后的顶点矩阵:")
print(scaled_vertices)
print(f"\n原面积:{original_area},缩放后面积:{scaled_area},缩放比例:{scaled_area / original_area}")

运行结果:

  • 原顶点矩阵的列对应(-1,1)、(1,1)、(1,-1)、(-1,-1)
  • 缩放后的顶点矩阵列对应(-2,2)、(2,2)、(2,-2)、(-2,-2)
  • 原面积4,缩放后面积16,比例为4,符合要求

行列式求面积的误区解析

之前用行列式求面积失败,大概率是直接对顶点矩阵(非方阵)求行列式了——行列式仅针对方阵有效。正确的做法有两种:

  1. 取多边形的邻边向量组成方阵,再计算行列式的绝对值;
  2. 用鞋带公式计算任意多边形面积,代码如下:
def polygon_area(vertices):
    # vertices是2×n的矩阵,转置后适配鞋带公式(每行一个顶点)
    verts = vertices.T
    n = len(verts)
    area = 0.0
    for i in range(n):
        j = (i + 1) % n
        area += verts[i][0] * verts[j][1]
        area -= verts[j][0] * verts[i][1]
    return abs(area) / 2

# 用鞋带公式计算面积
original_area_shoelace = polygon_area(original_vertices)
scaled_area_shoelace = polygon_area(scaled_vertices)
print(f"\n鞋带公式计算:原面积{original_area_shoelace},缩放后面积{scaled_area_shoelace}")

内容的提问来源于stack exchange,提问作者Asis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:50:41