Giter VIP home page Giter VIP logo

python-fractal-landscape's Introduction

Python Fractal Mountain Landscape

I watched the Nova documentary "Fractals - Hunting the Hidden Dimension" on Youtube, and was interested in the story of a computer graphics engineer at Boeing, Loren Carpenter, who created the first computer-generated mountain landscapes. He did this after reading Benoit Mandelbrot's book about fractals, and created the landscapes by diving them into progressively smaller triangles. I tried out the idea with a small Python script.

To set up an easy coordinate system, I used squares split diagonally into right-angle triangles, which could be split into smaller right-angle triangles with random elevations. That's somewhat imperfect but is enough to test the idea. I used the "Mayavi" Python library for 3D visualisation (since it was in the Ubuntu repository) to display the result.

All with just 20 lines of Python.

Python Fractal Landscape

The image shown was generated with "random.seed(6)" added. Rotation, zoom and background colour were set interactively in the Mayavi visualizer.

The Python code was dashed out as a quick test, so the method of finding the correct corner points in the correct order is not very readable. Sorry about that. After writing this test, I Googled for the algorithms usually used in fractal landscape generation and found out about the fractal terrain "diamond square algorithm", so if you want to know more about this subject, then I suggest you do the same.

python-fractal-landscape's People

Contributors

dafarry avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

python-fractal-landscape's Issues

Submit this to the Mayavi gallery

This is a really nice example, do you mind contributing this as an example to Mayavi, or would you mind if I added it, with due credit of course?

topography not isotropic

If you draw the scene in an image or with contour lines, it appears that there is a predominantly 45 degree (lower left to top right) mountain range preference. I would expect that there should be no preference for any consistent mountain range orientation, I rather expect fully random mountains pointing in all directions. I suspect there is an index alignment error or increment error between x and y.

Your code is very dense and I do not have the time now to find the bug.
image

Comments

Hey,

I'm really interesting to understand your code but it has no comments.
I was wondering if you could explain me quickly the purpose of the variables jumpover, step and pointer ?

code readibility improvements and minor fixes

i stumbled on your project when i was looking for a short code example of a fractal landscape, and while figuring it out i refractored a bit. my changes include:

  • fixing the 45 degree anisotropy
  • changing the plotting library to the more common matplotlib
  • cleaning up some of the cryptic xref/yref computation

if you like the code, feel free to merge it.

import numpy as np
import matplotlib.pyplot as plt
 
levels = 10
size = 2**levels + 1
height = np.zeros((size, size))

for level in range(1, levels + 1):
    step = 2**(levels - level)
    for y in range(0, size, step):
        yjumpover = (1 + y // step) % 2  # are we in a previously visited row?
        for x in range(step * yjumpover, size, step * (1 + yjumpover)):
            xjumpover = (1 + x // step) % 2  # [...] column?
            xref, yref = step * (1 - xjumpover), step * (1 - yjumpover)
            average = height[y-yref:y+yref+1:2*step, x-xref:x+xref+1:2*step].mean()
            variation = 2**(-level) * np.random.uniform(-1, 1)
            height[y, x] = average + variation

xg, yg = np.mgrid[-1:1:1j*size, -1:1:1j*size]

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.plot_surface(xg, yg, height, cmap='gist_earth', linewidth=0, antialiased=False)
ax.set_facecolor('skyblue'), ax.axis('off')
plt.show()

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.