PDA

Visualizza la versione completa : [BASIC] Triangolo di Sierpinsky


RooccoXXI
19-01-2011, 16:52
Sto leggendo il libro Fractals for the classroom - Introduction to fractals and chaos (http://www.amazon.com/Fractals-Classroom-Part-Introduction-Chaos/dp/038797041X).

Ho trovato questo semplicissimo programma in BASIC che disegna il triangolo di Sierpinsky, utilizzando un sistema di coordinate binarie per colorare - le pari di un colore, le dispari di un altro - le celle del triangolo di Pascal.


DEFINT x, y
FOR x = 0 TO 255
FOR x = 0 TO y
IF (x AND (y-x)) = 0 THEN PSET (x + 158 - .5 * y, y + 30)
NEXT x
NEXT y


L'immagine generata è larga 256 pixels. 158 è la metà della larghezza + 30 (il perché non l'ho capito...!).

Ma comunque. Come potrei trasformare questo programma in C++ (i pixel li tratto come punti: li salvo in un file che poi passo a gnuplot).

Ho pensato a un codice tipo questo:

#include <iostream>
using std::cout;
using std::endl;
using std::ios;

#include <fstream>
using std::ofstream;

int main()
{
ofstream oFile("sierpinsky.txt", ios::out);

for (int x = 0, x < 256, x++)
{
// Non capisco come tradurre il ciclo dal BASIC
{
if (x == 0 and (x - y) == 0)
{
oFile << x + 158 - 0.5 * y << ' ' << y + 30 << endl;
}
}
}

return 0;
}

Ma visto che la y nel programma in BASIC non viene inizializzata come faccio a utilizzarla per un ciclo for in C++? Inoltre dovrei utilizzare le coordinate scritte in modo binario, ma non vedo dove questo avviene nel programma in BASIC...!

Idea di come fare?!

Ncoder
19-01-2011, 22:49
usa dei cicli while ed incrementa la variabile all'interno del ciclo :stordita:
però non ho capito cosa intendi con coordinate in modo binario :fagiano:

Alex'87
19-01-2011, 23:04
Originariamente inviato da RooccoXXI
Ma visto che la y nel programma in BASIC non viene inizializzata come faccio a utilizzarla per un ciclo for in C++? In teoria viene inizializzata a 0 e in C++ devi specificarlo altrimenti ha un valore indefinito. Poi, alla fine di ogni iterazione del ciclo esterno la incrementi di uno.

RooccoXXI
19-01-2011, 23:14
Originariamente inviato da Ncoder
usa dei cicli while ed incrementa la variabile all'interno del ciclo :stordita:
però non ho capito cosa intendi con coordinate in modo binario :fagiano:

Il ciclo FOR in BASIC corrisponde al WHILE in C++?
Perché proprio non riesco a capire l'istruzione

FOR x = 0 TO y
se la y non è inizializzata a qualche valore...!

Comunque i numeri sul triangolo di Pascal possono essere rappresentati da un sistema di coordinate (x,y) se consideriamo come assi le due diagonali esterne del triangolo.

Esempio:
Primo elemento: (0,0) = (0,0)
Secondo elemento sx: (1,0) = (1,0)
Secondo elemento dx: (0,1) = (0,1)
Terzo elemento sx: (2,0) = (10,0)
Terzo elemento c: (1,1) = (1,1)
Terzo elemento dx: (0,2) = (0,10)
e così via...!

E il triangolo viene colorato a seconda del valore binario delle coordinate, facendo così apparire il triangolo di Sierpinsky.

Non so se mi sono spiegato...! È difficile da dire a parole!xD.

RooccoXXI
19-01-2011, 23:45
Originariamente inviato da Alex'87
In teoria viene inizializzata a 0 e in C++ devi specificarlo altrimenti ha un valore indefinito. Poi, alla fine di ogni iterazione del ciclo esterno la incrementi di uno.

