Sharding-JDBC(二)- Sharding-JDBC介绍

article/2025/9/13 1:36:29

文章目录

  • 一、Sharding-JDBC介绍
    • 1. Sharding-JDBC介绍
    • 2. Sharding-JDBC与JDBC性能对比
  • 二、Sharding-JDBC快速入门
    • 1. 需求说明
    • 2. 环境搭建
      • 2.1 环境说明
      • 2.2 创建数据库
      • 2.3 引入maven依赖
    • 3. 编写程序
      • 3.1 分片规则配置
      • 3.2.数据操作
      • 3.3.测试
    • 4. 流程分析
    • 5. 其他集成方式
      • 5.1 Spring Boot properties配置
      • 5.2 Spring Boot Yaml 配置
      • 5.3 Java 配置
      • 5.4 Spring命名空间配置

一、Sharding-JDBC介绍

1. Sharding-JDBC介绍

Sharding-JDBC是当当网研发的开源分布式数据库中间件,从 3.0 开始Sharding-JDBC被包含在 Sharding-Sphere 中,之后该项目进入Apache孵化器,4.0版本之后的版本为Apache版本。

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding- Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。

官方地址:https://shardingsphere.apache.org/document/current/cn/overview/

目前只需关注Sharding-JDBC,它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

Sharding-JDBC的核心功能为数据分片读写分离,通过Sharding-JDBC,应用可以透明的使用jdbc访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布。

  • 适用于任何基于Java的ORM框架,如: Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

在这里插入图片描述

上图展示了Sharding-Jdbc的工作方式,使用Sharding-Jdbc前需要人工对数据库进行分库分表,在应用程序中加入Sharding-Jdbc的Jar包,应用程序通过Sharding-Jdbc操作分库分表后的数据库和数据表,由于Sharding-Jdbc是对Jdbc驱动的增强,使用Sharding-Jdbc就像使用Jdbc驱动一样,在应用程序中是无需指定具体要操作的分库和分表的。

2. Sharding-JDBC与JDBC性能对比

①性能损耗测试:服务器资源充足、并发数相同,比较JDBC和Sharding-JDBC性能损耗,Sharding-JDBC相对JDBC损耗不超过7%。

在这里插入图片描述
②性能对比测试:服务器资源使用到极限,相同的场景JDBC与Sharding-JDBC的吞吐量相当。
③性能对比测试:服务器资源使用到极限,Sharding-JDBC采用分库分表后,Sharding-JDBC吞吐量较JDBC不分表有接近2倍的提升。

在这里插入图片描述

二、Sharding-JDBC快速入门

1. 需求说明

本章节使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用方法。
人工创建两张表,t_order_1和t_order_2,这两张表是订单表拆分后的表,通过Sharding-Jdbc向订单表插入数据,按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入t_order_2,通过Sharding-Jdbc查询数据,根据SQL语句的内容从t_order_1或t_order_2查询数据。

2. 环境搭建

2.1 环境说明

  • 操作系统:Win10
  • 数据库:MySQL-5.7.25
  • JDK:64位 jdk1.8.0_201
  • 应用框架:spring-boot-2.1.3.RELEASE,Mybatis3.5.0
  • Sharding-JDBC:sharding-jdbc-spring-boot-starter-4.0.0-RC1

2.2 创建数据库

创建订单库order_db

CREATE DATABASE order_db CHARACTER SET ‘utf8’ COLLATE ‘utf8_general_ci’;

在order_db中创建t_order_1、t_order_2表

