Lo spazio, le curve e le geometrie

Come dire: la vita l'universo e tutto quanto
o per meglio dire: se Pi greco fosse differente da 3.14 non saremmo in un universo euclideo
io, per me, oggi c'era il sole e mi son gardato tante di quelle curve che se PI greco anche valesse 6 mi starebbe bene lo stesso, ma per rispondere a questo qui: Pi greco - Software - Arduino Forum
come vedete avevo promesso che ci pensavo, orca l'oca se ci ho pensato alle cose tonde....
vabbe, siccome abbiamo a che fare con una geometria bi-dimensionale (per il momento) ho pensato di crearmi un tipodati complesso, nel senso matematico del termine: parte reale e parte immaginaria
OT oqquanto ho immaginato oggi ......... fine OT
quindi mi sono scritto questo:

// di Nelson "StandardOil"
// Idea da sviluppare:
// capire il valore di PI greco per
// dimostrare se lo spazio è piano o curvo

// definisco il tipo dati Coordinata
typedef struct
{
    float X;
    float Y;
} Coordinata;


// dichiaro le variabili
Coordinata punto; // punto attuale in trattamento
unsigned int long contatore; // totale dei punti contati
unsigned int long interni; // totale dei punti interni al cerchio

che come vedete definisce un tipo dati complesso
e poi devo poter generare un punto random
userò una funzione che mi restituisce quanto necessario

Coordinata genera(void)
{
    // una funzione che genera un punto (insieme di coordinate) casuale
    static int seme = 0;

    if (!seme)
    {
        seme = analogRead(A0);
        randomSeed(seme);
        // genero il seme solo la prima volta
    }

    Coordinata generato;
    generato.X = 0;
    generato.Y = 0;

    // per 6 cifre significative (oltre non serve)
    for (byte i = 0; i < 6; i++)
    {
        generato.X = generato.X / 10 + random(10);
        // ogni singola cifra delle sei significative è casuale tra 0 e 9 (10 non viene generato)
        generato.Y = generato.Y / 10 + random(10);
    }

    generato.X = generato.X / 10;
    generato.Y = generato.Y / 10;
    return generato;
}

che come vedete genera le due coordinate a 6 cifre significative, genera direttamente le cifre, per "nascondere" meglio il fatto che la generazione dei numeri casuale NON arriva fino al parametro passato: random(10) NON restituirà mai 10, ma al massimo 9
questa cosa, se non tenuta in considerazione altererebbe la casualità della generazione, inoltre inizializzo il generatore di numeri casuali una volta sola, e restituisco la variabile del tipo complesso che mi serve
anche per sapere se un punto è oppure no nel quarto di cerchio ho usato una funzione, che accetta una variabile complessa e restituisce un bool

bool compreso(Coordinata punto)
{
    {
        // ritorna true se il punto passato è interno al quarto di cerchio centrato in 0,0 e raggio 1
        return ((punto.X * punto.X + punto.Y * punto.Y) <= 1);
        // lo so forse non servivano tutte queste parentesi
    }
}

banale, vero? ma pur se banali le cose vanno fatte.........
a questo punto la loop

void loop(void)
{
    do
    {
        ;
        Serial.print("Dopo: ");
        Serial.print(++contatore);
        Serial.print(" tentativi il valore calcolato è:");
        Serial.println(4.0  / contatore * (interni = interni + compreso(genera())), 5);
    }
    while (contatore > 0);
}

che è praticamente tutta stampe,
ahhhh il bello del C........: la concisione
la funzione genera() genera un punto, passato alla compreso(), che restituice 0 o 1, che viene sommato al totalizzatore, durante il calcolo propedeutico alla stampa
manca naturalmente la setup, ma è banale banale, quasi una noia

void setup(void)
{
    Serial.begin(9600);
    Serial.println("Programma per la ricerca sperimentale del valore di PI greco");
    Serial.println("Se il valore al termine delle iterazioni fosse diverso da 3.141592654");
    Serial.println("Potremmo sospettare di vivere in un universo Non-Euclideo");
}

ora ho un problma grave: nel tempo che ci ho messo a scrivere questo post il mio arduino mi ha calcolato PI: vale 3.15092, quindi la curvatura dell'universo è in trasfomazione
devo correre a sorvegliare quelle curve di prima, scusate se mi assento

Standardoil:
... se Pi greco fosse differente da 3.14 ...

