This application will generate a set of Cubic Bézier Curves and will bounce them around in a box.
Its a good example of how a Cubic Bézier Curve is formed. There is more information about Cubic Bézier Curves at this Wikipedia Article about Bézier Curves...
Language:
Dark Basic Pro
Code:
sync off sync rate 0 randomize timer() backdrop on color backdrop 0 set text font "Courier New" set text size 18 CURVE_COUNT = 8 CURVE_SEGMENTS = 8 #constant ARENA_SIZE 10.0 #constant LINE_SPEED 10.0 make object cube 1, ARENA_SIZE * 2.0 position object 1, 0, 0 ,0 color object 1, rgb(128,128,128) set alpha mapping on 1, 10 set object transparency 1, 3 set point light 0, 1000,1000,1000 set light range 0, 0 Status = 1 camDist as float camDist = ARENA_SIZE * 4.0 mouseDown = 0 START: dim Curves(CURVE_COUNT) as CurveData temp = make vector3(1) for i = 1 to CURVE_COUNT + 1 curveOffset = i * 100 if i <= CURVE_COUNT `SET RANDOM START POINT Curves(i).A.Pos.X = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).A.Pos.Y = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).A.Pos.Z = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).B.Pos.X = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).B.Pos.Y = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).B.Pos.Z = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).C.Pos.X = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).C.Pos.Y = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).C.Pos.Z = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).D.Pos.X = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).D.Pos.Y = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE Curves(i).D.Pos.Z = rnd(ARENA_SIZE+ARENA_SIZE)-ARENA_SIZE `SET RANDOM VELOCITY Curves(i).A.Vel.X = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).A.Vel.Y = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).A.Vel.Z = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).B.Vel.X = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).B.Vel.Y = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).B.Vel.Z = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).C.Vel.X = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).C.Vel.Y = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).C.Vel.Z = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).D.Vel.X = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).D.Vel.Y = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).D.Vel.Z = rnd(LINE_SPEED+LINE_SPEED)-LINE_SPEED Curves(i).col = rgb(rnd(255),rnd(255),rnd(255)) x1 as float : y1 as float: z1 as float x2 as float : y2 as float: z2 as float for j = 0 to CURVE_SEGMENTS obj = j + curveOffset if j < CURVE_SEGMENTS t as float t = j * 1.0 / CURVE_SEGMENTS x1 = CubicBezier(Curves(i).A.Pos.X, Curves(i).B.Pos.X, Curves(i).C.Pos.X, Curves(i).D.Pos.X, t) y1 = CubicBezier(Curves(i).A.Pos.Y, Curves(i).B.Pos.Y, Curves(i).C.Pos.Y, Curves(i).D.Pos.Y, t) z1 = CubicBezier(Curves(i).A.Pos.Z, Curves(i).B.Pos.Z, Curves(i).C.Pos.Z, Curves(i).D.Pos.Z, t) t = (j+1.0) * 1.0 / CURVE_SEGMENTS x2 = CubicBezier(Curves(i).A.Pos.X, Curves(i).B.Pos.X, Curves(i).C.Pos.X, Curves(i).D.Pos.X, t) y2 = CubicBezier(Curves(i).A.Pos.Y, Curves(i).B.Pos.Y, Curves(i).C.Pos.Y, Curves(i).D.Pos.Y, t) z2 = CubicBezier(Curves(i).A.Pos.Z, Curves(i).B.Pos.Z, Curves(i).C.Pos.Z, Curves(i).D.Pos.Z, t) if object exist(obj) then delete object obj set vector3 1, x1 - x2, y1 - y2, z1 - z2 make object triangle obj, 0,0,0, 0,0,0, 0,0,1 scale object obj, 100.0, 100.0, 100.0 * length vector3(1) position object obj, x1, y1, z1 point object obj, x2, y2, z2 set object wireframe obj,1 set object emissive obj, Curves(i).col else if object exist(obj) then delete object obj endif next j else for j = 0 to CURVE_SEGMENTS-1 obj =j + curveOffset if object exist(obj) then delete object obj next j endif next i autocam off positionCamera(wrapvalue(mousex()), wrapvalue(mousey()), camDist#,) frameTime as float : frameTime = 1.0 startTime as integer : startTime = timer() do frameTime = (frameTime * 0.8) + ((timer() - startTime) * 0.2) startTime = timer() text 10, 10, "FPS: " + str$(screen fps()) text 30, 30, "Curves: " + str$(CURVE_COUNT) text 30, 50, "Number of Segments Per Curve: " + str$(CURVE_SEGMENTS) text 30, 70, "Camera Distance: " + str$(camDist) text 5, 10 + (Status * 20), "->" mmz = mousemovez() if mmz <> 0 if mmz > 0 dec Status if Status < 1 then Status = 3 endif if mmz < 0 inc Status if Status > 3 then Status = 1 endif endif if mouseclick() > 0 restart = 0 select Status case 1 if mouseDown = 0 restart = 1 if mouseclick() = 1 then inc CURVE_COUNT else if mouseclick() = 2 AND CURVE_COUNT > 1 then dec CURVE_COUNT else restart = 0 mouseDown = 1 endif endcase case 2 if mouseDown = 0 restart = 1 if mouseclick() = 1 then inc CURVE_SEGMENTS else if mouseclick() = 2 AND CURVE_SEGMENTS > 1 then dec CURVE_SEGMENTS else restart = 0 mouseDown = 1 endif endcase case 3 if mouseclick() = 1 then inc camDist, frameTime * 0.05 else inc camDist, frameTime * -0.05 positionCamera(wrapvalue(mousex()), wrapvalue(mousey()), camDist) endcase endselect if restart = 1 then goto START else if mouseDown = 1 then mouseDown = 0 endif if mousemovey()<> 0 OR mousemovex() <> 0 then positionCamera(wrapvalue(mousex()), wrapvalue(mousey()), camDist) gosub ANIMATE_CURVE `sync loop end ANIMATE_CURVE: x1 as float : y1 as float: z1 as float x2 as float : y2 as float: z2 as float t as float for i = 1 to CURVE_COUNT ft as float : ft = frameTime * 0.001 inc Curves(i).A.Pos.X, Curves(i).A.Vel.X * ft inc Curves(i).A.Pos.Y, Curves(i).A.Vel.Y * ft inc Curves(i).A.Pos.Z, Curves(i).A.Vel.Z * ft inc Curves(i).B.Pos.X, Curves(i).B.Vel.X * ft inc Curves(i).B.Pos.Y, Curves(i).B.Vel.Y * ft inc Curves(i).B.Pos.Z, Curves(i).B.Vel.Z * ft inc Curves(i).C.Pos.X, Curves(i).C.Vel.X * ft inc Curves(i).C.Pos.Y, Curves(i).C.Vel.Y * ft inc Curves(i).C.Pos.Z, Curves(i).C.Vel.Z * ft inc Curves(i).D.Pos.X, Curves(i).D.Vel.X * ft inc Curves(i).D.Pos.Y, Curves(i).D.Vel.Y * ft inc Curves(i).D.Pos.Z, Curves(i).D.Vel.Z * ft if (Curves(i).A.Pos.X > ARENA_SIZE AND Curves(i).A.Vel.X > 0) OR (Curves(i).A.Pos.X < -ARENA_SIZE AND Curves(i).A.Vel.X < 0) then Curves(i).A.Vel.X = -Curves(i).A.Vel.X if (Curves(i).A.Pos.Y > ARENA_SIZE AND Curves(i).A.Vel.Y > 0) OR (Curves(i).A.Pos.Y < -ARENA_SIZE AND Curves(i).A.Vel.Y < 0) then Curves(i).A.Vel.Y = -Curves(i).A.Vel.Y if (Curves(i).A.Pos.Z > ARENA_SIZE AND Curves(i).A.Vel.Z > 0) OR (Curves(i).A.Pos.Z < -ARENA_SIZE AND Curves(i).A.Vel.Z < 0) then Curves(i).A.Vel.Z = -Curves(i).A.Vel.Z if (Curves(i).B.Pos.X > ARENA_SIZE AND Curves(i).B.Vel.X > 0) OR (Curves(i).B.Pos.X < -ARENA_SIZE AND Curves(i).B.Vel.X < 0) then Curves(i).B.Vel.X = -Curves(i).B.Vel.X if (Curves(i).B.Pos.Y > ARENA_SIZE AND Curves(i).B.Vel.Y > 0) OR (Curves(i).B.Pos.Y < -ARENA_SIZE AND Curves(i).B.Vel.Y < 0) then Curves(i).B.Vel.Y = -Curves(i).B.Vel.Y if (Curves(i).B.Pos.Z > ARENA_SIZE AND Curves(i).B.Vel.Z > 0) OR (Curves(i).B.Pos.Z < -ARENA_SIZE AND Curves(i).B.Vel.Z < 0) then Curves(i).B.Vel.Z = -Curves(i).B.Vel.Z if (Curves(i).C.Pos.X > ARENA_SIZE AND Curves(i).C.Vel.X > 0) OR (Curves(i).C.Pos.X < -ARENA_SIZE AND Curves(i).C.Vel.X < 0) then Curves(i).C.Vel.X = -Curves(i).C.Vel.X if (Curves(i).C.Pos.Y > ARENA_SIZE AND Curves(i).C.Vel.Y > 0) OR (Curves(i).C.Pos.Y < -ARENA_SIZE AND Curves(i).C.Vel.Y < 0) then Curves(i).C.Vel.Y = -Curves(i).C.Vel.Y if (Curves(i).C.Pos.Z > ARENA_SIZE AND Curves(i).C.Vel.Z > 0) OR (Curves(i).C.Pos.Z < -ARENA_SIZE AND Curves(i).C.Vel.Z < 0) then Curves(i).C.Vel.Z = -Curves(i).C.Vel.Z if (Curves(i).D.Pos.X > ARENA_SIZE AND Curves(i).D.Vel.X > 0) OR (Curves(i).D.Pos.X < -ARENA_SIZE AND Curves(i).D.Vel.X < 0) then Curves(i).D.Vel.X = -Curves(i).D.Vel.X if (Curves(i).D.Pos.Y > ARENA_SIZE AND Curves(i).D.Vel.Y > 0) OR (Curves(i).D.Pos.Y < -ARENA_SIZE AND Curves(i).D.Vel.Y < 0) then Curves(i).D.Vel.Y = -Curves(i).D.Vel.Y if (Curves(i).D.Pos.Z > ARENA_SIZE AND Curves(i).D.Vel.Z > 0) OR (Curves(i).D.Pos.Z < -ARENA_SIZE AND Curves(i).D.Vel.Z < 0) then Curves(i).D.Vel.Z = -Curves(i).D.Vel.Z curveOffset = i * 100 for j = 0 to CURVE_SEGMENTS-1 t = j * 1.0 / CURVE_SEGMENTS x1 = CubicBezier(Curves(i).A.Pos.X, Curves(i).B.Pos.X, Curves(i).C.Pos.X, Curves(i).D.Pos.X, t) y1 = CubicBezier(Curves(i).A.Pos.Y, Curves(i).B.Pos.Y, Curves(i).C.Pos.Y, Curves(i).D.Pos.Y, t) z1 = CubicBezier(Curves(i).A.Pos.Z, Curves(i).B.Pos.Z, Curves(i).C.Pos.Z, Curves(i).D.Pos.Z, t) t = (j+1.0) * 1.0 / CURVE_SEGMENTS x2 = CubicBezier(Curves(i).A.Pos.X, Curves(i).B.Pos.X, Curves(i).C.Pos.X, Curves(i).D.Pos.X, t) y2 = CubicBezier(Curves(i).A.Pos.Y, Curves(i).B.Pos.Y, Curves(i).C.Pos.Y, Curves(i).D.Pos.Y, t) z2 = CubicBezier(Curves(i).A.Pos.Z, Curves(i).B.Pos.Z, Curves(i).C.Pos.Z, Curves(i).D.Pos.Z, t) obj = j + curveOffset set vector3 1, x1 - x2, y1 - y2, z1 - z2 position object obj, x1, y1, z1 point object obj, x2, y2, z2 scale object obj, 100.0, 100.0, 100.0 * length vector3(1) next j next i return function positionCamera(a as float, p as float, d as float) position camera cos(a) * sin(p) * d, cos(p) * d, sin(a) * sin(p) * d point camera 0,0,0 endfunction function CubicBezier(A as float, B as float, C as float, D as float, T as float) invT as float invT = 1.0 - T result as float result = (A * invT * invT * invT) + (3.0 * B * invT * invT * T) + (3.0 * C * invT * T * T) + (D * T * T * T) endfunction result type Coord X as float Y as float Z as float endtype type PointData Pos as Coord Vel as Coord endtype type CurveData A as PointData B as PointData C as PointData D as PointData col as DWORD endtype
(1 vote)
Wed, 08/29/2007 - 11:58
love it
