January 26, 2021, 11:30:28 AM

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

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
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


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal