2007-04-12, 23:37
  #1
Medlem
Biskopsfingers avatar
Jag sitter här och programmerar - i C# nota bene - ett program vars syfte är göra en grafisk illustration av mandelbrotsmängden. Jag trodde att jag hade gjort allt rätt, men när jag startar programmet upptäcker jag att det av någon anledning icke fungerar som tänkt; om någon kunde hjälpa mig att lösa detta problem skulle jag skänka dem en tacksamhetens tanke. Tycker själv att jag letat efter alla tänkbara fel, men hittar inget; jag är alltså själv för begränsad att hitta mitt fel och hoppas att någon mer erfaren kan hjälpa mig på min väg till ett lyckat program.

Såhär ser min kod ut för tillfället:
Kod:
        private void button1_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();

     
                     
            for (int a = 1; a < 600; a=a + 1)
            {
                for (int b = 1; b < 600; b= b + 1)
                {
              
                     double aa  = Convert.ToDouble(textBox1.Text) + (Convert.ToDouble(textBox2.Text) - Convert.ToDouble(textBox1.Text))  * (a / 600);
                     double imaginär = 0;
                     double real = 0;
                     double iteration = 0;
                       double bb  = Convert.ToDouble(textBox3.Text) + (Convert.ToDouble(textBox4.Text) - Convert.ToDouble(textBox3.Text)) * (b / 600);
                       double absolutbelopp = 0;
                   while (iteration < 500 && absolutbelopp < 2)
                   {

                     
                       
                        

                           real = real * real - imaginär*imaginär + aa;
                           imaginär = 2 * real * imaginär + bb;
                           iteration = iteration + 1;
                           absolutbelopp = (real*real) + (imaginär*imaginär);
                           absolutbelopp =Math.Sqrt(absolutbelopp);
                           if (absolutbelopp == 2)
                           {

                               Pen p = new Pen(Color.Yellow);

                               g.DrawRectangle(p,a,b, 1, 1);

                           }
                           if (iteration == 499)
                           {
                               
                               
                                   Pen p = new Pen(Color.Black);
                         
                                   g.DrawRectangle(p,a,b,1,1);
                               

                           }



                             
                         }
                    }
        
                }
                
            }
Citera
2007-04-13, 00:03
  #2
Medlem
Ascents avatar
Kan du beksriva vad det är som händer när det blir fel?

for (int a = 1; a < 600; a=a + 1)
kan förövrigt skrivas om till
for (int a = 1; a < 600; a++)

a++ ökar as värde med 1
Citera
2007-04-13, 00:51
  #3
Medlem
men_vafans avatar
Till att börja med är det ingen höjdare att skriva if(x==2) när x är ett flyttal. I det här fallet vill du antagligen ha < istället för ==.
Citera
2007-04-13, 01:00
  #4
Medlem
RoscoTanners avatar
Citat:
Ursprungligen postat av men_vafan
Till att börja med är det ingen höjdare att skriva if(x==2) när x är ett flyttal. I det här fallet vill du antagligen ha < istället för ==.

Exakt. Dessutom bör du kolla följande rader mycket noga om det verkligen är vad du vill ha. Lite svårt för andra att göra det då du inte gett särskilt utförlig beskrivning om exakt hur du avsett att implementera det hela.

Kod:
real = real * real - imaginär*imaginär + aa;
imaginär = 2 * real * imaginär + bb;
iteration = iteration + 1;
absolutbelopp = (real*real) + (imaginär*imaginär);
absolutbelopp =Math.Sqrt(absolutbelopp);
if (absolutbelopp == 2)

Sedan bör du flytta ut dina allokeringar av Pen:s utanför looparna. Innanför looparna vill du ha så lite onödigt junk som möjligt för att få upp farten.
Citera
2007-04-13, 01:22
  #5
Medlem
Biskopsfingers avatar
Citat:
Ursprungligen postat av men_vafan
Till att börja med är det ingen höjdare att skriva if(x==2) när x är ett flyttal. I det här fallet vill du antagligen ha < istället för ==.
Good point, nu har jag kommit lite närmare ett närmare ett lyckat program. Tyvärr är det fortfarande något som spökar.
Citera
2007-04-13, 01:31
  #6
Medlem
Biskopsfingers avatar
Citat:
Ursprungligen postat av RoscoTanner
Exakt. Dessutom bör du kolla följande rader mycket noga om det verkligen är vad du vill ha. Lite svårt för andra att göra det då du inte gett särskilt utförlig beskrivning om exakt hur du avsett att implementera det hela.

Kod:
real = real * real - imaginär*imaginär + aa;
imaginär = 2 * real * imaginär + bb;
iteration = iteration + 1;
absolutbelopp = (real*real) + (imaginär*imaginär);
absolutbelopp =Math.Sqrt(absolutbelopp);
if (absolutbelopp == 2)

Sedan bör du flytta ut dina allokeringar av Pen:s utanför looparna. Innanför looparna vill du ha så lite onödigt junk som möjligt för att få upp farten.
Min tanke är alltså att skapa en mandelbrotmängd och ovanstående algoritm bör - under förutsättning att jag gjort rätt - leda fram till detta. Mandelbrotsmängden finns beskriven - med algoritm - på: http://sv.wikipedia.org/wiki/Mandelbrotm%C3%A4ngden