Qui da me vale 3 (se sei fermo ... se ti muovi aumenta con una curva inversamente proporzionale al quadrato della velocita' ... ma del resto qui da noi anche la luce ha velocita' differenti secondo la lunghezza d'onda, quindi non c'e' nulla di strano ... :D)

Battute a parte (che faccio solo perche' questo thread sembra piu una discussione per divertirsi, che una cosa seria, ma se preferisci basta dirlo e smetto subito), se il programma va per approssimazioni successive, probabilmente per avvicinarsi al valore reale servono molti piu dati ... il che porta pero' ad una domanda logica, suppongo: se l'approssimazione si avvicina al dato reale solo con sempre piu punti, non e' che si finisce che per trovare il dato reale serve un numero infinito di punti ?

bravo, azzeccato........

infatti Pi greco è un numero infinito

domanda:
why... pecché?

bool compreso(Coordinata punto)
{
    {

anzi due

void loop(void) {
   do {
      ;

:smiley: letto ora il commento alla prima :smiley:
però erano riferite al return

Per Patrick_M
si tratta di due errori miei
le doppie parentesi graffe,
e il punto e virgola
ho semplicemente dimenticato di cancellarli, durante la revisione del codice
PI greco non è solo infinito, anche 2/3 lo e'
PI greco è anche irrazionale
che letteralmente significa che non si puo' ottenere coe rapporto tra due interi, ma piu' sottilmente significa che le sue cifre, la sequenza delle sue cifre, è casuale, non si puo' prevedere in alcun modo
in effetti sarebbe un bell'esempio di generatore di numeri casuali, se non fosse che li conosciamo già
per il metademone:
ma certo che scherzo, ma nemmeno troppo in realtà
mi sono preso un'oretta per fare una cosa della quale si è parlato molto, ma fatto nulla
e spero di essere stato capace di mostrare un punto di vista alternativo al solito
tra typedef, struct e funzioni incistate spero di aver smosso abbastanza le acque
lo scherzo reale è questo, in poco e senza parere si possono fare cose "più grandi di quello che sembra"

Dopo: 173765 tentativi il valore calcolato è:3.1425 :smiley: lunghetto il calcolo

Grande Standardoil. Ottima interpretazione e molto istruttivo anche dal punto di vista del codice. raro leggere cose del genere qui che si parla sempre di millis(), io ho iniziato a metterci mano da un po di tempo a questa parte con le struct (un paio di guide pdf con esempi veramente ben fatte)... sono strumenti potenti e allo stesso tempo abbastanza semplici da gestire... ma usati quasi mai....

PS: millis() centra sempre e comunque :smiley:

Benissimo, +1
Molto interessante, appunto, da un punto di vista didattico.
Da notare che la scelta di usare raggio = 1 ha evitato il calcolo della radice quadrata.
Didatticamente utile l'uso della static, ma il seed si potrebbe generare nel setup.

Probabilmente stai aspettando che qualcuno ti chieda dove sono i numeri complessi, visto che la struttura che hai usato è un elemento di R^2. Aspettiamo, qualcuno lo chiederà :grin:

Grazie, te ne sono riconoscente
Tra. Le altre cose, ieri ero un po' preso, e non ho terminato di rivedere il codice, ho dimensionato una variabile complessa senza poi usarla
Quindi ho fatto anche un esempio di uso di tipi di dati "strani" senza usare le corrispondenti variabili, se uno non guarda dentro alle funzioni non si accorge del tipo dati, interessante, ci penso un po', ho idee....

Però se usi come prodotto:

(x1 , y1) * (x2 , y2)   =   (x1 * x2 - y1 * y2  ,  x1 * y2 +  y1 * x2)

hai definito elementi di C mediante elementi di R^2

hai anche i^2 = -1

(0 , 1) ^ 2 = (0,1)*(0,1) = (-1,0) = - (1,0)

miky_police puoi mettere i link dei pdf per le struct di cui parli??
Sono molto interessato ad approfondire l'argomento...
Grazie.

se non ricordo male 3 oppure multilpli di 3 ad esempio 12 ...si usano sopra lo zero.
sotto lo zero ricordo che si usa il 4 oppure multilpli di 4 ad esempio 16

non ricordo il motivo ma mi è rimasta impressa questa cosa.

Puso:
se non ricordo male 3 oppure multilpli di 3 ad esempio 12 ...si usano sopra lo zero.
sotto lo zero ricordo che si usa il 4 oppure multilpli di 4 ad esempio 16

:o

Ma si usano dove? Per cosa?