当前位置: 首页 > news >正文

Python对头发二维建模(考虑风力、重力)

目录

一、背景

二、代码


一、背景

数值方法被用于创建电影、游戏或其他媒体中的计算机图形。例如,生成“逼真”的烟雾、水或爆炸等动画。本文内容是对头发的模拟,要求考虑重力、风力的影响。

假设:
1、人的头部是一个半径为10厘米的球体。
2、每根头发都与球体的表面垂直相交。
3、作用在每根头发上的力包括重力(在-z方向上)和恒定的风力(在+x方向上)。

二、代码

#导入python包
import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate
import scipy.optimizedef rhs_func_wrapper(f_x, f_g):'''输入:f_x风力、f_g重力输出:函数rhs_func,用于包装常微分方程'''def rhs_func(s, y):'''输入:s弧度(自变量)y即[角度θ,梯度u](因变量)'''theta = y[0]u = y[1]dyds = np.zeros_like(y)dyds[0] = u  #一阶导dyds[1] = s * f_g * np.cos(theta) + s * f_x * np.sin(theta) #二阶常微分方程,对应方程(3a)return dydsreturn rhs_funcdef shot(u0, theta_0, L, rhs_func):'''解决边界值问题(BVP)返回:s弧长、y包含角度和梯度的数组、sol是OdeSolution对象,表示常微分方程的解(描述弧长s和角度θ之间关系)'''y0 = np.array([theta_0, u0])interval = [0, L] solution = scipy.integrate.solve_ivp(rhs_func,  interval, #rhs_func中参数s的范围y0,  #初始条件max_step=1e-2, #设置步长dense_output=True)  #用于生成sol,可以用于在任意点插值解s, y, sol = solution.t, solution.y, solution.solreturn s, y, soldef shot_error_wrapper(theta_0, L, rhs_func):'''计算误差'''def shot_error(u0):s, y, sol = shot(u0, theta_0, L, rhs_func)phi = y[1, -1] #提取二维数组y中的梯度的最后一个元素,作为误差return phireturn shot_errordef coordinate_rhs_func_wrapper(theta_s):'''计算头发坐标的导数输入:theta_s表示一个描述弧长s和角度θ之间关系的OdeSolution对象'''def coordinate_rhs_func(s, y):'''输入:弧长s、y表示坐标(x,z)'''dyds = np.zeros_like(y) #初始化一个与y相同大小的数组dyds,用于存储导数theta = theta_s(s)[0]  #计算弧长s对应的角度theta,通过调用theta_s(s)获取,并取得返回值的第一个元素dyds[0] = np.cos(theta)  #求导公式dyds[1] = np.sin(theta)  #求导公式return dydsreturn coordinate_rhs_funcdef hair_bvp_2d(theta_0_list, L, R, f_x, f_g=0.1):'''输入:theta_0_list初始角度列表,L头发长度,R人头半径,f_x风力,f_g重力(默认为0.1)'''rhs_func = rhs_func_wrapper(f_x, f_g)x_list = [] #初始化两个空列表用于存储解z_list = []for theta_0 in theta_0_list:  #对于每根头发的初始角度theta_0进行以下步骤shot_error = shot_error_wrapper(theta_0, L, rhs_func)u0 = scipy.optimize.brentq(shot_error, -10, 10)  #在-10~10区间内找到误差最小的初始梯度u0s, y, sol = shot(u0, theta_0, L, rhs_func)coordinate_rhs_func = coordinate_rhs_func_wrapper(sol)y0 = np.array([R * np.cos(theta_0), R * np.sin(theta_0)])  #设置初始条件interval = [0, L]solution = scipy.integrate.solve_ivp(coordinate_rhs_func, interval, y0,max_step=1e-2)x_list.append(solution.y[0]) #402个横坐标z_list.append(solution.y[1]) #402个纵坐标x = np.array(x_list)z = np.array(z_list)return x, zdef plot_hairs(x, z, R, title):#画人头:半径为10的圆,颜色为bluetheta_list = np.linspace(0, 2 * np.pi, 50)x_head = R * np.cos(theta_list)y_head = R * np.sin(theta_list)plt.plot(x_head, y_head, c='blue')#依次画每根头发,颜色为grayfor i in range(x.shape[0]): x_coords = x[i, :]z_coords = z[i, :]plt.plot(x_coords, z_coords, c='gray')ax = plt.gca()  #获取坐标轴实例ax.set_aspect(1) #纵横单位长度比例为1:1plt.xlabel('x') #横坐标名称plt.ylabel('z') #纵坐标名称plt.title(title) #图的名称plt.show()  #打印出来if __name__ == "__main__":L = 4  #头发长度:4cmR = 10  #人的头部,半径10cmtheta_0_list = np.linspace(0, np.pi, 20)  #0-π按20等分切分print('Task 1 - no gravity')x, z = hair_bvp_2d(theta_0_list, L, R, 0, 0)assert x.shape[0] == 20 and z.shape[0] == 20 and x.shape[1] == z.shape[1]  #断言,如果不满足条件,则中断程序plot_hairs(x, z, R, title='Task 1 - no gravity') #生成图像print('Task 2 - no wind')x, z = hair_bvp_2d(theta_0_list, L, R, 0)assert x.shape[0] == 20 and z.shape[0] == 20 and x.shape[1] == z.shape[1] plot_hairs(x, z, R, title='Task 2 - no wind') print('Task 3 - wind (f_x=0.1)')x, z = hair_bvp_2d(theta_0_list, L, R, 0.1)assert x.shape[0] == 20 and z.shape[0] == 20 and x.shape[1] == z.shape[1]plot_hairs(x, z, R, title='Task 3 - wind (f_x=0.1)')

