You are on page 1of 26

Buffon’s Needle Problem

João Rocha, Dany Da Silva

Université du Luxembourg

Bachelor en Sciences et Ingénierie

November 29, 2020

A beautiful way to estimate π

Supervisor: M. Arturo Jaramillo


Contents

1 Introduction 2

2 Experimentation 3
2.1 Using fire matches and a sheet of paper . . . . . . . . . . . . . . 3
2.2 Using our Java program . . . . . . . . . . . . . . . . . . . . . . . 8

3 Mathematical background 11
3.1 Uniform distribution . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Solution of Buffon’s needle problem . . . . . . . . . . . . . . . . . 12

4 Conclusion 17

A Java code documentation 18


A.1 Needle class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
A.2 Needles class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
A.3 DrawPanel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
A.4 MainFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

1
1 Introduction
Historical background
In mathematics, Buffon’s needle problem is a ques-
tion that was first posed in 1733 by Georges-Louis
Leclerc, Comte de Buffon. Georges-Louis Leclerc was a
French naturalist, mathematician, cosmologist, and en-
cyclopédist. One day Buffon asked himself : Suppose we
have a floor made of parallel strips of wood, each the same
width, and we drop a needle onto the floor. What is the
probability that the needle will lie across a line between
two strips? This question turned out to be one of the
earliest problems in the geometric probability and it was
also one of the first to be solved.

This problem can be subdivided into two different cases: dropping a short
needle, which means that the length of the needle is smaller than the width
between 2 lines or dropping a long needle, which means that the length of the
needle is larger than the width between 2 lines. At first the mathematicians
started analysing the short needle problem and later on they solved the long
needle problem.

There are different ways to solve the problem. It can be done using integral
geometry, or using no integrals at all. The first solution of this problem was
provided by Buffon himself in 1777. Later on, a solution using no intergrals was
published in 1860 by Joseph-Émile Barbier. No matter what method is used,
the result is always the same beautiful expression that provides an estimation
of π. At first, this might be quite mindblowing, however later on you will see
reasoning behind it. In 1901, the Italian mathematician Mario Lazzarini per-
formed Buffon’s needle experiment. Tossing a needle 3408 times, he obtained
the well-known approximation 355/113 for π, accurate to six significant digits.

Solving Buffon’s needle Problem in a modern world


Nowadays, unlike Mario Lazzarini, we don’t have to drop a needle 3408 times
to find a good estimation of π. We can use computer science to simulate the
situation and change the variables as many times as we want. Nevertheless, we
will start our documentation of this problem the old-fashioned way. In the first
part of the experimentation, we will drop needles just like Mario Lazzarini did
it in 1901. We will count how many needles drop on the parallel lines and then
calculate the estimation of π. For the second part of the experimentation, we
developped a computer program that will drop as many needles as we want and
return the estimation of π.

2
2 Experimentation
In this section, we will perform several simulations of Buffon’s needle problem.
Our goal is to analyse different scenarios and calculate an estimation of π using
the following result:

Let l be the length of the needle and let d be the distance between parallel
lines. Then,
2l
If l < d, then: P{needle crosses a line} =

 s 
   2
2 d 2l  d 
If l ≥ d, then: P{needle crosses a line} = arccos + 1− 1−
π l dπ l

These formulas are the solution of Buffon’s needle problem and are proven in
section 3. Basically, we set π to be the unknown in our equation and calculate
its value by counting the number of needles that cross a line. We will first take
a look at a real-world representation of our problem using fire matches and a
sheet of paper. Finally, we will use our Java program.

2.1 Using fire matches and a sheet of paper


In this part, we will try 3 different settings for the needle length and for the
distance between parallel lines to see how this impacts our results. Additionally,
for each fixed setting, we will first drop 15 needles, then 20 needles and finally
25 needles. For each situation, we provided images of our drops followed by a
table that contains the outcome.

Small matches and big distance


For this experiment, the fire matches have 4, 4 cm and we set the distance be-
tween parallel lines to 8 cm. We first drop 15 matches:

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
3 4 7 4,67 0,31
crossing a line

3
2l 2 · 4, 4
π≈ ≈ ≈ 3, 55
d · P{needle crosses a line} 8 · 0, 31

