R语言曲面拟合代码详细分析(1)

#代码参考《R语言数据可视化之美-专业图表绘制指南》例4.2.1,主要代码链接参见

#https://github.com/EasyChart/Beautiful-Visualization-with-R,

#在添加了详细的注释基础上,对一处BUG代码进行了勘误

rm(list = ls())#清空工作区,可在括号内加装变量等定向清除某个变量等
library(lattice)
library(gridExtra)
library(reshape2)
library(RColorBrewer)

colormap<-colorRampPalette(rev(brewer.pal(11,'RdYlGn')))(100)
path<-readline()#括号不写内容,默认读取下一行
D:\Program Files\RStudio\Beautiful-Visualization-with-R-master\Beautiful-Visualization-with-R-master\第4章 数据关系型图表
#设定工作目录,输出图片等需要到的目录
Mypath<- gsub("\\\\", "/",path)
setwd(Mypath)
getwd()
#--------------------------------------------------澶氶」寮忔嫙鍚?------------------------------------------
mydata <- read.csv("Surface_Data.csv", sep= ",", header=T)

#澶氶」寮忔嫙鍚坺=f(x,y)=a+bx+cy+dxx+eyy
x <- mydata$x
y <- mydata$y
z <- mydata$z
x2<-x*x
y2<-y*y
poly_z <- lm(z ~ x + y +x2+y2)
print(poly_z)

#随便建立的模型,实际中应该是自己建立合适的模型
N<-30
xmar <- seq(min(x),max(x),(max(x)-min(x))/N)#max(x)=25,min(x)=8,(max(x)-min(x))/N=0.566667
ymar <- seq(min(y),max(y),(max(y)-min(y))/N)#max(y)=36,min(x)=10,(max(x)-min(x))/N=0.566667
#该指令的意思是最大值到最小值之间等分成N份
Grid_xy<-expand.grid(list(x=xmar,y=ymar))#按x,y的等分,建立起基础网格点
Grid_xy$x2<-Grid_xy$x*Grid_xy$x
Grid_xy$y2<-Grid_xy$y*Grid_xy$y#基础网格点坐标再平方
Grid_z <- predict.lm(poly_z, newdata=Grid_xy)#利用已经建立的模型,输出其他点的预测值  


df<-data.frame(matrix(Grid_z, length(xmar), length(ymar)))#length(xmar)=length(ymar)=N+1
#将预测值与(N+1)*(N+1)的方阵相互联系,组成三维矩阵;其x,y为1:N+1以1为单位递增的数列
colnames(df)<-xmar#通过改变列名称的方法让矩阵的x重定义到xmar数列上
df$x<-ymar#通赋值的方法让矩阵增加一列x,其值为ymar
melt_df<-melt(df,id.vars='x', variable.name ="y",value.name = "z")#把三维矩阵的三个维度信息用x,y,z表示,并整理为三列
#df为31*32=992个数据,如果刨除x列,则有961个(三维,其行列信息也是)数据;melt_df有961*3个数据,
#显然是把每个数据对应的行列信息都拓展出来了
melt_df$y<-as.numeric(melt_df$y)#这里melt_df$y从因子变量变为数值变量,但重新失去了原有ymar数列信息
#trellis.par.set("axis.line",list(col=NA,lty=1,lwd=1)) # Removes the border of the plot if you want
melt_df$y<-(melt_df$y-1)*(max(x)-min(x))/N+min(x)#勘误,这样才保留原始的y轴信息
surface_plot1 <- wireframe(z ~ y*x, data=melt_df, 
                           xlab = "as.numeric转换后校正", 
                           ylab = "as.numeric转换后校正",
                           zlab="Power (KW)",
                           zlim=c(20,180),
                           drape = TRUE,
                           colorkey = TRUE,
                           scales = list(arrows=FALSE),
                           light.source = c(10,0,10),
                           col.regions = colorRampPalette(rev(brewer.pal(11,'RdYlGn')))(100),
                           screen = list(z = -60, x = -60)
)
surface_plot1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NURBS (Non-Uniform Rational B-Spline) 曲面拟合是一种在3D计算机图形和建模中常用的数学工具。它的主要目的是通过控制点和权重来定义和调整复杂曲面的形状。 NURBS曲面拟合代码实现主要包括以下步骤: 1. 定义控制点:首先需要指定曲面上的控制点。这些点会影响最终曲面的形状。一般来说,会创建一个以二维或三维坐标表示的点集。 2. 设置权重:每个控制点都有一个与之关联的权重值。权重可以调整控制点对曲面形状的影响程度。这些权重值通常在代码中以权重矩阵的形式存储。 3. 确定节点向量:节点向量是一个排序的非减序列,用于控制曲线或曲面在参数空间内的形状。节点向量的长度应该等于控制点数量加上曲度(degree)。 4. 计算曲面:通过基函数,权重和控制点来计算NURBS曲面的点坐标。基函数是一组用来计算曲线上点坐标的函数。通常使用递归算法来计算这些基函数。 5. 插值:通常需要对控制点进行插值来得到更加平滑的曲面。这一步骤通过调整控制点的位置和权重来实现。 6. 评估曲面:在进行实际应用时,需要用参数来评估曲面上的点。这可以通过对给定参数的曲面方程进行求值来实现。 NURBS曲面拟合代码实现可以使用各种编程语言,如C++、Python或MATLAB等。这些语言提供了数学运算和矩阵计算的库函数,可以方便地实现NURBS算法。一般来说,需要根据具体的需求来对NURBS算法进行调整和扩展,以适应不同的应用场景。 ### 回答2: NURBS(非均匀有理B样条曲线和曲面)是一种常用的曲线和曲面拟合方法。NURBS曲面拟合代码实现主要包括以下步骤: 1. 定义控制点:首先需要定义一系列控制点,这些点将用于确定曲面的形状。控制点的数量及位置决定了曲面的复杂程度。 2. 定义权重:与B样条曲线相似,NURBS曲面对控制点的权重进行定义。这些权重表示了每个控制点对曲面形状的影响程度。 3. 定义节点矢量:节点矢量决定了曲面在参数空间中的形状。通常,节点值应满足非降序排列且边界节点出现多次,以确保曲面通过控制点。 4. 进行参数化:对于给定的参数值,通过计算参数值对应的Basis函数值和控制点的加权求和,可以获得曲面上的坐标点。 5. 曲面生成:根据控制点的位置和权重,以及参数化过程中得到的坐标点,可以生成NURBS曲面。一般情况下,利用三维绘图软件或计算机图形学库来实现曲面生成。 需要注意的是,NURBS曲面拟合代码实现较为复杂,需要掌握线性代数、参数化理论等相关知识。同时,对于曲面的复杂度和精度要求,需要针对具体的应用场景进行调整和优化。 ### 回答3: NURBS(Non-Uniform Rational B-Spline)曲面拟合是一种3D图形处理技术,用于生成平滑的曲面模型。NURBS曲面由多个控制点和权重构成,通过调整这些控制点的位置和权重,可以实现曲面的拟合。 对于NURBS曲面拟合,可以使用以下步骤来编写代码: 1. 首先,定义一组控制点和权重。控制点是3D空间中的点,用于控制曲面的形状。权重是每个控制点的重要性。控制点和权重可以存储在数组中。 2. 确定曲面的度数。度数表示曲面在每个参数方向上的阶数。通常,度数为3或4是常见的选择。 3. 定义曲面的结构。曲面是通过将参数空间划分为矩形或三角形的网格来创建的。可以使用网格索引来引用控制点和权重。 4. 使用NURBS曲线插值算法,计算曲面上的每个点的坐标。该算法考虑了参数空间中的控制点和权重,以及曲面度数和结构。 5. 绘制或导出拟合后的NURBS曲面。可以使用计算得到的曲面坐标来显示曲面,或将其导出为文件格式,以供其他软件使用。 编写NURBS曲面拟合代码需要理解NURBS曲面的数学原理和算法,并使用合适的数据结构和计算方法。此外,还需要考虑到参数取值范围、边界条件和误差控制等因素,以获得精确的曲面拟合结果。 以上是关于NURBS曲面拟合代码的简要解释,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值