January 26, 2021, 11:30:28 AM

### Author Topic: [bb] Smooth bezier curves between points by Jeppe Nielsen [ 1+ years ago ]  (Read 484 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bb] Smooth bezier curves between points by Jeppe Nielsen [ 1+ years ago ]
« on: June 29, 2017, 12:28:38 AM »
Title : Smooth bezier curves between points
Author : Jeppe Nielsen
Posted : 1+ years ago

Description : Draw smooth bezier curves between points

Code :
Code: BlitzBasic
1. ;Smooth bezier curves between points
2. ;by Jeppe Nielsen 2005
3.
4. Graphics 800,600,16,2
5. SetBuffer BackBuffer()
6.
7.
8. For a#=0 To 359 Step 30
9. r=120-r
10. PointNew 400+Sin(a)*(r+60),300+Cos(a)*(r+60)
11. Next
12. ;PointNew 200,150
13. ;PointNew 300,200
14. ;PointNew 400,250
15. ;PointNew 500,100
16.
17. selectedpoint.point=Null
18.
19. show1=True
20. show2=False
21. show3=True
22.
23. smooth#=0.1
24.
25. Repeat
26.
27. Cls
28.
29. If KeyDown(78)
30.
31.         smooth#=smooth#-0.01
32.
33. ElseIf KeyDown(74)
34.
35.         smooth#=smooth#+0.01
36.
37. EndIf
38.
39. If KeyHit(2)
40.         show1=1-show1
41. EndIf
42. If KeyHit(3)
43.         show2=1-show2
44. EndIf
45. If KeyHit(4)
46.         show3=1-show3
47. EndIf
48. If KeyHit(5)
49.         showcontrol=1-showcontrol
50. EndIf
51.
52. pointhit.point=PointHit(MouseX(),MouseY())
53. If pointhit<>Null
54.
55.         If Sin(MilliSecs()*4)>0
56.                 Oval pointhitx-8,pointhity-8,16,16,0
57.         EndIf
58.
59. EndIf
60.
61.
62. Select state
63.
64.         Case 0
65.
66.
67.
68.
69.                         If MouseDown(1)
70.
71.                                 If pointhit<>Null
72.
73.                                         selectedpoint=pointhit
74.                                         If selectedpoint<>Null
75.                                                 state=1
76.                                         EndIf
77.
78.                                 Else
79.
80.                                         selectedpoint=PointNew(MouseX(),MouseY())
81.
82.                                 EndIf
83.
84.                         EndIf
85.
86.
87.         Case 1
88.                 If MouseDown(1)
89.
90.                         If selectedpoint<>Null
91.
92.
93.                                 PointMove selectedpoint,MouseX(),MouseY()
94.
95.                         EndIf
96.
97.                 Else
98.
99.                         state=0
100.
101.                 EndIf
102.
103. End Select
104.
105. If selectedpoint<>Null
106.
107.         If show1
108.                 Oval selectedpointx-6,selectedpointy-6,12,12,True
109.         EndIf
110.
111.         If KeyHit(211)
112.
113.                 PointDelete selectedpoint
114.
115.         EndIf
116.
117. EndIf
118.
119.
120. If show1
121. PointDraw point_plot
122. EndIf
123. If show2
124. PointDraw point_line
125. EndIf
126. If show3
127. PointDraw point_bezier,smooth#,showcontrol
128. EndIf
129.
130. Text GraphicsWidth()/2,1,"Smooth bezier curves between points",1
131. Text GraphicsWidth()/2,1+13*1,"Keys 1, 2, 3 toggle different curves",1
132. Text GraphicsWidth()/2,1+13*2,"Key 4 toggle control points",1
133. Text GraphicsWidth()/2,1+13*3,"+/- adjust curve smoothness : "+smooth,1
134. Text GraphicsWidth()/2,1+13*4,"Click on point to move it",1
135. Text GraphicsWidth()/2,1+13*5,"Click anywhere to add point",1
136. Text GraphicsWidth()/2,1+13*6,"Delete to delete selected point",1
137.
138.
139.
140.
141.
142. Flip
143.
144. Until KeyDown(1)
145.
146. End
147.
148.
149.
150.
151.
152. Type point
153.
154.         Field x#,y# ;coords of point
155.
156.         Field cx1#,cy1#;control point 1 for bezier interpolation
157.         Field cx2#,cy2#;control point 2 for bezier interpolation
158.
159. End Type
160.
161. Function PointNew.point(x#,y#)
162.
163.         p.point=New point
164.         px=x
165.         py=y
166.
167.         PointUpdate
168.
169.         Return p
170. End Function
171.
172. Function PointDelete(p.point)
173.
174.         Delete p
175.
176.         PointUpdate
177.
178. End Function
179.
180. Function PointUpdate()
181.
182. For p.point=Each point
183.
184.                 ;store next point
185.                 pp.point=After p
186.                 If pp=Null
187.                         pp=First point
188.                 EndIf
189.
190.                 ;vector from current point to next point
191.                 dx#=(ppx-px)
192.                 dy#=(ppy-py)
193.
194.                 ;length of vector
195.                 l#=Sqr(dx*dx+dy*dy)
196.
197.                 ;normal of vector
198.                 nx1#=dx/l
199.                 ny1#=dy/l
200.
201.                 ;store point before current point
202.                 ppp.point=Before p
203.                 If ppp=Null
204.                         ppp=Last point
205.                 EndIf
206.
207.                 ;vector
208.                 dx#=(px-pppx)
209.                 dy#=(py-pppy)
210.
211.                 ;length of vector
212.                 ll#=Sqr(dx*dx+dy*dy)
213.
214.                 nx2#=dx/ll
215.                 ny2#=dy/ll
216.
217.                 nx#=(nx1+nx2)/2.0
218.                 ny#=(ny1+ny2)/2.0
219.
220.                 ll#=Sqr(nx*nx+ny*ny)
221.                 nx=nx/ll
222.                 ny=ny/ll
223.
224.
225.                 ;place first control point
226.                 pcx1#=px+nx*l*0.33333
227.                 pcy1#=py+ny*l*0.33333
228.
229.
230.                 ppp.point=After pp
231.                 If ppp=Null
232.                         ppp=First point
233.                 EndIf
234.
235.                 ;vector
236.                 dx#=(ppx-pppx)
237.                 dy#=(ppy-pppy)
238.
239.                 ;length of vector
240.                 ll#=Sqr(dx*dx+dy*dy)
241.
242.                 nx2#=dx/ll
243.                 ny2#=dy/ll
244.
245.                 nx#=(-nx1+nx2)/2.0
246.                 ny#=(-ny1+ny2)/2.0
247.
248.                 ll#=Sqr(nx*nx+ny*ny)
249.                 nx=nx/ll
250.                 ny=ny/ll
251.
252.                 ;place first control point
253.                 pcx2#=ppx+nx*l*0.33333
254.                 pcy2#=ppy+ny*l*0.33333
255.
256.
257.
258.
259.
260. Next
261.
262. End Function
263.
264. Const point_plot=0
265. Const point_line=1
266. Const point_bezier=2
267.
268.
269. Function PointDraw(mode=point_bezier,st#=0.05,showcontrol=False)
270.
271. Select mode
272.
273.         Case point_plot;only points
274.                 For p.point=Each point
275.                         Plot px,py
276.
277.                         Oval px-4,py-4,8,8
278.                 Next
279.
280.         Case point_line;only lines
281.                 For p.point=Each point
282.
283.                         pp.point=After p
284.                         If pp=Null
285.                                 pp=First point
286.                         EndIf
287.
288.                         Line px,py,ppx,ppy
289.                 Next
290.
291.         Case point_bezier;only bezier curves
292.
293.                 For p.point=Each point
294.
295.                         pp.point=After p
296.                         If pp=Null
297.                                 pp=First point
298.                         EndIf
299.
300.                         t#=0
301.                         While t#<1.0
302.
303.                                 x1#=px*(1-t)^3+3*pcx1*(1-t)^2*t+3*pcx2*(1-t)*t*t+ppx*t^3
304.                                 y1#=py*(1-t)^3+3*pcy1*(1-t)^2*t+3*pcy2*(1-t)*t*t+ppy*t^3
305.
306.                                 tt#=t#+st#
307.                                 If tt>1
308.                                         tt=1
309.                                 EndIf
310.
311.                                 x2#=px*(1-tt)^3+3*pcx1*(1-tt)^2*tt+3*pcx2*(1-tt)*tt*tt+ppx*tt^3
312.                                 y2#=py*(1-tt)^3+3*pcy1*(1-tt)^2*tt+3*pcy2*(1-tt)*tt*tt+ppy*tt^3
313.
314.                                 Line x1,y1,x2,y2
315.
316.                                 t#=t#+st#
317.                         Wend
318.
319.                         If showcontrol=True
320.
321.                                 Oval pcx1-2,pcy1-2,4,4
322.                                 Oval pcx2-2,pcy2-2,4,4
323.
324.                         EndIf
325.
326.
327.                 Next
328.
329.
330.
331. End Select
332.
333.
334.
335. End Function
336.
337. Function PointHit.point(x#,y#,size#=16)
338. sqsize=size*size
339.
340. For p.point=Each point
341.
342.         dx#=x-px
343.         dy#=y-py
344.
345.         l#=dx*dx+dy*dy
346.
347.         If l<sqsize
348.                 Return p
349.         EndIf
350.
351. Next
352.
353. End Function
354.
355. Function PointMove(p.point,x#,y#)
356.
357. px=x
358. py=y
359.
360. PointUpdate
361.
362. End Function