Now let us drop 20 fire matches:

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
5 7 7 6,33 0,32
crossing a line

2l 2 · 4, 4
π≈ ≈ ≈ 3, 44
d · P{needle crosses a line} 8 · 0, 32

Finally, we drop 25 needles:

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
5 7 11 7,67 0,31
crossing a line

2l 2 · 4, 4
π≈ ≈ ≈ 3, 55
d · P{needle crosses a line} 8 · 0, 31
As we see, the estimates are decent but not on point. However notice that this
is due to the fact that we only drop at most 25 matches, which means that the
outcome is not very precise.

4
Large matches and big distance
For this experiment, we use larger fire matches of length 10 cm and we set the
distance between horizontal lines to 11 cm. Again, we first drop 15 matches:

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
10 7 8 8,33 0,56
crossing a line

2l 2 · 10
π≈ ≈ ≈ 3, 25
d · P{needle crosses a line} 11 · 0, 56

We now drop 20 matches;

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
9 9 9 9 0,45
crossing a line

2l 2 · 10
π≈ ≈ ≈ 4, 04
d · P{needle crosses a line} 11 · 0, 45

Lastly, we change the number of needles to 25:

5
Try 1 Try 2 Try 3 Average P{needle crosses a line}
number of matches
8 11 13 10,6 0,42
crossing a line

2l 2 · 10
π≈ ≈ ≈ 4, 33
d · P{needle crosses a line} 11 · 0, 42

Large matches and small distance


This last experiment covers the case where the needle length is bigger than the
distance between parallel lines. We use the same fire matches of length 10 cm
and we set the distance to 8 cm. We start by dropping 15 matches:

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
9 7 8 8 0,53
crossing a line

 s 
   2
2 d 2l d
π≈ arccos + 1 − 1 −
P{needle crosses a line} d · P{needle crosses a line}

l l
 s 
   2
2 8 2 · 10  8
≈ arccos + 1− 1− 
0, 53 10 8 · 0, 53 10

≈ 4, 32

6
Now we change the number of needles to 20 :

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
11 12 12 11,67 0,58
crossing a line
 s 
   2
2 d 2l 1 − 1 − d 
π≈ arccos +
P{needle crosses a line} l d · P{needle crosses a line} l
 s 
   2
2 8 2 · 10  8
≈ arccos + 1− 1− 
0, 58 10 8 · 0, 58 10

≈ 3, 94

We change the number of needles to 25 now:

Try 1 Try 2 Try 3 Average P{needle crosses a line}


number of matches
17 14 14 15 0,6
crossing a line
 s 
   2
2 d 2l d
π≈ arccos + 1 − 1 −
P{needle crosses a line} d · P{needle crosses a line}

l l
 s 
   2
2 8 2 · 10  8
≈ arccos + 1− 1− 
0, 6 10 8 · 0, 6 10

≈ 3, 81

7
2.2 Using our Java program
By elaborating a program that simulates Buffon’s needle problem, we do not
have to drop and count fire matches anymore. By pressing a single button, one
or several needles get dropped at random. The number of needle crossing a line
and its corresponding π estimation are immediately presented on the blue panel.
This makes experimentation less tedious and way more precise, because we can
drop large amounts of needles without much effort. If you are interested in the
Java code, take a look at Appendix A. Without further ado, let us take a look
at some outcomes of our program. Notice that all lengths are expressed in pixels.

Small needles and medium distance


First, we will drop 100 needles of size 80 and the distance between parallel lines
is set to 140:

Comparing this estimation with the previous experiments using at most 25


fire matches, we conclude that the estimation of π is not bad at all. Nevertheless,
let us take a look at some more examples.

8
Medium needles and large distance
Now, let us drop 100 needles of size 150 and let us set the distance between lines
to 200:

Again, we observe that dropping only 100 needles is enough to have a pretty
good estimation of π. Hence, after having covered the case where the needle
length is smaller than the distance between lines, let us now take a look at one
example that is the other way around.

9
Large needles and small distance
Lastly, we drop 100 needles of size 150 and the distance between parallel lines
is set to 90:

After having done all this experiments, we see that Buffon’s needle problem
is a really beautiful way to estimate π. Without much effort, one can find
some decent estimates using only fire matches and a sheet of paper with some
horizontal lines. However using a computer to simulate the situation, we get
very impressiv estimates. Let us now discover the mathematical background
that is hidden behind the formulas presented at the start of this section.

10
3 Mathematical background
3.1 Uniform distribution
In probability theory and statistics, uniform distribution is a type of probability
distribution in which all outcomes are equally likely. Hence, it describes an ex-
periment where there is an arbitrary outcome that lies between certain bounds.
There are two types of uniform distribution: discrete and continuous.
A discrete uniform distibution is a statistical distribution where the number of
outcomes is finite. A good example of a discrete uniform distribution would be
the outcomes of rolling a standard six-sided die. The possible values are 1, 2,
3, 4, 5 or 6. Since the outcomes are equally likely, the probability of rolling a
particular value is 16 . However, it is not possible to roll 2.6 or 4.1.
On the other hand, a continuous uniform distribution is a statistical distribution
with an infinite number of equally likely measurable values. Thus, a continuous
random variable can take any real value within a specified range. An example of
a continuous uniform distribution would be generating a real number bewteen
0 and 1.

DEFINITION 1. Let X be a random variable. The density of X is a function


fX : R → R+ that is Riemann integrable. In particular:
Z ∞
fX (t) dt = 1.
−∞
The probability that X takes a value in the (open or closed) interval [a, b] is
given by:
Z b
P{a ≤ X ≤ b} = fX (t) dt.
a

DEFINITION 2. Let X be a random variable. If X is continuously uniformly


distributed on the interval [a, b], abbreviated as X ∼ U [a, b], then the density
of X is
1
fX (t) = 1[a,b] (t),
b−a
where 1[a,b] (t) denotes the indicator function defined as:
(
1 if a ≤ t ≤ b
1[a,b] (t) =
0 otherwise

11
3.2 Solution of Buffon’s needle problem
Let us now analyse mathematically Buffon’s needle problem. A needle of length
l is dropped "at random" on the floor with equally spaced parallel lines that are
d units appart. What is the probability that a needle will lie across a line upon
landing?

We will first take a look at the case where l < d. Let us do a sketch of the
problem:

We notice that the distance y from the center of the needle to the bottom
line and the angle θ are the only parameters we need to know if a needle crosses
a line. Hence, let Y and Θ be random variables such that Y = y and Θ = θ
with y ∈ [0, d[ and θ ∈ [0, π[. Notice that Y and Θ are independent. Since
needles are dropped "at random", we conclude that Y and Θ are continuously
uniformly distributed, i.e.
1
Y ∼ U [0, d[ −→ fY (y) = 1[0,d[ (y)
d
1
Θ ∼ U [0, π[ −→ fΘ (θ) = 1[0,π[ (θ)
π
Furthermore, we know that a needle hits a parallel line if it hits either the
bottom parallel line or the top parallel line, i.e. if
l l
y ≤ sin(θ) · or d − y ≤ sin(θ) ·
2 2
l
⇔ y ≥ d − sin(θ) ·
2
Let A be the event that a needle hits the bottom line and let B be the event that
a needle hits the top line. Notice that a needle cannot cross the bottom line
and the top line at the same time, because we assumed that l < d. Hence, we
conclude that A and B are disjoint. Now, we have gathered all the information
we need to calculate the probability that a needle crosses a line. Using the
simple formula for the probability of the union of two events, we get:

12
P{needle hits a line} = P{A ∪ B}
= P{A} + P{B} − P{A ∩ B}
| {z }
=0
   
l l
= P y ≤ sin(θ) · + P y ≥ d − sin(θ) ·
2 2
   
l l
= P 0 ≤ y ≤ sin(θ) · + P d − sin(θ) · ≤y≤d
2 2
Z π Z sin(θ)· 2l Z πZ d
= fY (y)fΘ (θ) dy dθ + fY (y)fΘ (θ) dy dθ
0 0 0 d−sin(θ)· 2l
Z π Z sin(θ)· 2l Z π Z d
1 1
= dy dθ + dy dθ
dπ 0 0 dπ 0 d−sin(θ)· 2l
Z π h isin(θ)· l id Z πh
1 2 1
= y dθ + y dθ
dπ 0 0 dπ 0 d−sin(θ)· 2l
Z π Z π 
1 l 1 l
= sin(θ) · dθ + −d
d  + sin(θ) · dθ
dπ 0 2 dπ 0 2
 π
2 l
= −cos(θ) ·
dπ 2 0
 
2 l l
= − cos(π) · + cos(0) ·
dπ | {z } 2 | {z } 2
=−1 =1
2l
=

Let us now analyse the case where l ≥ d. This case is a bit more tricky.
Nevertheless, we will explain everything in detail. Just like for the previous
case, let Y and Θ be two random independent variables that define the position
of the needle such that Y = y and Θ = θ with y ∈ [0, d[ and θ ∈ [0, π[.
First of all, let us observe that there exists an angle θ0 such that if the angle of
the needle is in the interval [θ0 , π − θ0 ], then this condition guarantees that the
needle intersects at least one parallel line. We can even find an expression for
this angle:

13
In the middle picture, the center of the needle is at distance d2 from the
bottom line and from the top line. Hence, the minimal angle θ0 , to assure that
the needle touches the top line and the bottom line, is:
d  
d d
sin(θ0 ) = 2l = ⇔ θ0 = arcsin
2
l l

We conclude that by moving a needle with angle θ ∈ [θ0 , π − θ0 ] slightly up


or down, it will always intersect at least one parallel, i.e. the probability of
hitting a needle is independent of the position y of the center of the needle if
θ ∈ [θ0 , π − θ0 ]. Again, let A be the event that a needle hits the bottom line
and let B be the event that a needle hits the top line. However notice that this
time around, these events aren’t disjoint, because a needle can hit the top and
bottom line simultaneously. Let us differ 3 different cases:
• Case 1: the needle is closer to the bottom line, i.e. y < d
2

• Case 2: the needle is closer to the top line, i.e. y > d


2

• Case 3: the needle hits exactly in between the top and bottom line, i.e.
y = d2
By analysing each case seperatly, it turns out that the results are the same.
However, since the first two cases are much more complicated to analyse, we
will only solve the problem for the third case. The reader is nevertheless en-
couraged to prove the other two cases.

Case 3
Notice that the needle intersects the top and the bottom line if θ ∈ [θ0 , π − θ0 ].
So let us split the interval [0, π[ into [0, θ0 [∪[θ0 , π − θ0 [∪[π − θ0 , π[. Hence,

 
l
P{A} = P 0 ≤ y ≤ sin(θ) ·
2
Z θ0 Z sin(θ)· 2l Z π−θ0 Z π Z sin(θ)· 2l
= fY (y)fΘ (θ) dy dθ + fΘ (θ) dθ + fY (y)fΘ (θ) dy dθ
0 0 θ0 π−θ0 0
θ0 sin(θ)· 2l Z π Z sin(θ)· 2l
1 π−θ0
Z Z Z
1 1
= dy dθ + dθ + dy dθ
dπ 0 0 π θ0 dπ π−θ0 0
Z θ0 h isin(θ)· l Z π h isin(θ)· l
1 2 1 h iπ−θ0 1 2
= y dθ + y + y dθ
dπ 0 0 π θ0 dπ π−θ0 0
Z θ0 Z π
1 l 1 1 l
= sin(θ) · dθ + (π − θ0 − θ0 ) + sin(θ) · dθ
dπ 0 2 π dπ π−θ0 2
1 h l iθ0 1 1 h l iπ
= − cos(θ) · + (π − 2θ0 ) + − cos(θ) ·
dπ 2 0 π dπ 2 π−θ0

14
    
d d
Let us now substitute θ0 = arcsin and use the fact that cos arcsin =
s l l
 2
d
1− . Additionally, we know that cos(π − α) = −cos(α). So finally,
l
 s 
 2  
l  d  2 d
P{A} = 1− 1− + 1 − arcsin
dπ l π l

Similarly,
 
l
P{B} = P d − sin(θ) · ≤ y ≤ d
2
Z θ0 Z d Z π−θ0 Z π Z d
= fY (y)fΘ (θ) dy dθ + fΘ (θ) dθ + fY (y)fΘ (θ) dy dθ
0 d−sin(θ)· 2l θ0 π−θ0 d−sin(θ)· 2l
θ0 d
1 π−θ0
Z Z Z Z π Z d
1 1
= dy dθ + dθ + dy dθ
dπ 0 d−sin(θ)· 2l π θ0 dπ π−θ0 d−sin(θ)· 2l
Z θ0 h id Z π h id
1 1 h iπ−θ0 1
= y dθ + y + y dθ
dπ 0 d−sin(θ)· 2l π θ0 dπ π−θ0 d−sin(θ)· 2l
Z θ0   Z π  
1 l 1 1 l
= d − d + sin(θ) · dθ + (π − θ0 − θ0 ) + d − d + sin(θ) · dθ
dπ 0 2 π dπ π−θ0 2
1 h l iθ0 1 1 h l iπ
= − cos(θ) · + (π − 2θ0 ) + − cos(θ) ·
dπ 2 0 π dπ 2 π−θ0

It turns out to be the same expression as for P{A}, hence


 s 
 2  
l  d  2 d
P{B} = 1− 1− + 1 − arcsin
dπ l π l

Furthermore,
Z π−θ0 Z π−θ0
1 1 h iπ−θ0
P{A ∩ B} = P {θ0 ≤ y ≤ π − θ0 } = fΘ (θ) dθ = dθ = y
θ0 π θ0 π θ0
1
= (π − θ0 − θ0 )
π
1
= (π − 2θ0 )
π  
2 d
= 1 − arcsin
π l

15
So finally,

P{needle hits a line} = P{A ∪ B}


= P{A} + P{B} − P{A ∩ B}
 s 
 2     
2l  d  4 d 2 d
= 1− 1− +2− arcsin − 1 − arcsin
dπ l π l π l
 s 
 2  
2l  d  2 d
= 1− 1− +1− arcsin
dπ l π l

π
Using the fact that arcsin(α) = − arccos(α), we get
2
 s 
 2   
2l 1 − 1 − d  + 1 − 2 π − arccos d
P{needle hits a line} =
dπ l π 2 l
 s 
 2  
2l 1 − 1 − d  + 2 arccos d
=
dπ l π l

16
4 Conclusion
The Buffon’s needle problem is pretty interesting and a beautiful way to estimate
π, because it can be done by simply dropping fire matches on a sheet of paper
with some drawn parallel lines. Hence this experiment can be done by everyone
and if you have some mathematical knowledge, you can also apply the formulas
to get an estimate of π. Nowadays, there exist countless methods to estimate
π. However, some of them might be much more complicated than our problem.
Nevertheless, here are some problems that might appeal to you.

Different ways to estimate π


• Polygon approximation
This was the first recorded algorithm for rigorously calculating the value
of π using a geometrical approach with polygons. This was discovered by
Archimedes around 250 BC. This method consists of estimating π , by
computing the perimeters of circumscribed and inscribed polygons.
• Indiana Pi Bill
The so-called "Indiana Pi Bill" of 1897 has often been characterized as
an attempt to "legislate the value of Pi". Rather, the bill dealt with a
purported solution to the problem of geometrically "squaring the circle".

• Spigot algorithms
Two algorithms were discovered in 1995 that opened up new avenues of
research into π. They are called spigot algorithms because, like water
dripping from a spigot, they produce single digits of π that are not reused
after they are calculated.

17
A Java code documentation
In this section, I will go over my code and explain some important computations
in more detail. As a side note, I wrote the program in Java language using
NetBeans IDE 8.1.
First of all, the program is composed of four main classes:
• Needle
• Needles

• DrawPanel
• MainFrame
Let us take a detailed look at each class to understand their purpose.

A.1 Needle class


As the name says, this class defines a needle. It has 4 attributes:

The center, length and angle attributes are initialized using a constructor.
I wanted each needle to have a random color, so I randomly generate an RGB
color by generating 3 random numbers between 0 and 255. The formula used
to generate a random integer belonging to the interval [min,max] is:
(int)(Math.random()*(max-min+1))+min.

Lastly, this class has a method that draws the needle using the predefined
drawLine method. Applying simple trigonometry, we can compute the coordi-
nates of the startpoint and endpoint of the needle using the attributes of the
class:

18
A.2 Needles class
This class has a list that contains needles. Every time we want to drop a needle,
we add a new needle to the list. This class has the following methods:

• add: adds a needle passed as a parameter to the list


• clear: clears the entire list
• size: return the number of needles contained in the list
• get: returns the needle at the ith position in the list

• draw: draws all the needles in the list

19
A.3 DrawPanel
Let us now take a look at the draw panel. This is the white panel that can be
seen when we run the program. First of all, to be acknowledged as a panel, we
have to define this class as a javax.swing.JPanel extension. Furthermore, this
class has 3 attributes:

The first attribute needles is a list of needles. NumberHLines is the number


of horizonzal lines that will be drawn on our panel. Lastly, distance is the dis-
tance bewteen horizontal lines.
Next there is a constructor that is automatically generated:

20
Moreover, we have to be able to give values to our attributes. That’s the
job of the setNeedles method:

It initializes the list and the distance using its parameters and then gives to
numberHLines the value that is returned using the calculateNbHLines method
right below. In this method there are 2 variables: number and newDistance.
Number is the value that will be returned at the end of the method and newDis-
tance is initialized at the height of our panel. As long as newDistance is bigger
than distance, we add 1 to number and then redefine newDistance as newDis-
tance minus distance.

Finally, we have to draw the panel and its horizontal lines:

We set the color to white, because we want the panel to be white and then
fill it using the existing fillRect method that draws a white rectangle with top
left corner at (0,0) and with width and height of the panel. Next, we set the
color to black and draw the horizontal lines using a for loop. Finally, we check
if the list is initialized, because we want to draw every needle contained in it.

21
A.4 MainFrame
Last but not least, we have the MainFrame that makes every other class come
together and creates a window for us to see graphically what we have pro-
grammed. First let us take a look at the design:

At the top we have our drawPanel and at the bottom we have a blue panel
that is not programmed to draw anything, it only gathers our buttons, text
labels and text fields. Let us move over to the code:

22
First of all, we have to define this class as an extension of the javax.swing.JFrame
to use it as the MainFrame. This class has 3 attributes: a list with needles, the
length of a random needle and the distance between lines. The length of the
needle and the distance are initialized as 100 when the program starts. Addi-
tionally, the MainFrame has a constructor that is automatically generated. In
this constructor, we initialize the drawPanel.

Next we have a very important method that will be used after pressing any
button: the updateView method.

Even if the action of a certain button is done after pressing it, e.g. adding a
random needle using the addButton, we won’t see anything happen if we don’t
update the view. This means that every time the updateView method is used,
every label is updated, e.g. the number of needles dropped and the the draw-
Panel is repainted.

Before taking a look at the buttons, let us analyse the last method and
perhaps the most complex one:

23
This method returns the number of times the needles in the list hit a hor-
izontal line. Notice that this method even covers the case where the length
of the needles are larger than the distance between lines, which means that a
needle could intersect more than 1 horizontal line. We start by going through
the whole list and checking for each needle in the list how many times it hits
a horizontal line. To get the trigonometry right, we have to seprate two cases:
the first one, if the angle of the needle is strictly smaller than π2 and the second
one, if the angle of the needle is greater or equal to π2 . In any case we define the
y coordinate of the start point as startY and the y coordinate of the end point
of the needle as endY using trigonometry. By doing an integer division or in
other words taking the floor function of startY divided by distance and endY
divided by distance, we check if the needle intersects a line. Finally, for each
needle, we add 1 to the total number of hits and then return it after the for loop.

Finally, let us take a look at the buttons:


• add needle button

When this button is pressed, a needle with random center, random angle
and random color will be drawn on our drawPanel.

• add 100 needles button

Similarly, when this button is pressed, 100 needles with random attributes
are drawn.

24
• clear button

By pressing this button we delete every element of the list of existing nee-
dles. Hence the drawPanel will be completly blank.

• needle size setter button

By entering the desired size for the needle in text field and then pressing
the apply button, every new needle that is added after this action, will
have the new defined size.

• distance setter button

Similarly, we can change the size of the distance between horizontal lines
by entering the new value in the text field and pressing the apply button.

25

You might also like