Citat:
Ursprungligen postat av RoscoTanner
Sedan bör du flytta ut dina allokeringar av Pen:s utanför looparna. Innanför looparna vill du ha så lite onödigt junk som möjligt för att få upp farten.
Att tänka på, det är emellertid icke det primära problemet.
Citera
2007-04-13, 01:34
  #7
Medlem
Biskopsfingers avatar
Citat:
Ursprungligen postat av Ascent
Kan du beksriva vad det är som händer när det blir fel?
Just nu blir allt gult, av någon anledning blir icke de punkter som utgör mandelbrotmängden svarta.
Citat:
Ursprungligen postat av Ascent
for (int a = 1; a < 600; a=a + 1)
kan förövrigt skrivas om till
for (int a = 1; a < 600; a++)

a++ ökar as värde med 1
Visst, kan man förenkla bör man.
Citera
2007-04-13, 01:52
  #8
Medlem
RoscoTanners avatar
Citat:
Ursprungligen postat av Biskopsfinger
Min tanke är alltså att skapa en mandelbrotmängd och ovanstående algoritm bör - under förutsättning att jag gjort rätt - leda fram till detta. Mandelbrotsmängden finns beskriven - med algoritm - på: http://sv.wikipedia.org/wiki/Mandelbrotm%C3%A4ngden

Kollade lite där och tror att jag hittade felet. När du räknar ut den nya imaginärdelen så använder du den nyligen uträkade realdelen för samma iteration istället för den från den föregående. Skapa istället en temporär variabel där du lagrar det nya realdelsvärdet tills efter att du räknat ut imaginärdelen enligt nedan.

Dessutom så är det bättre att skippa att räkna ut absolutbeloppet och jämföra kvadraten av detsamma mot 4 istället för att snabba upp:

Kod:
double tmp = real * real - imaginär*imaginär + aa;
imaginär = 2 * real * imaginär + bb;
real = tmp;

if ((real*real + imaginär*imaginär) < 4) {
....
Citera
2007-04-13, 02:20
  #9
Medlem
Biskopsfingers avatar
Citat:
Ursprungligen postat av RoscoTanner
Kollade lite där och tror att jag hittade felet. När du räknar ut den nya imaginärdelen så använder du den nyligen uträkade realdelen för samma iteration istället för den från den föregående. Skapa istället en temporär variabel där du lagrar det nya realdelsvärdet tills efter att du räknat ut imaginärdelen enligt nedan.

Dessutom så är det bättre att skippa att räkna ut absolutbeloppet och jämföra kvadraten av detsamma mot 4 istället för att snabba upp:

Kod:
double tmp = real * real - imaginär*imaginär + aa;
imaginär = 2 * real * imaginär + bb;
real = tmp;

if ((real*real + imaginär*imaginär) < 4) {
....
Tack för hjälpen, tyvärr är det nog fortfarande något som är fel. Antingen blir hela svart eller så blir hela gul, beroende på vilken startpunkt man väljer. Kan du se något skäl till detta?
Citera
2007-04-13, 02:28
  #10
Medlem
RoscoTanners avatar
Citat:
Ursprungligen postat av Biskopsfinger
Tack för hjälpen, tyvärr är det nog fortfarande något fel. Antingen blir hela svart eller så blir hela gul, beroende på vilken startpunkt man väljer. Kan du se något skäl till detta?

Du satte dit ökningen av iterationen eller hur? Jag slarvade bort den i min kodsnutt såg jag. Annars är det ju värdena i dina textboxar som styr. På sidan du länkade till så gick de från -2.0 till 2.0 och för att upprepa det så borde dina boxars värden vara:

TextBox1 = -2
TextBox2 = 2
TextBox3 = -2
TextBox4 = 2

Prova att sätta en breakpoint där du sätter aa och bb första gången och se vad som räknas ut så borde det klarna.
Citera
2007-04-13, 02:55
  #11
Medlem
Biskopsfingers avatar
Citat:
Ursprungligen postat av RoscoTanner
Du satte dit ökningen av iterationen eller hur? Jag slarvade bort den i min kodsnutt såg jag.
Ja, den finns med.
Citat:
Ursprungligen postat av RoscoTanner
Annars är det ju värdena i dina textboxar som styr. På sidan du länkade till så gick de från -2.0 till 2.0 och för att upprepa det så borde dina boxars värden vara:

TextBox1 = -2
TextBox2 = 2
TextBox3 = -2
TextBox4 = 2

Prova att sätta en breakpoint där du sätter aa och bb första gången och se vad som räknas ut så borde det klarna.
Jag testade att stoppa in precis de värdena i mina textboxes, allting blir gult och vid kontroll av värdena kommer det ut precis de värden man kan förvänta sig. Eller vänta lite..

Första värdet funkar, sedan ändrar sig aldrig aa och bb.
Citera
2007-04-13, 03:22
  #12
Medlem
Biskopsfingers avatar
Lyckades lösa det själv. Bytte ut 600 mot 600.0

Så nu fungerar det utmärkt, tack för hjälpen med det övriga.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in