VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  画贝塞尔曲线

 

1  Shapes.AddCurve SafeArrayOfPoints:=pts   贝塞尔曲线

  • https://docs.microsoft.com/zh-cn/office/vba/api/excel.shapes.addcurve
  • 由指定曲线的顶点和控制点的坐标对组成的数组。 您指定的第一个点是起始顶点, 接下来的两个点是第一段贝塞尔线段的控制点。 该曲线每增加一条线段,就要为其指定一个顶点和两个控制点。您指定的最后一个点是曲线的结束顶点。 请注意,必须指定的点数始终为 3n + 1,其中 n 为曲线的线段个数。
  • SafeArrayOfPoints:=pts 
  • 贝塞尔曲线
  • 起点,2控制点,2控制点 .....终点------好像必须是3n+1,比如4,7,10等等
  • 第2维只能是2?

 

1.1 贝塞尔曲线

https://www.zhihu.com/question/29565629

https://baike.baidu.com/item/%E8%B4%9D%E5%A1%9E%E5%B0%94%E6%9B%B2%E7%BA%BF/1091769?fr=aladdin

它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线*的控制线。这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终止点锁定的情况下做均匀移动。注意,贝塞尔曲线上的所有控制点、节点均可编辑。这种“智能化”的矢量线条为艺术家提供了一种理想的图形编辑与创造的工具。


VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  画贝塞尔曲线

 

VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  画贝塞尔曲线

Sub t5()
Dim pts(1 To 4, 1 To 2) As Single
pts(1, 1) = 10
pts(1, 2) = 50

pts(2, 1) = 200
pts(2, 2) = 120

pts(3, 1) = 150
pts(3, 2) = 210

pts(4, 1) = 310
pts(4, 2) = 220

Worksheets("sheet4").Shapes.AddCurve SafeArrayOfPoints:=pts

End Sub

 

1.2 第2个贝塞尔曲线

VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  画贝塞尔曲线

 

Sub t6()
Dim pts(1 To 10, 1 To 2) As Single
pts(1, 1) = 10         '

pts(1, 2) = 50         '这种分类是错误的
pts(2, 1) = 200

pts(2, 2) = 120
pts(3, 1) = 150

pts(3, 2) = 210
pts(4, 1) = 310

pts(4, 2) = 220
pts(5, 1) = 110

pts(5, 2) = 280
pts(6, 1) = 190

pts(6, 2) = 220
pts(7, 1) = 150

pts(7, 2) = 210
pts(8, 1) = 310

pts(8, 2) = 220
pts(9, 1) = 110

pts(9, 2) = 280
pts(10, 1) = 190

pts(10, 2) = 210


Worksheets("sheet5").Shapes.AddCurve SafeArrayOfPoints:=pts

End Sub

 

1.3 根据这个原理,控制4个点,果然可以画出想要的这种波浪曲线

  • 起点: 和终点在同一个高度
  • 终点:X大,Y=Y起点
  • 控制点1:X前进,Y往上
  • 控制点2:X继续前进,Y往下

 

VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  画贝塞尔曲线

VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  画贝塞尔曲线

 

Sub t5()
Dim pts(1 To 4, 1 To 2) As Single
pts(1, 1) = 0           '第1个点的X坐标
pts(1, 2) = 150         '第1个点的Y坐标

pts(2, 1) = 150         '第2个点的X坐标
pts(2, 2) = 0

pts(3, 1) = 200         '第3个点的X坐标
pts(3, 2) = 300

pts(4, 1) = 400
pts(4, 2) = 150

Worksheets("sheet4").Shapes.AddCurve SafeArrayOfPoints:=pts

End Sub
上一篇:vba:改进版4按照空行分割工作表并保存为独立工作簿


下一篇:vba:根据给定单元格搜索目标值