DROP TABLE IF EXISTS t_order_1;
CREATE TABLE t_order_1 (
order_id bigint(20) NOT NULL COMMENT ‘订单id’,
price decimal(10, 2) NOT NULL COMMENT ‘订单价格’,
user_id bigint(20) NOT NULL COMMENT ‘下单用户id’,
status varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘订单状态’,
PRIMARY KEY (order_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

DROP TABLE IF EXISTS t_order_2;
CREATE TABLE t_order_2 (
order_id bigint(20) NOT NULL COMMENT ‘订单id’,
price decimal(10, 2) NOT NULL COMMENT ‘订单价格’,
user_id bigint(20) NOT NULL COMMENT ‘下单用户id’,
status varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘订单状态’,
PRIMARY KEY (order_id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2.3 引入maven依赖

引入 sharding-jdbc和SpringBoot整合的Jar包:

<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding‐jdbc‐spring‐boot‐starter</artifactId> <version>4.0.0RC1</version> 
</dependency>

3. 编写程序

3.1 分片规则配置

分片规则配置是sharding-jdbc进行对分库分表操作的重要依据,配置内容包括:数据源、主键生成策略、分片策略等。
在application.properties中配置:

server.port=56081#工程名
spring.application.name = sharding-jdbc-simple-demo#访问路径
server.servlet.context-path = /sharding-jdbc-simple-demo
spring.http.encoding.enabled = true
spring.http.encoding.charset = UTF-8
spring.http.encoding.force = true#覆盖重复的bean定义
spring.main.allow-bean-definition-overriding = true#mybatis驼峰命名
mybatis.configuration.map-underscore-to-camel-case = true#sharding-jdbc分片规则配置
#数据源,自定义名称m1
spring.shardingsphere.datasource.names = m1spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/order_db?useUnicode=true
spring.shardingsphere.datasource.m1.username = root
spring.shardingsphere.datasource.m1.password = root# 指定t_order表的数据分布情况,配置数据节点,逻辑表t_order对应的节点是:m1.t_order_1,m1.t_order_2
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes = m1.t_order_$->{1..2}# 指定t_order表的主键生成策略为SNOWFLAKE,主键为order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE# 指定t_order表的分片策略,分片策略包括分片键和分片算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column = order_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression = t_order_$->{order_id % 2 + 1}# 打开sql输出日志
spring.shardingsphere.props.sql.show = trueswagger.enable = truelogging.level.root = info
logging.level.org.springframework.web = info
logging.level.com.itheima.dbsharding  = debug
logging.level.druid.sql = debug

1.首先定义数据源m1,并对m1进行实际的参数配置。
2.指定t_order表的数据分布情况,分布在m1.t_order_1,m1.t_order_2
3.指定t_order表的主键生成策略为SNOWFLAKE,SNOWFLAKE是一种分布式自增算法,保证id全局唯一
4.定义t_order分片策略,order_id为偶数的数据落在t_order_1,为奇数的落在t_order_2,分表策略的表达式为 t_order_$->{order_id % 2 + 1}

3.2.数据操作

@Mapper
@Component
public interface OrderDao {/*** 插入订单*/@Insert("insert into t_order(price,user_id,status)values(#{price},#{userId},#{status})")int insertOrder(@Param("price")BigDecimal price,@Param("userId")Long userId,@Param("status")String status);/*** 根据id列表查询订单*/@Select("<script>" +"select" +" * " +" from t_order t " +" where t.order_id in " +" <foreach collection='orderIds' open='(' separator=',' close=')' item='id'>" +" #{id} " +" </foreach>" +"</script>")List<Map> selectOrderbyIds(@Param("orderIds") List<Long> orderIds);
}

3.3.测试

①编写单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ShardingJdbcSimpleBootstrap.class})
public class OrderDaoTest {@AutowiredOrderDao orderDao;@Testpublic void testInsertOrder() {for (int i = 1; i < 20; i++) {orderDao.insertOrder(new BigDecimal(i), 1L, "SUCCESS");}}@Testpublic void testSelectOrderbyIds() {List<Long> ids = new ArrayList<>();ids.add(373897739357913088L);ids.add(373897037306920961L);List<Map> maps = orderDao.selectOrderbyIds(ids);System.out.println(maps);}
}

②执行testInsertOrder:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过日志可以发现order_id为奇数的被插入到t_order_2表,为偶数的被插入到t_order_1表,达到预期目标。

③执行testSelectOrderbyIds:

在这里插入图片描述

通过日志可以发现,根据传入order_id的奇偶不同,sharding-jdbc分别去不同的表检索数据,达到预期目标。

4. 流程分析

通过日志分析,Sharding-JDBC在拿到用户要执行的sql之后干了哪些事儿:
(1)解析sql,获取分片键值,在本例中是order_id
(2)Sharding-JDBC通过规则配置 t_order_$->{order_id % 2 + 1},知道了当order_id为偶数时,应该往 t_order_1表插数据,为奇数时,往t_order_2插数据。
(3)于是Sharding-JDBC根据order_id的值改写sql语句,改写后的SQL语句是真实所要执行的SQL语句。
(4)执行改写后的真实sql语句
(5)将所有真正执行sql的结果进行汇总合并,返回。

5. 其他集成方式

Sharding-JDBC不仅可以与spring boot良好集成,它还支持其他配置方式,共支持以下四种集成方式。

5.1 Spring Boot properties配置

#sharding-jdbc分片规则配置
#数据源,自定义名称m1
spring.shardingsphere.datasource.names = m1spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/order_db?useUnicode=true
spring.shardingsphere.datasource.m1.username = root
spring.shardingsphere.datasource.m1.password = root# 指定t_order表的数据分布情况,配置数据节点,逻辑表t_order对应的节点是:m1.t_order_1,m1.t_order_2
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes = m1.t_order_$->{1..2}# 指定t_order表的主键生成策略为SNOWFLAKE,主键为order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE# 指定t_order表的分片策略,分片策略包括分片键和分片算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column = order_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression = t_order_$->{order_id % 2 + 1}

5.2 Spring Boot Yaml 配置

定义application.yml,内容如下:

server:port: 56081servlet:context-path: /sharding-jdbc-simple-demo
spring:application:name: sharding-jdbc-simple-demohttp:encoding:enabled: truecharset: utf-8force: truemain:allow-bean-definition-overriding: trueshardingsphere:datasource:names: m1m1:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/order_db?useUnicode=trueusername: rootpassword: rootsharding:tables:t_order:actualDataNodes: m1.t_order_$->{1..2}tableStrategy:inline:shardingColumn: order_idalgorithmExpression: t_order_$->{order_id % 2 + 1}keyGenerator:type: SNOWFLAKEcolumn: order_idprops:sql:show: true
mybatis:configuration:map-underscore-to-camel-case: true
swagger:enable: true
logging:level:root: infoorg.springframework.web: infocom.itheima.dbsharding: debugdruid.sql: debug

5.3 Java 配置

添加配置类:

@Configuration
public class ShardingJdbcConfig {// 配置分片规则// 定义数据源Map<String, DataSource> createDataSourceMap() {DruidDataSource dataSource1 = new DruidDataSource();dataSource1.setDriverClassName("com.mysql.jdbc.Driver");dataSource1.setUrl("jdbc:mysql://localhost:3306/order_db?useUnicode=true");dataSource1.setUsername("root");dataSource1.setPassword("root");Map<String, DataSource> result = new HashMap<>();result.put("m1", dataSource1);return result;}// 定义主键生成策略private static KeyGeneratorConfiguration getKeyGeneratorConfiguration() {KeyGeneratorConfiguration result = new KeyGeneratorConfiguration("SNOWFLAKE","order_id");return result;}// 定义t_order表的分片策略TableRuleConfiguration getOrderTableRuleConfiguration() {TableRuleConfiguration result = new TableRuleConfiguration("t_order","m1.t_order_$->{1..2}");result.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 2 + 1}"));result.setKeyGeneratorConfig(getKeyGeneratorConfiguration());return result;}// 定义sharding-Jdbc数据源@BeanDataSource getShardingDataSource() throws SQLException {ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration());//spring.shardingsphere.props.sql.show = trueProperties properties = new Properties();properties.put("sql.show","true");return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig,properties);}}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:
Sharding-Jdbc与SpringBoot集成,会自动从配置文件中读“spring.shardingsphere”前缀的配置
由于使用java配置类方式,没有配置文件,读取不到就会报以上错误
此时需要在启动类中加上@SpringBootApplication(exclude = SpringBootConfiguration.class)

import org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(exclude = SpringBootConfiguration.class)
public class ShardingJdbcSimpleBootstrap {public static void main(String[] args) {SpringApplication.run(ShardingJdbcSimpleBootstrap.class, args);}}

5.4 Spring命名空间配置

此方式使用xml方式配置,不推荐使用。

<?xml version="1.0" encoding="UTF‐8"?>
<?xml version="1.0" encoding="UTF‐8"?>xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" 、xmlns:tx="http://www.springframework.org/schema/tx" xmlns:sharding="http://shardingsphere.apache.org/schema/shardingsphere/sharding"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring‐beans.xsd http://shardingsphere.apache.org/schema/shardingsphere/shardinghttp://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring‐context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring‐tx.xsd"><context:annotation‐config /><!‐‐定义多个数据源‐‐> 
<bean id="m1" class="com.alibaba.druid.pool.DruidDataSource" destroy‐method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/order_db_1?useUnicode=true" /> <property name="username" value="root" /> <property name="password" value="root" /> 
</bean><!‐‐定义分库策略‐‐> 
<sharding:inline‐strategy id="tableShardingStrategy" sharding‐column="order_id" algorithm‐ expression="t_order_$‐>{order_id % 2 + 1}" /> <!‐‐定义主键生成策略‐‐> 
<sharding:key‐generator id="orderKeyGenerator" type="SNOWFLAKE" column="order_id" /> <!‐‐定义sharding‐Jdbc数据源‐‐> 
<sharding:data‐source id="shardingDataSource"> <sharding:sharding‐rule data‐source‐names="m1"> <sharding:table‐rules> <sharding:table‐rule logic‐table="t_order" table‐strategy‐ ref="tableShardingStrategy" key‐generator‐ref="orderKeyGenerator" /> </sharding:table‐rules> </sharding:sharding‐rule> 
</sharding:data‐source> </beans>

http://chatgpt.dhexx.cn/article/d7hMhYs1.shtml

相关文章

2022年适合初学者的Python书籍推荐

一、前言 网上有很多Python书或者视频&#xff0c;种类繁多该怎么选择&#xff1f; 看书全是文字看就了眼睛累&#xff0c;也容易厌倦&#xff0c;看视频有时候又觉得讲的慢&#xff0c;有其他方案吗&#xff1f; 其实&#xff0c;关于自学python&#xff0c;找一本浅显易懂&…

师傅带徒弟学:Python游戏开发引擎cocos2d-python-关东升-专题视频课程

师傅带徒弟学&#xff1a;Python游戏开发引擎cocos2d-python—299人已学习 课程介绍 Python语言之所以受欢迎&#xff0c;很大的原因是有很多可以使用的库&#xff0c;Python社区也有很多游戏开发库&#xff0c;其中较为优秀有&#xff1a;Cocos2d、Pyglet和Pygame&#xf…

关东升的《从零开始学Swift》即将出版

大家好&#xff1a; 苹果2015WWDC大会发布了Swift2.0&#xff0c;它较之前的版本Swift1.x有很大的变化&#xff0c;所以我即将出版《从零开始学Swift》《从零开始学Swift》将在《Swift开发指南》第1版的基础上添加Swift2.0的内容&#xff0c;同时摒弃第1版的一些不合理的内容&a…

最新出炉!《看漫画学Python 2》电子版火爆来袭,300页全新版PDF开放下载,零基础小白入门首选!

很多刚开始接触Python的朋友都会有一个共同的烦恼&#xff0c;自学好无聊&#xff0c;好枯燥&#xff0c;不想坚持了……所以秉持着让学Python好玩有趣的态度&#xff0c;给大家推荐一本最新出炉的“漫画书”《看漫画学Python 2》&#xff01; 图书简介&#xff1a;Python是一门…

关东升的《iOS实战:图形图像、动画和多媒体卷(Swift版)》上市了

关东升的《iOS实战&#xff1a;图形图像、动画和多媒体卷&#xff08;Swift版&#xff09;》上市了 承蒙广大读者的厚爱我的《iOS实战&#xff1a;图形图像、动画和多媒体卷&#xff08;Swift版&#xff09;》京东上市了&#xff0c;欢迎广大读者提出宝贵意见。。http://item.j…

关东升 IOS

51CTO博客大赛我的参赛主页http://blog.51cto.com/contest2013/701759期待您的一票&#xff01; 同时有好礼相送&#xff0c;欢迎学习iOS的小伙伴观看我的iOS入门免费系列课程如下&#xff1a; Objective C编程基础 &#xff08;24课时&#xff09; 只要4金币 iOS开发基础入门 …

Shell Date命令

shell Date命令 1、Date命令 date %Y 以四位数字格式打印年份 date %y 以二位数字格式打印年份 date %m 月份 date %d 日期 date %H 小时 date %M 分钟 date %S 秒 date %w 星期&#xff0c;如果结果显示0&#xff0c;则表示周日前一天的日期 date -d "-1 day" %d前…

Linux命令date命令

A.将日期转换为Unix时间戳 将当前时间以Unix时间戳表示&#xff1a; date %s 转换指定日期为Unix时间戳&#xff1a; date -d 2018-05-25 18:20 %s B.将Unix时间戳转换为日期时间 不指定日期时间的格式&#xff1a; date -d 1361542596 指定日期格式的转换&#xff1a; …

linux date输出时分秒,linux的date命令

date命令 在linux里面shell脚本打印时间。 date语法 date (选项)(参数)(date后面必须加空格)。 选项有下面几种 -d"字符串"&#xff1a;显示字符串所指定的时间&#xff1b; -s"字符串"&#xff1a;根据字符串设置时间&#xff1b; -u:显示GMT&#xff1b;…

Linux date命令

date命令是Linux中常用的一个命令&#xff0c;主要作用就是显示本机当前时间。如下&#xff1a; 在本人Linux操作系统中&#xff0c;date命令默认实现格式为年月日-星期-时分秒&#xff0c;然后是CST中央标准时间。不过&#xff0c;你也可以自行修改显示格式&#xff0c;如&…

Bash中的Date命令

Date命令可以用于显示时间和修改系统时间 这个就是查看当前时间 Date有很多时间代表符&#xff0c;而且各个代表符之间可以自定义多种符号 Linux有两个时钟&#xff0c;硬件时钟和系统时钟 clock是硬件时钟&#xff0c;而且clock只有root可以操作 clock与date之间可能会有差异&…

Linux命令之date命令详细讲解

一、date命令简介   Linux date命令可以用来显示或设定系统的日期与时间。在显示方面使用者可以设定欲显示的格式&#xff0c;格式设定为一个加号后接数个标记。在备份文件的时候我们常结合此命令生成当前日期和时间的文件名。格式符前面以加号开头&#xff0c;若是不以加号作…

Linux命令之date命令

一、date命令简介 Linux date命令可以用来显示或设定系统的日期与时间。在显示方面使用者可以设定欲显示的格式&#xff0c;格式设定为一个加号后接数个标记。在备份文件的时候我们常结合此命令生成当前日期和时间的文件名。格式符前面以加号开头&#xff0c;若是不以加号作为开…

turtle科赫雪花的源码分析

python turtle&#xff0c;科赫雪花源码 #KochDrawV1.py #导入海龟画图的基本库 import turtle #koch函数是是对科赫函数的基本绘制 def koch(size,n):if n 0:turtle.fd(size)else:for angle in [0,60,-120,60]:turtle.left(angle)koch(size/3, n-1) #main函数是对科赫函数的…

python科赫雪花小包裹_034 实例8-科赫雪花小包裹-Go语言中文社区

一、"科赫雪花小包裹"问题分析 1.1 科赫雪花 高大上的分形几何 分形几何是一种迭代的几何图形&#xff0c;广泛存在于自然界中 科赫曲线&#xff0c;也叫雪花曲线 1.2 用Python绘制科赫曲线 二、"科赫雪花小包裹"实例讲解(上) 2.1 科赫曲线的绘制 递归思想…

python科赫曲线编程实现雪花下落的效果_Python笔记 :科赫雪花曲线(计算思维训练1)...

提要&#xff1a;基于MOOC的“Python语言程序设计基础”&#xff0c;主讲人&#xff1a;嵩天。基本算是课本笔记。 科赫雪花曲线设计思路 一、三种人类思维特征 逻辑思维&#xff1a;推理和演绎&#xff0c;数学为代表&#xff1b; 实证思维&#xff1a;实验和验证&#xff0c;…

科赫雪花——python画图

1.什么是科赫雪花 科赫曲线是一种分形。其形态似雪花&#xff0c;又称科赫雪花、雪花曲线。 科赫曲线是出现在海里格冯科赫的论文中&#xff0c;是分形曲线中的一种。 科赫雪花是以等边三角形三边生成的科赫曲线组成的。每条科赫曲线的长度是无限大&#xff0c;它是连续而无…

科赫雪花分形的C语言实现!

科赫雪花分形的C语言实现! 4阶科赫雪花分形Windows下的代码实现&#xff1a; 4阶科赫雪花分形 链接: link. Windows下的代码实现&#xff1a; 仅贴出了窗口过程函数。 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {static int cxCl…

三阶科赫雪花PYTHON

代码 #科赫雪花 import turtle def kehe(len,n): if n 0: turtle.fd(len) else: for i in [0,60,-120,60]: turtle.left(i) kehe(len / 3, n - 1) lenth 500 level 3 du 120 def main(): turtle.penup() turtle…

python科赫雪花代码的意思_基于python绘制科赫雪花

什么是科赫曲线 科赫曲线是de Rham曲线的特例。给定线段AB&#xff0c;科赫曲线可以由以下步骤生成&#xff1a; 将线段分成三等份(AC,CD,DB) 以CD为底&#xff0c;向外(内外随意)画一个等边三角形DMC 将线段CD移去 分别对AC,CM,MD,DB重复1~3。 什么是科赫雪花 三段科赫曲线组成…