VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  畫貝塞爾曲線

奔跑的犀牛先生發表於2021-01-02

 

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

它通過控制曲線上的四個點(起始點、終止點以及兩個相互分離的中間點)來創造、編輯圖形。其中起重要作用的是位於曲線中央的控制線。這條線是虛擬的,中間與貝塞爾曲線交叉,兩端是控制端點。移動兩端的端點時貝塞爾曲線改變曲線的曲率(彎曲的程度);移動中間點(也就是移動虛擬的控制線)時,貝塞爾曲線在起始點和終止點鎖定的情況下做均勻移動。注意,貝塞爾曲線上的所有控制點、節點均可編輯。這種“智慧化”的向量線條為藝術家提供了一種理想的圖形編輯與創造的工具。


 

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個貝塞爾曲線

 

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往下

 

 

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

相關文章