运行结果:

无重力、无风力
有重力、无风力
有重力、有风力

相关文章:

Python对头发二维建模(考虑风力、重力)

目录 一、背景 二、代码 一、背景 数值方法被用于创建电影、游戏或其他媒体中的计算机图形。例如,生成“逼真”的烟雾、水或爆炸等动画。本文内容是对头发的模拟,要求考虑重力、风力的影响。 假设: 1、人的头部是一个半径为10厘米的球体。…...

Python基础快速入门

Python基础快速入门 前置知识 Python Python是一种广泛使用的高级编程语言,以其易于学习和使用的语法而闻名。以下是Python的一些主要特点: 高级语言:Python是一种高级语言,这意味着它提供了较高层次的抽象,使编程更…...

C++的学习

代码练习 输入一个字符串&#xff0c;统计其中大写字母、小写字母、数字、空格以及其他字符的个数 #include <iostream>using namespace std;int main() {cout << "请输入一个字符串" << endl;string str;getline(cin,str);int capital 0;int l…...

工地安全反光衣穿戴监测报警摄像机

工地安全反光衣穿戴监测报警摄像机是为了提高工地施工人员的安全意识和监管效率而设计的。这种设备结合了反光衣、监测系统和报警摄像机的功能&#xff0c;可以有效减少工地事故的发生。 首先&#xff0c;工地安全反光衣是一种具有高度可见度的服装&#xff0c;能够使穿戴者在夜…...

UNIAPP微信小程序中使用Base64编解码原理分析和算法实现

为何要加上UNIAPP及微信小程序&#xff0c;可能是想让检索的翻围更广把。&#x1f607; Base64的JS原生编解码在uni的JS引擎中并不能直接使用&#xff0c;因此需要手写一个原生的Base64编解码器。正好项目中遇到此问题&#xff0c;需要通过URLLink进行小程序跳转并携带Base64参…...

人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)

1.k-means聚类 1.1.算法简介 K-Means算法又称K均值算法&#xff0c;属于聚类&#xff08;clustering&#xff09;算法的一种&#xff0c;是应用最广泛的聚类算法之一。所谓聚类&#xff0c;即根据相似性原则&#xff0c;将具有较高相似度的数据对象划分至同一类簇&#xff0c;…...

注意力、自注意力和多头注意力的区别

本文作者&#xff1a; slience_me 注意力、自注意力和多头注意力的区别 理解注意力&#xff08;Attention&#xff09;、自注意力&#xff08;Self-Attention&#xff09;和多头注意力&#xff08;Multi-Head Attention&#xff09;之间的区别非常重要&#xff0c;因为它们是自…...

FTP,SFTP,FTPS,SSL,TSL简介,区别,联系,使用场景说明

文章目录 简介FTPFTPSSFTP加密场景选择FTPS还是SFTPFTP、SFTP、FTPS区别、联系和具体使用场景如何使用FTP、SFTP和FTPSSSLTLSSSL和TLS区别和联系&#xff0c;以及使用场景SSL和TLS技术上的区别一些问题隐式的TLS&#xff08;FTPS/SSL&#xff09;或者显式的TLS&#xff08;FTPS…...

路由算法与路由协议

