import rhinoscriptsyntax as rs import random as ran rs.EnableRedraw(False) rs.DeleteObjects(rs.AllObjects()) def create_oktaeder(): """Erstellt ein Oktaeder (8 gleichseitige Dreiecke) mit Ursprung auf z=20.""" z_offset = 20 # Verschiebung des Ursprungs auf der z-Achse scale_factor = 4.5 # Skalierungsfaktor für die Größe des Oktaeders vertices = [ (1 * scale_factor, 0 * scale_factor, 0 * scale_factor + z_offset), (-1 * scale_factor, 0 * scale_factor, 0 * scale_factor + z_offset), (0 * scale_factor, 1 * scale_factor, 0 * scale_factor + z_offset), (0 * scale_factor, -1 * scale_factor, 0 * scale_factor + z_offset), (0 * scale_factor, 0 * scale_factor, 1 * scale_factor + z_offset), (0 * scale_factor, 0 * scale_factor, -1 * scale_factor + z_offset) ] faces = [ [0, 2, 4], [2, 1, 4], [1, 3, 4], [3, 0, 4], [0, 5, 2], [2, 5, 1], [1, 5, 3], [3, 5, 0] ] return vertices, faces def add_spike_to_face(vertices, face, spike_length): """Fügt eine Zacke zu einer gegebenen Fläche des Oktaeders hinzu und erstellt ein echtes Volumen.""" pts = [vertices[i] for i in face] center = rs.PointAdd(rs.PointAdd(pts[0], pts[1]), pts[2]) center = rs.PointDivide(center, 3) new_center = (0, 0, 20) # Ersetze x, y, z durch die gewünschten Koordinaten normal = rs.VectorCreate(center, new_center) normal = rs.VectorUnitize(normal) spike_tip = rs.PointAdd(center, rs.VectorScale(normal, spike_length)) # Erstelle die Dreiecke der Zacken base_curve = rs.AddPolyline(pts + [pts[0]]) # Die Basis der Zacke tip_curve = [spike_tip] # Spitze als Punkt (keine Kurve mehr) # Erstelle die Flächen, die die Zacken als Volumen definieren faces = [] for i in range(len(pts)): pt1 = pts[i] pt2 = pts[(i+1) % len(pts)] # Nächstes Punkt der Basis face = rs.AddSrfPt([pt1, pt2, spike_tip]) # Erstelle die Fläche für jedes Dreieck faces.append(face) # Entferne die Basis, da sie jetzt nicht mehr benötigt wird rs.DeleteObject(base_curve) # Erstelle die Flächen für die Zacken und füge sie zusammen star_surface = rs.JoinSurfaces(faces, delete_input=True) return star_surface def main(): spike_length = 11 # Fixierte Länge der Zacke vertices, faces = create_oktaeder() for face_index in range(8): add_spike_to_face(vertices, faces[face_index], spike_length) # Erstellen von Turm ci=rs.AddCircle((0,0,20),3) ci2=rs.AddCircle((0,0,0),5) pt=rs.DivideCurve(ci,13) pt2=rs.DivideCurve(ci2,13) lines=[] li=rs.AddLine(pt[0],pt2[4]) for i in range(13): lines.append(rs.RotateObject(li,(0,0,0),360/12*i, copy=True)) rs.AddLoftSrf((lines[1],lines[2])) rs.AddLoftSrf((lines[3],lines[4])) rs.AddLoftSrf((lines[5],lines[6])) rs.AddLoftSrf((lines[7],lines[8])) rs.AddLoftSrf((lines[7],lines[8])) rs.AddLoftSrf((lines[9],lines[10])) rs.AddLoftSrf((lines[11],lines[12])) lines2=[] li2=rs.AddLine(pt[4],pt2[0]) for i in range(13): lines2.append(rs.RotateObject(li2,(0,0,0),360/13*i, copy=True)) rs.AddLoftSrf((lines2[0],lines2[0])) rs.AddLoftSrf((lines2[2],lines2[1])) rs.AddLoftSrf((lines2[4],lines2[3])) rs.AddLoftSrf((lines2[6],lines2[5])) rs.AddLoftSrf((lines2[8],lines2[7])) rs.AddLoftSrf((lines2[10],lines2[9])) rs.AddLoftSrf((lines2[12],lines2[11])) rs.EnableRedraw(True) if __name__ == "__main__": main()