2010-09-16 12 views
5

कुछ समय के लिए मुझे फ्रैक्टल, उनके पीछे गणित और उनके द्वारा उत्पन्न किए जा सकने वाले दृश्यों में रूचि है।फ्रैक्टल ने

मैं वास्तव में चित्र को खींचने वाले कोड के टुकड़े में गणितीय सूत्र को मानचित्रित करने का तरीका नहीं समझ सकता।
मैंडलब्रॉट सेट के लिए इस सूत्र को देखते हुए: Pc(z) = z * z + c
कैसे कि निम्न कोड की तुलना:

$outer_adder = ($MaxIm - $MinIm)/$Lines; 
$inner_adder = ($MaxRe - $MinRe)/$Cols; 
for($Im = $MinIm; $Im <= $MaxIm; $Im += $outer_adder) 
{ 
    $x=0; 
    for($Re = $MinRe; $Re <= $MaxRe; $Re += $inner_adder) 
    { 
    $zr = $Re; 
    $zi = $Im; 
    for($n = 0; $n < $MaxIter; ++$n) 
    { 
     $a = $zr * $zr; 
     $b = $zi * $zi; 
     if($a + $b > 2) break; 
     $zi = 2 * $zr * $zi + $Im; 
     $zr = $a - $b + $Re; 
    } 
    $n = ($n >= $MaxIter ? $MaxIter - 1 : $n); 
    ImageFilledRectangle($img, $x, $y, $x, $y, $c[$n]); 
    ++$x; 
    } 
    ++$y; 
} 

कोड पूरा नहीं हुआ है, बस संक्षिप्तता के लिए मुख्य यात्रा हिस्सा दिखा।

तो सवाल यह है: क्या कोई मुझे समझा सकता है कि गणित कोड की तुलना कैसे करता है?

संपादित करें: स्पष्ट होने के लिए, मुझे गणित समझाते हुए दर्जनों संसाधन मिल गए हैं, और दर्जनों संसाधन कोड दिखा रहे हैं, लेकिन कहीं भी मुझे दो संयुक्त का अच्छा स्पष्टीकरण नहीं मिल सकता है।

उत्तर

16

अस्वीकरण। मुझे पहले फ्रैक्टल के बारे में कुछ नहीं पता था, लेकिन हमेशा जानना चाहता था, इसलिए मैंने wikipedia article पढ़ा है और मैंने जो पाया है उसे लिखने का फैसला किया है। जैसा कि वे कहते हैं, अगर आप कुछ समझना चाहते हैं, तो इसे किसी और को समझाएं। ;)

ठीक है, हम जटिल संख्याओं पर काम करने जा रहे हैं। एक जटिल संख्या वास्तव में (वास्तविक) संख्याओं की एक जोड़ी है, इसलिए, हमारे लिए php प्रोग्रामर, इसे दो-तत्व सरणी दें।

/// Construct a complex number from two reals 
    function cpl($re, $im) { 
     return array($re, $im); 
    } 

अब हमें PHP को बताना होगा कि हमारे जटिल संख्याओं पर अंकगण कैसे करें। हमें अतिरिक्त, गुणा और मोड ("मानक") ऑपरेटर की आवश्यकता होगी। (अधिक जानकारी के लिए http://mathworld.wolfram.com/topics/ComplexNumbers.html देखें)।

/// Add two complex numbers. 
    function cadd($p, $q) { 
     return cpl(
      $p[0] + $q[0], 
      $p[1] + $q[1]); 
    } 

    /// Multiply two complex numbers. 
    function cmul($p, $q) { 
     return cpl(
      $p[0] * $q[0] - $p[1] * $q[1], 
      $p[0] * $q[1] + $p[1] * $q[0]); 
    } 

    /// Return the norm of the complex number. 
    function cmod($p) { 
     return sqrt($p[0] * $p[0] + $p[1] * $p[1]); 
    } 

अब हम एक समारोह है कि सच रिटर्न बारे में दिए गए (जटिल) बिंदु $ ग मैंडलब्रॉट सेट अंतर्गत आता है अगर

एक बिंदु c साथ चक्र के अंदर सेट के अंतर्गत आता है सभी बिंदुओं अगर z = z^2 + c झूठ त्रिज्या 2.

  • हम जटिल संख्या z = (0, 0) से शुरू करते हैं।
  • प्रत्येक चरण पर हम z = z * z + c की गणना करते हैं।
  • यदि modulus of z> 2 - यानी, हम सर्कल से बाहर हैं - बिंदु सेट
  • अन्यथा चरण को दोहराएं।

अंतहीन रूप से लूपिंग से रोकने के लिए, पुनरावृत्तियों की अधिकतम संख्या को सीमित करें।

function is_in_mandelbrot_set($c, $iterations) { 
     $z = cpl(0, 0); 
     do { 
      if(cmod($z) >= 2) 
       return false; 
      $z = cadd(cmul($z, $z), $c); 
     } while($iterations--); 
     return true; 
    } 

बाकी गणित के साथ कोई संबंध नहीं है और काफी स्पष्ट है

function mandelbrot($img, $w, $h) { 
     $color = imagecolorallocate($img, 0xFF, 0, 0); 
     $zoom = 50; 
     $iters = 30; 

     for($x = 0; $x < $w; $x++) { 
      for($y = 0; $y < $h; $y++) { 

       // scale our integer points 
       // to be small real numbers around 0 

       $px = ($x - $w/2)/$zoom; 
       $py = ($y - $h/2)/$zoom; 

       $c = cpl($px, $py); 

       if(is_in_mandelbrot_set($c, $iters)) 
        imagesetpixel($img, $x, $y, $color); 
      } 
     } 

     return $img; 
    } 

    $w = 200; 
    $h = 200; 

    header("Content-type: image/png"); 
    imagepng(
     mandelbrot(
      imagecreatetruecolor($w, $h), $w, $h)); 

परिणाम

alt text

बेशक

, इस कोड को चरम पर अप्रभावी है। इसका एकमात्र उद्देश्य गणित अवधारणा को समझना है।

+1

वाह, इस महान उत्तर के लिए धन्यवाद! मैं आज रात वापस आऊंगा जब मेरे पास वास्तव में जो कुछ लिखा है उसे समझने और समझने के लिए और अधिक समय है :) –

संबंधित मुद्दे