Skip to content

Latest commit

 

History

History
444 lines (317 loc) · 17.3 KB

File metadata and controls

444 lines (317 loc) · 17.3 KB
Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0695
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在: 
	- 个人网站: `https://oeasy.org` 
	- 蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
	- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
	- Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

几何_解析几何_笛卡尔_数形结合_营造法式

回忆

  • 上次我们看了

    1. 器物
    2. 场景
  • 三维建模就像按照图纸施工

图片描述

  • 图纸这种东西怎么来的呢?

回顾历史

  • 苏美尔住宅平面泥板
    • 相当于今天的施工图
    • 按这个施工
    • 俯视图

图片描述

  • 人类 首个按比例、标尺寸、定功能的
    • 二维建筑平面
    • 直接表达三维住宅空间
  • 使用的单位是腕尺
房间功能 泥板标注 实际尺寸 三维空间特征
通用空间 未标注 7m×3m 主活动区,连接各功能间
前室/门厅 kisal(苏美尔语) 6m×4.5m 入口过渡区,面向庭院
内室/圣所 pa-pah 3m×6m 私密核心区,采光较弱
私人居住区 ki-tus 4m×6m 居住主空间,家庭活动区
暗室 e-sa 2m宽 储物/特殊用途,进深未标注
缺失部分 - - 原泥板边缘破损,功能待补
  • 突破纯经验手绘
    • 比例+平面轮廓实现二维对三维建筑的精准还原
    • 是工程制图的起源性突破

古埃及

  • 公元前3000年—前300年
    • 图纸更详细

图片描述

  • 不但有俯视图

图片描述

  • 还有剖面图

古希腊

  • 欧几里得
    • 《几何原本》
    • Elements

图片描述

  • Euclidean Geometry
    • 欧几里得 几何学

图片描述

  • Geometry 这个词怎么来的?

Geometry

  • **Geometry
    • = 土地(geo)
      • 测量(metr)
      • 学科后缀(ia)**
构词部分 拼写/形式 核心含义 词源背景(大白话)
前缀 geo- 土地、大地、地球 几何最早起源于古埃及:尼罗河每年发洪水冲毁农田边界,人们需要重新丈量土地,这就是几何的最初来源
词根 -metr- 测量、度量、量尺寸 希腊语里这个词根专门表示“量东西、测大小”,是所有“计量类”词汇的核心
后缀 -ia 表示**……学科、……技艺** 希腊语常用的名词后缀,拼在一起就是“丈量土地的学问”,也就是几何
  • 本质就是古代的土地测量术
    • 后来发展成研究形状、空间、位置的现代几何学

geo-

单词 含义 与你的研究关联
Geodesy 大地测量学 研究地球形状、大小、重力场的学科 几何的本源学科,文艺复兴建筑的尺寸、比例测量基础
Geodesic 大地测量的;短程线的 Geodesic dome(薄壳穹顶) 现代建筑穹顶结构,与布鲁内莱斯基、米开朗基罗的穹顶设计一脉相承
Geography 地理学 研究地球表面的学科 与几何同源,均源于“大地测量”
Geocentric 地心的 天体几何研究 早期几何在天文建筑中的应用
  • 大地母亲 盖亚

图片描述

-metr- / -meter

单词 含义 与你的研究关联
Metric 度量的;公制的 度量标准、几何度量单位 工程制图的尺寸标注、几何量计算核心
Symmetry 对称性 物体的对称性质 文艺复兴建筑(圣彼得大教堂、佛罗伦萨穹顶)的核心设计原则
Thermometer 温度计 测量温度的工具 计量工具类词根延伸
Dynamometer 测力计 测量力的仪器 工程力学中几何量与力的结合应用
  • 测量

图片描述

  • 演化为单位 米

欧式几何

  • 5条公设+5条公理
类别 数量 核心内容
5条公设(几何专属规则) 1 随便两个点,都能连出一条直线
2 一条直线能无限往两头延长
3 随便一个点当圆心、随便一段距离当半径,都能画一个圆
4 所有直角都一样大,都是90°
5 平行公设:过直线外一点,只能画一条和它平行的直线(线性透视、建筑平行墙体的核心)
5条公理(通用数学规则) 1 跟同一个量相等的量,互相相等
2 相等的量加相等的量,还是相等
3 相等的量减相等的量,还是相等
4 能完全重合的图形,大小形状都一样
5 整体肯定比它的任何一部分都大

毕达哥拉斯

  • 勾股定理

图片描述

  • 整体设计

古罗马

  • 维特鲁威《建筑十书》(公元前27年)

图片描述

  • 圆形更细腻
    • π ≈ 22/7 ≈ 3.142857

图片描述

比例更细

  • 以人为核心

图片描述

  • 后来 文艺复兴
    • 达芬奇 进行 致敬

图片描述

  • 达芬奇 不只是画家

达·芬奇

  • 1452—1519
    • 李奥纳多 达芬奇

图片描述

  • 擅长各种机械
    • 幻想永动机