路由选择协议的核心是路由算法&#xff0c;即需要何种算法来获得路由表中的各个项目。 路由算法的目的很简单&#xff1a;给定一组路由器以及连接路由器的链路&#xff0c;路由算法要找到一条从源路由器到目标路由器的最佳路径。通常&#xff0c;最佳路径是指具有最低费用的路…...

dubbo接口自动化用例性能优化

前言 去年换了一个新部门&#xff0c;看了下当前的自动化用例的情况&#xff0c;发现存在三类性能问题&#xff1a; 本地调试运行时等待时间较长&#xff0c;就算是一个简单的case&#xff0c;执行时间都需要1分钟以上单用例执行时间比较长&#xff0c;部分用例执行时间超过2…...

.net core框架

ASP.NET Core 入门 跨平台开源框架 B/S 类与方法 Console 部分称为“类”。 类“拥有”方法&#xff1b;或者可以说方法存在于类中。 WriteLine() 部分称为“方法”。 想要使用方法就要知道方法在哪里 —————————— 执行流 一次执行一段 ASP.NET Core 是什么东西…...

学习大数据,所需要Java基础(9)

文章目录 网络编程实现简答客户端和服务器端的交互编写客户端编写服务端 文件上传文件上传客户端以及服务器端实现文件上传服务器端实现&#xff08;多线程&#xff09;文件上传服务器端&#xff08;连接池版本&#xff09;关闭资源工具类 BS架构服务器案例案例分析BS结构服务器…...

Python元组(Tuple)深度解析!

目录 1. 什么是元组&#xff1f; 2. 创建元组 3.访问元组 4.元组的运算 5.修改元组不可行 6.元组的应用场景 前面的博客里&#xff0c;我们详细介绍了列表&#xff08;List&#xff09;这一种数据类型&#xff0c;现在我们来讲讲与列表相似的一种数据类型&#xff0c;元组…...

排序 Comparable接口、Comparator接口

String类的Comparable接口 1、String类实现了Comparable<String>接口&#xff0c;并提供了compareTo方法的实现&#xff0c;因此&#xff0c;字符串对象&#xff08;即String类型的实例&#xff09;可以直接调用compareTo()方法来比较它们。2、String类的compareTo()方法…...

得帆助力大族激光主数据平台建设,用数据为企业生产力赋能

本期客户 大族激光科技产业集团股份有限公司&#xff08;以下简称“大族激光”&#xff09;是一家从事工业激光加工设备与自动化等配套设备及其关键器件的研发、生产、销售&#xff0c;激光、机器人及自动化技术在智能制造领域的系统解决方案的优质提供商&#xff0c;是国内激光…...

实名认证电子签署:防范合同纠纷,提升交易信任

当今社会&#xff0c;随着数字化和信息化的发展&#xff0c;电子合同已经成为商务活动中常见的签署方式。而在签署电子合同时进行实名认证&#xff0c;是为了确保合同的真实性、合法性和安全性。本文将从法律、技术和实际应用等方面详细解释为什么签署电子合同需要进行实名认证…...

c++ primer中文版第五版作业第十八章

仓库地址 文章目录 18.118.218.318.418.518.618.718.818.918.1018.1118.1218.1318.1418.1518.16位置一using声明 位置二using声明 位置一using指示 位置二using指示 18.1718.1818.1918.2018.2118.2218.2318.2418.2518.2618.2618.2818.2918.30 18.1 此时r是一个range_error类型…...

vue触发真实的点击 事件 跟用户行为一致

<template><div><button ref"myButton" click"handleClick">按钮</button></div> </template><script> export default {methods: {handleClick() {const button this.$refs.myButton;// 创建一个鼠标点击事件…...

Java进程CPU高负载排查

Java进程CPU高负载排查步骤_java进程cpu使用率高排查_YouluBank的博客-CSDN博客 【问题定位】使用arthas定位CPU高的问题_arthas cpu高_秋装什么的博客-CSDN博客 CPU飙升可能原因 CPU 上下文切换过多。 对于 CPU 来说&#xff0c;同一时刻下每个 CPU 核心只能运行-个线程&…...

Linux编程4.1 网络编程-前导

1、内容概述 网络的基本概念TCP/IP协议概述OSI和TCP/IP模型掌握TCP协议网络基础编程掌握UDP协议网络基础檹网络高级编程 2、计算机联网的目的 使用远程资源共享信息、程序和数据分布处理 3、基本概念 单服务与多客户端的进程间通信C/S client server 由于&#xff0c;跨计…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...