Skip to content

Instantly share code, notes, and snippets.

@pigreco
Created May 6, 2025 08:11
Show Gist options
  • Save pigreco/1d0f6f11459ef39e276dd5b7ce950b1d to your computer and use it in GitHub Desktop.
Save pigreco/1d0f6f11459ef39e276dd5b7ce950b1d to your computer and use it in GitHub Desktop.
Sierpinski Triangle o Sierpinski Gasket
from qgis.core import (
QgsProject,
QgsVectorLayer,
QgsFeature,
QgsGeometry,
QgsPointXY,
QgsFields,
QgsField,
QgsWkbTypes,
QgsVectorDataProvider
)
from PyQt5.QtCore import QVariant
def sierpinski_triangle(p1, p2, p3, depth, layer):
if depth == 0:
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromPolygonXY([[p1, p2, p3, p1]]))
layer.dataProvider().addFeatures([feat])
else:
# Trova i punti medi dei lati
m1 = QgsPointXY((p1.x() + p2.x()) / 2, (p1.y() + p2.y()) / 2)
m2 = QgsPointXY((p2.x() + p3.x()) / 2, (p2.y() + p3.y()) / 2)
m3 = QgsPointXY((p3.x() + p1.x()) / 2, (p3.y() + p1.y()) / 2)
# Chiamate ricorsive
sierpinski_triangle(p1, m1, m3, depth - 1, layer)
sierpinski_triangle(m1, p2, m2, depth - 1, layer)
sierpinski_triangle(m3, m2, p3, depth - 1, layer)
# Crea il layer vettoriale poligonale
vl = QgsVectorLayer("Polygon?crs=EPSG:4326", "Sierpinski", "memory")
pr = vl.dataProvider()
# Aggiungi triangolo iniziale (base grande)
# Triangolo equilatero centrato
p1 = QgsPointXY(0, 0)
p2 = QgsPointXY(10, 0)
p3 = QgsPointXY(5, 8.66) # altezza = (lato * sqrt(3)) / 2
# Profondità della ricorsione (consigliato 4–6 per prestazioni)
depth = 4
# Costruisci i triangoli ricorsivamente
sierpinski_triangle(p1, p2, p3, depth, vl)
# Aggiungi il layer al progetto QGIS
QgsProject.instance().addMapLayer(vl)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment