Bezier Curve: различия между версиями
Материал из Поле цифровой дидактики
м Finally, |
Patarakin (обсуждение | вклад) м 1 версия импортирована |
(нет различий)
| |
Текущая версия от 11:33, 21 июля 2022
Шаблон:Stub A Bezier Curve is a smooth curve with many control points. It is infinitely scalable and often used in graphics and terrain generation. To make one in Scratch, one must use the following two methods:
Method 1
when green flag clicked
hide
pen up
set pen size to (2)
forever
erase all
def p-line :: custom
set pen color to (#268435)
draw p-line :: custom
set pen color to (255)
draw b-line steps: (90) :: custom
end
define set q-point A: (A.x :: custom-arg) (A.y :: custom-arg) B: (B.x :: custom-arg) (B.y :: custom-arg) progress: (progress :: custom-arg)
set [q.x v] to ((A.x :: custom-arg) + ((progress :: custom-arg) * ((B.x :: custom-arg) - (A.x :: custom-arg))))
set [q.y v] to ((A.y :: custom-arg) + ((progress :: custom-arg) * ((B.y :: custom-arg) - (A.y :: custom-arg))))
define def p-line
delete all of [p.x v]
delete all of [p.y v]
add ([x position v] of [P.00 v]) to [p.x v] // These are all the controls points of the curve, using clones is another solution to this.
add ([y position v] of [P.00 v]) to [p.y v]
add ([x position v] of [P.01 v]) to [p.x v]
add ([y position v] of [P.01 v]) to [p.y v]
add ([x position v] of [P.02 v]) to [p.x v]
add ([y position v] of [P.02 v]) to [p.y v]
add ([x position v] of [P.03 v]) to [p.x v]
add ([y position v] of [P.03 v]) to [p.y v]
add ([x position v] of [P.04 v]) to [p.x v]
add ([y position v] of [P.04 v]) to [p.y v]
add ([x position v] of [P.05 v]) to [p.x v]
add ([y position v] of [P.05 v]) to [p.y v]
add ([x position v] of [P.06 v]) to [p.x v]
add ([y position v] of [P.06 v]) to [p.y v]
add ([x position v] of [P.07 v]) to [p.x v]
add ([y position v] of [P.07 v]) to [p.y v]
add ([x position v] of [P.08 v]) to [p.x v]
add ([y position v] of [P.08 v]) to [p.y v]
add ([x position v] of [P.09 v]) to [p.x v]
add ([y position v] of [P.09 v]) to [p.y v]
add ([x position v] of [P.10 v]) to [p.x v]
add ([y position v] of [P.10 v]) to [p.y v]
add ([x position v] of [P.11 v]) to [p.x v]
add ([y position v] of [P.11 v]) to [p.y v]
add ([x position v] of [P.12 v]) to [p.x v]
add ([y position v] of [P.12 v]) to [p.y v]
add ([x position v] of [P.13 v]) to [p.x v]
add ([y position v] of [P.13 v]) to [p.y v]
define set b-point progress: (progress :: custom-arg)
delete all of [b.x v]
delete all of [b.y v]
repeat (length of [p.x v])
add (item ((length of [b.x v]) + (1)) of [p.x v]) to [b.x v]
add (item ((length of [b.y v]) + (1)) of [p.y v]) to [b.y v]
end
set [index.n v] to [1]
repeat ((length of [b.x v]) - (index.n))
repeat ((length of [b.x v]) - (index.n))
set q-point A: (item (index.n) of [b.x v]) (item (index.n) of [b.y v]) B: (item ((index.n) + (1)) of [b.x v]) (item ((index.n) + (1)) of [b.y v]) progress: (progress :: custom-arg) :: custom
add (q.x) to [b.x v]
add (q.y) to [b.y v]
change [index.n v] by (1)
end
change [index.n v] by (1)
end
define draw p-line
set [loop.n v] to [1]
go to x: (item (loop.n) of [p.x v]) y: (item (loop.n) of [p.y v])
pen down
repeat ((length of [p.x v]) - (loop.n))
change [loop.n v] by (1)
go to x: (item (loop.n) of [p.x v]) y: (item (loop.n) of [p.y v])
end
pen up
define draw b-line steps: (steps :: custom-arg)
set [loop.n v] to [0]
set b-point progress: ((loop.n) / (steps :: custom-arg)) :: custom
go to x: (q.x) y: (q.y)
pen down
repeat ((steps :: custom-arg) - (loop.n))
change [loop.n v] by (1)
set b-point progress: ((loop.n) / (steps :: custom-arg)) :: custom
go to x: (q.x) y: (q.y)
end
pen up
Method 2
One sprite needs this:
When green flag clicked hide delete all of [clone x v] delete all of [clone y v] set drag mode [draggable v] make clones :: custom define make clones set [Clone ID v] to (1) //local variable repeat (10) create clone of [myself v] add () to [clone x v] add () to [clone y v] end When I start as a clone show//make sure it has a costume go to (random position v) forever replace item (clone ID) of [clone x v] with (x position) replace item (clone ID) of [clone y v] with (y position) end
In another sprite, put this:
When green flag clicked
forever
erase all
draw line between dots :: custom //without screen refresh
Find curve points :: custom //without screen refresh
end
define copy main points
delete all of [x v]
delete all of [y v]
set [counter v] to (1)
repeat (length of [clone x v])
add (item (counter) of [clone x v]) to [x v]
add (item (counter) of [clone y v]) to [y v]
change [counter v] by (1)
end
define find curve points
delete all of [curve x v]
delete all of [curve y v]
set [t v] to (1)
repeat (100)
copy main points :: custom
repeat until <(length of [x v]) = (1)>
find lines :: custom
end
add (x :: list) to [curve x v]
add (y :: list) to [curve y v]
change [t v] by (1)
end
Draw curve :: custom
define move (t)% to x: (x) y: (y)
point in direction (([atan v] of (((x position)-(x))/((y position)-(y))))+((180)*<(y position)<(y)>))
move (([sqrt v] of ((((x position)-(x))*((x position)-(x)))+(((y position)-(y))*((y position)-(y)))))*((t)/(100))) steps
define find lines
set [line counter v] to (1)
repeat ((length of [x v])-(1))
go to x: (item (line counter) of [x v]) y: (item (line counter) of [y v])
move (t)% to x: (item ((line counter)+(1)) of [x v]) y: (item ((line counter)+(1)) of [y v]) :: custom
add (x position) to [x v]
add (y position) to [y v]
change [line counter v] by (1)
end
repeat ((line counter)-(1))
delete (1) of [x v]
delete (1) of [y v]
end
define Draw curve
go to x: (item (1) of [curve x v]) y: (item (1) of [curve y v])
pen down
set [line counter v] to (1)
repeat (length of [curve x v])
go to x: (item (line counter) of [curve x v]) y: (item (line counter) of [curve y v])
change [line counter v] by (1)
end
pen up
define draw line between dots
go to x: (item (1) of [clone x v]) y: (item (1) of [clone y v])
pen down
set [line counter v] to (1)
repeat (length of [clone x v])
go to x: (item (line counter) of [clone x v]) y: (item (line counter) of [clone y v])
change [line counter v] by (1)
end
pen up
Uses of Bezier Curves
There are many uses of Bezier curves within Scratch. These can include:
- Combining them with velocity to make things fall or bounce.
- Rendering a terrain with hills so that when one zooms in, the curve still looks nice.
- Making customisable graphs.