图片描述

永动机

图片描述

  • 设计图纸

教堂

  • 作为 设计师
    • 设计 大教堂的穹顶

图片描述

  • 图纸

图片描述

  • 要说建筑方面
    • 还有个更厉害的石匠

米开朗基罗·博纳罗蒂

  • 文艺复兴建筑工程制图
    • 大教堂草图

图片描述

  • 防御工事

图片描述

大穹顶

  • 圣彼得大教堂穹顶

图片描述

  • 穹顶跨度42米

图片描述

  • 草图的比例与实际建筑误差小于2%

几何的发展历程

阶段 地域/时间 核心事件
起源 古埃及 尼罗河泛滥后重划土地,诞生实用测量技术,这是几何的雏形
体系化 古希腊 泰勒斯、毕达哥拉斯整理零散知识;欧几里得写《几何原本》,把几何变成严谨的公理体系
定名传播 古罗马 希腊语geōmetría演变为拉丁语geometria,名称定型
辗转传承 中世纪至近代 先传阿拉伯世界被保存,后欧洲复兴,重新成为主流数学
中国落地 中国·1607年 徐光启+利玛窦译《几何原本》,正式定名**“几何”**,沿用至今
  • 我们中国怎么造房子呢?

营造法式

  • 中国 崇尚木质结构

    • 工匠的祖师 是 木匠鲁班
  • 1103 年

    • 北宋崇宁二年
    • 李诫重 《营造法式》
    • 大木作

图片描述

  • 重檐歇山殿

斗拱

  • 但是已经有了模块化思维
  • 斗拱

图片描述

  • 这都是在用二维平面
    • 描述三维世界

图片描述

  • 我们尝试做个四梁八柱的屋子

抬梁式建筑

  • 先搭建八柱、四梁
    • 然后瓜柱、二道梁
    • 然后 瓜柱
    • 放上栋
    • 再后檩

图片描述

import bpy
import math

if bpy.context.active_object and bpy.context.active_object.mode != 'OBJECT':
    bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

# 建筑宽度
BUILDING_WIDTH = 6
# 建筑深度
BUILDING_DEPTH = 4
# 柱子半径
PILLAR_RADIUS = 0.25
# 柱子高度
PILLAR_HEIGHT = 3
# 梁半径
BEAM_RADIUS = 0.175
# 梁长度
BEAM_LENGTH = 4
# 小柱半径
SMALL_PILLAR_RADIUS = 0.15
# 小柱高度
SMALL_PILLAR_HEIGHT = 0.4
# 脊半径
RIDGE_RADIUS = 0.2
# 脊长度
RIDGE_LENGTH = 1.5
# 桁半径
HENGD_RADIUS = 0.18

def create_material(name, color):
    mat = bpy.data.materials.new(name=name)
    mat.use_nodes = True
    nodes = mat.node_tree.nodes
    bsdf = nodes.get("Principled BSDF")
    bsdf.inputs["Base Color"].default_value = color
    return mat

red_material = create_material("RedMaterial", (0.8, 0.2, 0.2, 1.0))
green_material = create_material("GreenMaterial", (0.2, 0.8, 0.2, 1.0))
blue_material = create_material("BlueMaterial", (0.2, 0.2, 0.8, 1.0))

def create_cylinders_from_data(cylinders_data, material):
    cylinders = []
    for i, data in enumerate(cylinders_data):
        location = data[0]
        rotation = data[1]
        scale = data[2]
        radius = data[3]
        depth = data[4]
        name = data[5]
        
        bpy.ops.mesh.primitive_cylinder_add(radius=radius, depth=depth, location=location)
        cylinder = bpy.context.active_object
        cylinder.rotation_euler = rotation
        cylinder.scale = scale
        cylinder.name = name
        cylinder.data.materials.append(material)
        cylinders.append(cylinder)
    
    return cylinders

gold_pillars_data = [
    [(-BEAM_LENGTH, BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_1"],
    [(0, BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_2"],
    [(-BEAM_LENGTH, -BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_3"],
    [(0, -BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_4"],
    [(BEAM_LENGTH, BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_5"],
    [(2*BEAM_LENGTH, BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_6"],
    [(BEAM_LENGTH, -BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_7"],
    [(2*BEAM_LENGTH, -BEAM_LENGTH/2, PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), PILLAR_RADIUS, PILLAR_HEIGHT, "GoldPillar_8"],
]

first_beams_data = [
    [(-BEAM_LENGTH, 0, PILLAR_HEIGHT), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH, "FirstBeam_1-3"],
    [(0, 0, PILLAR_HEIGHT), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH, "FirstBeam_2-4"],
    [(BEAM_LENGTH, 0, PILLAR_HEIGHT), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH, "FirstBeam_5-7"],
    [(2*BEAM_LENGTH, 0, PILLAR_HEIGHT), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH, "FirstBeam_6-8"],
]

first_beam_pillars_data = [
    [(-BEAM_LENGTH, BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_1-3_1"],
    [(-BEAM_LENGTH, -BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_1-3_2"],
    [(0, BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_2-4_1"],
    [(0, -BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_2-4_2"],
    [(BEAM_LENGTH, BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_5-7_1"],
    [(BEAM_LENGTH, -BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_5-7_2"],
    [(2*BEAM_LENGTH, BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_6-8_1"],
    [(2*BEAM_LENGTH, -BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "FirstBeamPillar_6-8_2"],
]

second_beams_data = [
    [(-BEAM_LENGTH, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH/2, "SecondBeam_1-3_2"],
    [(0, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH/2, "SecondBeam_2-4_2"],
    [(BEAM_LENGTH, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH/2, "SecondBeam_5-7_2"],
    [(2*BEAM_LENGTH, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS), (math.radians(90), 0, 0), (1, 1, 1), BEAM_RADIUS, BEAM_LENGTH/2, "SecondBeam_6-8_2"],
]

second_beam_pillars_data = [
    [(-BEAM_LENGTH, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "SecondBeamPillar_1-3_2"],
    [(0, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "SecondBeamPillar_2-4_2"],
    [(BEAM_LENGTH, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "SecondBeamPillar_5-7_2"],
    [(2*BEAM_LENGTH, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS + BEAM_RADIUS + SMALL_PILLAR_HEIGHT/2), (0, 0, 0), (1, 1, 1), SMALL_PILLAR_RADIUS, SMALL_PILLAR_HEIGHT, "SecondBeamPillar_6-8_2"],
]

hengd_data = [
    [(0.5*BEAM_LENGTH, BEAM_LENGTH/2, PILLAR_HEIGHT), (0, math.radians(90), 0), (1, 1, 1), HENGD_RADIUS, 3*BEAM_LENGTH, "Hengd_1"],
    [(0.5*BEAM_LENGTH, -BEAM_LENGTH/2, PILLAR_HEIGHT), (0, math.radians(90), 0), (1, 1, 1), HENGD_RADIUS, 3*BEAM_LENGTH, "Hengd_2"],
    [(0.5*BEAM_LENGTH, BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS), (0, math.radians(90), 0), (1, 1, 1), HENGD_RADIUS, 3*BEAM_LENGTH, "Hengd_3"],
    [(0.5*BEAM_LENGTH, -BEAM_LENGTH/4, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS), (0, math.radians(90), 0), (1, 1, 1), HENGD_RADIUS, 3*BEAM_LENGTH, "Hengd_4"],
]

ridge_data = [
    [(0.5*BEAM_LENGTH, 0, PILLAR_HEIGHT + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS + BEAM_RADIUS + SMALL_PILLAR_HEIGHT + BEAM_RADIUS), (0, math.radians(90), 0), (1, 1, 1), RIDGE_RADIUS, 3*BEAM_LENGTH, "Ridge"],
]

print("开始创建抬梁结构...")

create_cylinders_from_data(gold_pillars_data, red_material)
print("✓ 八根金柱创建完成(红色材质)")

create_cylinders_from_data(first_beams_data, green_material)
print("✓ 一道横梁创建完成(绿色材质)")

create_cylinders_from_data(first_beam_pillars_data, red_material)
print("✓ 瓜柱创建完成(红色材质)")

create_cylinders_from_data(second_beams_data, green_material)
print("✓ 二道梁创建完成(绿色材质)")

create_cylinders_from_data(second_beam_pillars_data, red_material)
print("✓ 二道梁上瓜柱创建完成(红色材质)")

create_cylinders_from_data(hengd_data, blue_material)
print("✓ 桁创建完成(蓝色材质)")

create_cylinders_from_data(ridge_data, blue_material)
print("✓ 栋创建完成(蓝色材质)")

print("🎉 抬梁结构创建完成!")

总结 🤔

  • 这次研究了建筑图纸的历史
    • 了解了 几何的演化过程
术语 英文全称 核心定义 与你的研究关联
欧几里得几何 Euclidean Geometry 以5条公设/公理为基础,研究平直空间的几何体系 文艺复兴建筑、米开朗基罗手稿、线性透视的底层理论根基
解析几何 Analytic Geometry 用坐标系、代数方程研究几何的学科 现代CAD底层运算、建筑结构力学的几何量化工具
画法几何 Descriptive Geometry 用二维投影表达三维形体的工程几何学科 建筑工程制图、CAD图纸的核心理论,蒙日系统化的应用学科
平面几何 Plane Geometry 研究平面图形(点、线、圆、多边形)的几何 建筑草图、透视基础的入门内容
立体几何 Solid Geometry 研究三维形体(柱、锥、球、穹顶)的几何 米开朗基罗圣彼得大教堂穹顶、防御工事的三维设计基础
综合几何 Synthetic Geometry 纯几何推理、尺规作图的几何体系 文艺复兴建筑师的手工绘图、手稿创作方式
  • 解析几何 是 怎么来的?

图片描述

  • 我们下次再说!👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。