Ora ho capito. Il primo ciclo scorre l'immagine in altezza (h = 255 pixel). Il secondo ciclo crea il triangolo (prima un numero, poi due, poi tre, ...).

Dovrebbe essere qualcosa del genere...:

#include <iostream>
using std::cout;
using std::endl;
using std::ios;

#include <fstream>
using std::ofstream;

int main()
{
int y = 0;

ofstream oFile("sierpinsky.txt", ios::out);

for (int x = 0; x < 255; x++)
{
for (int x = 0; x < y; x++)
{
// Condizione if basata sulla rappresentazione binaria delle coordinate
{
oFile << x + 158 - 0.5 * y << ' ' << y + 30 << endl;
}
}

y++;
}

return 0;
}

Però non sono sicuro della doppia dichiarazione. Come sarebbe tradotto "letteralmente" dal BASIC al C++ il programma che ho presentato? (Escluso l'IF e il suo contenuto).

MAnca però da risolvere il secondo problema...quello delle coordinate in binario...!

Alex'87
19-01-2011, 23:46
Originariamente inviato da RooccoXXI
Il ciclo FOR in BASIC corrisponde al WHILE in C++?No. Il for in basic corrisponde al for di C++ (con le dovute modifiche ovviamente).


Originariamente inviato da RooccoXXI Perché proprio non riesco a capire l'istruzione

FOR x = 0 TO y
se la y non è inizializzata a qualche valore...!
y sarà inizializzata a zero! In questo caso la prima volta il ciclo interno non verrà eseguito, la volta dopo verrà eseguito una volta, poi deu poi tre ecc...

Lo vedi quel NEXT y? Io non conosco BASIC ma presumo che voglia dire Y = Y + 1...

Alex'87
19-01-2011, 23:49
Originariamente inviato da RooccoXXI
Ora ho capito. Il primo ciclo scorre l'immagine in altezza (h = 255 pixel). Il secondo ciclo crea il triangolo (prima un numero, poi due, poi tre, ...).

Dovrebbe essere qualcosa del genere...:

#include <iostream>
using std::cout;
using std::endl;
using std::ios;

#include <fstream>
using std::ofstream;

int main()
{
int y = 0;

ofstream oFile("sierpinsky.txt", ios::out);

for (int x = 0; x < 255; x++)
{
for (int x = 0; x < y; x++)
{
// Condizione if basata sulla rappresentazione binaria delle coordinate
{
oFile << x + 158 - 0.5 * y << ' ' << y + 30 << endl;
}
}

y++;
}

return 0;
}

Però non sono sicuro della doppia dichiarazione. Come sarebbe tradotto "letteralmente" dal BASIC al C++ il programma che ho presentato? (Escluso l'IF e il suo contenuto). Occhio che stai incrementando due volte x!

Ad occhio direi una cosa del genere (ma ti ripeto, non conosco il BASIC):


for (int x = 0; x < 255; y++) {
for (x = 0; x < y; x++) {
...
}
}

LeleFT
20-01-2011, 08:59
Il primo FOR in BASIC è sbagliato.
Quello corretto è sicuramente questo:



DEFINT x, y
FOR y = 0 TO 255
FOR x = 0 TO y
IF (x AND (y-x)) = 0 THEN PSET (x + 158 - .5 * y, y + 30)
NEXT x
NEXT y


Altrimenti il NEXT y alla fine andrebbe chiaramente in errore.


Ciao. :ciauz:

RooccoXXI
20-01-2011, 19:08
Originariamente inviato da LeleFT
Il primo FOR in BASIC è sbagliato.
Quello corretto è sicuramente questo:



DEFINT x, y
FOR y = 0 TO 255
FOR x = 0 TO y
IF (x AND (y-x)) = 0 THEN PSET (x + 158 - .5 * y, y + 30)
NEXT x
NEXT y


Altrimenti il NEXT y alla fine andrebbe chiaramente in errore.


Ciao. :ciauz:

Giusto!xD.
L'ho copiato male!

E per le coordinate binarie hai qualche idea?!

Loading