Paproć Barnsleya: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
Paweł Ziemian BOT (dyskusja | edycje)
m zamieniam magiczny ISBN na szablon
WP:SK+mSK+ToS+Bn, dodano programy z różnych środowisk
Linia 1:
[[Plik:Bransleys fern.png|right|thumb|150px|Paproć Barnsley'aBarnsley’a]]
[[Plik:Fractal fern1.png|right|thumb|150px|Paproć Barnsley'aBarnsley’a]]
[[Plik:Fractal fern explained.png|right|thumb|150px|Przekształcenia [[IFS (geometria fraktalna)|IFS]]]]
 
'''Paproć Barnsleya''' (''paprotka Barnsleya'', ''fraktal liść paproci'') – [[fraktal]] znany ze względu na uderzające podobieństwo do liści [[Paprocie|paproci]] występujących w [[natura|naturze]], spopularyzowany przez [[Michael Barnsley|Michaela F. Barnsleya]]. Jest to przykład złożonego obiektu, który może być opisany za pomocą zaledwie czterech [[przekształcenie afiniczne|przekształceń afinicznych]] (zob. Barnsley (1993), strs. 86) jako [[atraktor]] następującego systemu [[funkcja|funkcji]] zwężających [[IFS (geometria fraktalna)|(IFS - system funkcji iterowanych)]]:
 
: <math> f_1(x,y) = (0.85x+0.04y, -0.04x+0.85y+1.6)</math>
: <math> f_2(x,y) = (-0.15x+0.28y, 0.26x+0.24y+0.44)</math>
: <math> f_3(x,y) = (0.20x-0.26y, 0.23x+0.22y+1.6)</math>
: <math> f_4(x,y) = (0, 0.16y).</math>
 
Aby wygenerować fraktal, należy użyć powyższych przekształceń w sposób losowy w następujących proporcjach: 85:7:7:1.
 
== Algorytm ==
[[Algorytm]] generowania tego fraktala polega na procesie [[iteracja|iteracji]] (wielokrotnego przekształcania) współrzędnych rysowanego punktu. Początkowo losowo wybieramy współrzędne punktu, a następnie również losowo wybieramy jedno z przekształceń afinicznych z odpowiednim [[prawdopodobieństwo|prawdopodobieństwem]]. Po obliczeniu nowych współrzędnych punktu, proces powtarzamy określoną ilość razy.
 
== PrzykładowyPrzykładowe programprogramy ==
[[Plik:Fractal fern-Barnsley animation.gif|right|thumb|300px|Animacja przedstawiająca paproć Barnsley'aBarnsley’a dla różnej liczby powtórzeń algorytmu IFS.]]
 
=== Matlab ===
Program napisany w [[Matlab|Matlabie]] generujący paproć widoczną na animacji obok:
Program napisany w [[Matlab]]ie generujący paproć widoczną na animacji obok:
 
<source lang="matlab">
Linia 40 ⟶ 41:
end
end
plot(x,y,'.','Color', 'g', 'MarkerSize',1)
title(['N = ' num2str(max_step)])
drawnow
Linia 47 ⟶ 48:
</source>
 
=== LiteraturaPython ===
Program napisany w [[Python|Pythonie]]:
* Barnsley, Michael F., and Hawley Rising. ''Fractals Everywhere''. Boston: Academic Press Professional, 1993. {{ISBN|0-12-079061-0}}
 
<source lang="python">
== Linki zewnętrzne ==
 
* [http://mathworld.wolfram.com/BarnsleysFern.html Paproć Barnsleya] {{lang|en}} w encyklopedii [[MathWorld]]
import random
import matplotlib.pyplot as plt
 
X = [0]
Y = [0]
for n in range(100000):
r = random.uniform(0, 100)
if r < 1.0:
x = 0
y = 0.16*Y[n-1]
elif r < 86.0:
x = 0.85*X[n-1] + 0.04*Y[n-1]
y = -0.04*X[n-1] + 0.85*Y[n-1]+1.6
elif r < 93.0:
x = 0.2*X[n-1] - 0.26*Y[n-1]
y = 0.23*X[n-1] + 0.22*Y[n-1] + 1.6
else:
x = -0.15*X[n-1] + 0.28*Y[n-1]
y = 0.26*X[n-1] + 0.24*Y[n-1] + 0.44
X.append(x);Y.append(y)
 
'''Tworzenie wykresu'''
plt.figure(figsize = [15,15])
plt.scatter(X,Y,color = 'g',marker = '.')
plt.show()
</source>
 
=== JavaScript (HTML5) ===
Program napisany w [[JavaScript]] (HTML5):
 
<source lang="html5">
<canvas id="canvas" height="700" width="700">
</canvas>
 
<script>
let canvas;
let canvasContext;
 
let move;
 
let fps = 250;
 
let pointColor = "green";
let backgroundColor = "black";
let pointRadius = 1;
 
let x = 0;
let y = 0;
 
window.onload = function () {
canvas = document.getElementById("canvas");
canvasContext = canvas.getContext('2d');
 
canvasContext.fillStyle = backgroundColor;
canvasContext.fillRect(0, 0, canvas.width, canvas.height);
 
move = setInterval(doIt, 1000/fps);
};
 
let doIt = function () {
for (let i = 0; i < 20; i++)
moveAll()
};
 
function moveAll() {
 
let nextX, nextY;
let r = Math.random();
if (r < 0.01) {
nextX = 0;
nextY = 0.16 * y;
} else if (r < 0.86) {
nextX = 0.85 * x + 0.04 * y;
nextY = -0.04 * x + 0.85 * y + 1.6;
} else if (r < 0.93) {
nextX = 0.20 * x - 0.26 * y;
nextY = 0.23 * x + 0.22 * y + 1.6;
} else {
nextX = -0.15 * x + 0.28 * y;
nextY = 0.26 * x + 0.24 * y + 0.44;
}
 
// Skalowanie i pozycjonowanie
let plotX = canvas.width * (x + 3) / 6;
let plotY = canvas.height - canvas.height * ((y + 2) / 14);
 
drawFilledCircle(plotX, plotY, pointRadius, pointColor);
 
x = nextX;
y = nextY;
 
}
const drawFilledCircle = (centerX, centerY, radius, color) => {
canvasContext.beginPath();
canvasContext.fillStyle = color;
canvasContext.arc(centerX, centerY, radius, 0, 2 * Math.PI, true);
canvasContext.fill();
};
</script>
</source>
 
=== QBasic ===
Programy napisany w [[QBasic]]:
 
<source lang="qbasic">
SCREEN 12
WINDOW (-5, 0)-(5, 10)
RANDOMIZE TIMER
COLOR 10
DO
SELECT CASE RND
CASE IS < .01
nextX = 0
nextY = .16 * y
CASE .01 TO .08
nextX = .2 * x - .26 * y
nextY = .23 * x + .22 * y + 1.6
CASE .08 TO .15
nextX = -.15 * x + .28 * y
nextY = -.26 * x + .24 * y + .44
CASE ELSE
nextX = .85 * x + .04 * y
nextY = -.04 * x + .85 * y + 1.6
END SELECT
x = nextX
y = nextY
PSET (x, y)
LOOP UNTIL INKEY$ = CHR$(27)
</source>
 
=== R ===
Program napisany w języku [[R (język programowania)|R]]:
 
<source lang="R">
# Paproć Barnsley'a
 
# Utworzenie funkcji z rachunkiem prawdopodobieństwa i obecnym punktem
fractal_fern2 <- function(x, p){
if (p <= 0.01) {
m <- matrix(c(0, 0, 0, .16), 2, 2)
f <- c(0, 0)
} else if (p <= 0.86) {
m <- matrix(c(.85, -.04, .04, .85), 2, 2)
f <- c(0, 1.6)
} else if (p <= 0.93) {
m <- matrix(c(.2, .23, -.26, .22), 2, 2)
f <- c(0, 1.6)
} else {
m <- matrix(c(-.15, .26, .28, .24), 2, 2)
f <- c(0, .44)
}
m %*% x + f
}
 
# liczba powtórzeń; im większa, tym bardziej dokładny efekt końcowy
reps <- 10000
 
# stworzenie wektora z wartościami prawdopodobieństwa oraz macierzy do przechowywania współrzędnych
p <- runif(reps)
 
# zainicjalizowanie punktu początkowego w początku układu współrzędnych
coords <- c(0, 0)
 
# obliczanie współrzędnych fraktalu
m <- Reduce(fractal_fern2, p, accumulate = T, init = coords)
m <- t(do.call(cbind, m))
 
# stworzenie wykresu
plot(m, type = "p", cex = 0.1, col = "darkgreen",
xlim = c(-3, 3), ylim = c(0, 10),
xlab = NA, ylab = NA, axes = FALSE)
</source>
 
=== Processing ===
Program napisany w [[Processing]] (wersja 3.4):
 
<source lang="java">
 
// deklarowanie zmiennych x i y
float x, y;
 
// stworzenie planszy
void setup() {
size(600, 600);
background(255);
}
 
/* ustawianie wyglądu punktów, mapowanie planszy i następnie rysowanie punktów */
void drawPoint() {
stroke(34, 139, 34);
strokeWeight(1);
float px = map(x, -2.1820, 2.6558, 0, width);
float py = map(y, 0, 9.9983, height, 0);
point(px, py);
}
 
/* algorytm na obliczanie (n+1)ego
wyrazu x i y bazujący na przekształceniu macierzy */
void nextPoint() {
float nextX, nextY;
float r = random(1);
if (r < 0.01) {
nextX = 0;
nextY = 0.16 * y;
} else if (r < 0.86) {
nextX = 0.85 * x + 0.04 * y;
nextY = -0.04 * x + 0.85 * y + 1.6;
} else if (r < 0.93) {
nextX = 0.20 * x - 0.26 * y;
nextY = 0.23 * x + 0.22 * y + 1.6;
} else {
nextX = -0.15 * x + 0.28 * y;
nextY = 0.26 * x + 0.24 * y + 0.44;
}
x = nextX;
y = nextY;
}
 
/* iteracja w pętli funkcji obliczających i rysujących */
void draw() {
for (int i = 0; i < 100; i++) {
drawPoint();
nextPoint();
}
}
</source>
 
== Literatura ==
* Barnsley, Michael F., and Hawley Rising. ''Fractals Everywhere''. Boston: Academic Press Professional, 1993. {{ISBN|0-12-079061-0}}.
 
== Zobacz też ==
Linia 58 ⟶ 288:
* [[przekształcenie afiniczne]]
 
== Linki zewnętrzne ==
* [http://mathworld.wolfram.com/BarnsleysFern.html Paproć Barnsleya] {{lang|en}} w encyklopedii [[MathWorld]]
 
[[Kategoria:Geometria fraktalna]]
[[Kategoria:L-systemy]]