Wie kann ich einen Zylinder darstellen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
significant
User
Beiträge: 3
Registriert: Samstag 8. Juli 2006, 14:22

Samstag 8. Juli 2006, 14:35

Ich möchte ein Zylinder mit Python zeichnen und darstellen. Als interpreter benutze ich zaMA.
Ich weiss, dass zu diesem Thema ein thead existiert, nur ist die vorgeschlagene Lösung verbunden mit vPython. Ich suche eine andere Lösung.

Folgendes Skript funktioniert, es stellt einen Quader dar. Ich möchte nun ein Zylinder nach gleichem Prinzip darstellen. Hat mir jemand eine gute Quelle, ein Script oder einen Vorschlag?

Vielen Dank für eure Hilfe!

Code: Alles auswählen

from zaMa import *

rotiere = 0
vWinkel = 90
hWinkel = 0

def drawCube(side):
	
	# halbe seitenlaenge => ursprung in der mitte
	s = side/2.
	
	# ecken analog zu modell oben
	c = [
	[-s,-s,s],
	[-s,-s,-s],
	[-s,s,s],
	[-s,s,-s],
	[s,-s,s],
	[s,-s,-s],
	[s,s,s],
	[s,s,-s]
	]
	
	# seiten zeichnen
	Polygon([c[0],c[1],c[3],c[2]])
	Polygon([c[4],c[5],c[7],c[6]])
	Polygon([c[0],c[4],c[6],c[2]])
	Polygon([c[1],c[5],c[7],c[3]])
	Polygon([c[2],c[6],c[7],c[3]])
	Polygon([c[0],c[4],c[5],c[1]])
	
	SetColor([0,0,0])
	
	# kanten zeichnen
	#SetColor([0,0,0])
	#SetLineSize(3)
	#Lines([c[0],c[1],c[3],c[2]])
	#Lines([c[4],c[5],c[7],c[6]])
	#Lines([c[0],c[4],c[6],c[2]])
	#Lines([c[1],c[5],c[7],c[3]])
	#Lines([c[2],c[6],c[7],c[3]])
	#Lines([c[0],c[4],c[5],c[1]])
	        
def OnDraw():
    Translate(GetWindowWidth()*.5,GetWindowHeight()*.5)
    
    Rotate(hWinkel,[0,1,0])
    Rotate(vWinkel,[1,0,0])
    
    drawCube(100)
    
    SetBackgroundColor(1,1,1)
    
def OnMouseButtonDown(x,y,button):
	global rotiere
	
	if(button == MOUSE.LBUTTON):
		rotiere = 1

def OnMouseButtonUp(x,y,button):
	global rotiere
	
	if(button == MOUSE.LBUTTON):
		rotiere = 0
   
def OnMouseMotion(x,y):
	global hWinkel,vWinkel,rotiere
	
	if rotiere == 1:
		hWinkel = 360./GetWindowWidth() * (x) -180;
		vWinkel = -180./GetWindowHeight() * (y-GetWindowHeight());
		#print(hWinkel,vWinkel)
		Redraw()

def OnResize(w,h):
	Redraw()

SetupEnvironment("Farbsystem",800,800, ENV.WINDOW)
StartEnviroment()
significant
User
Beiträge: 3
Registriert: Samstag 8. Juli 2006, 14:22

Samstag 8. Juli 2006, 15:49

Ich habe es beim folgenden Script mal mit Kreisen als Platzhaltern versucht. Diese möchte ich mit den Zylindern ersetzen. Kann mir wirklich niemand weiterhelfen?

Ich habe noch ein zweites Problem: Kann mir jemand sagen, wieso bei diesem Skript die Rotationsfunktion (Wechsel der "Kameraposition) nicht funktioniert, beim "Cube-Skript" oben aber schon?

Code: Alles auswählen

from zaMa import *

rotiere = 0
vWinkel = 90
hWinkel = 0

circle = None

def OnInit():
      global circle
      circle = CreateFaceCircle(3,16)

def drawCircles():
    SetColor([0,0,0])
    h = 0
    for xPosition in range(61):
        yPositionList = [
        0,
        10,
        0,
        10,
        0,
        10,
        0,
        10,
        0,
        10,
        0,
        0,
        0,
        0,
        10,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        10,
        0,
        10,
        0,
        10,
        0,
        10,
        0,
        10,
        10,
        20,
        10,
        10,
        20,
        10,
        20,
        10,
        0,
        10,
        0,
        0,
        0,
        -10,
        0,
        -10,
        0,
        -10,
        0,
        0,
        -10,
        0,
        0,
        -10,
        0,
        0,
        0
        ]
        Translate(10,yPositionList[h],0)
        SavePos()
        for yPosition in range(31):
            Polygon(circle)
            Translate(0,10,0)
        RestorePos()
        h = h+1

def OnDraw():
    Translate(GetWindowWidth()*.5-300,GetWindowHeight()*.5-300)
    
    drawCircles()
    
    Rotate(hWinkel,[0,1,0])
    Rotate(vWinkel,[1,0,0])
    
    SetBackgroundColor(0.9,0.9,0.9)
    
def OnMouseButtonDown(x,y,button):
	global rotiere
	
	if(button == MOUSE.LBUTTON):
		rotiere = 1

def OnMouseButtonUp(x,y,button):
	global rotiere
	
	if(button == MOUSE.LBUTTON):
		rotiere = 0
   
def OnMouseMotion(x,y):
	global hWinkel,vWinkel,rotiere
	
	if rotiere == 1:
		hWinkel = 360./GetWindowWidth() * (x) -180;
		vWinkel = -180./GetWindowHeight() * (y-GetWindowHeight());
		#print(hWinkel,vWinkel)
		Redraw()

def OnResize(w,h):
	Redraw()

SetupEnvironment("3D Farbsystem",800,800, ENV.WINDOW)
StartEnviroment()
significant
User
Beiträge: 3
Registriert: Samstag 8. Juli 2006, 14:22

Samstag 8. Juli 2006, 17:05

Oder kann mir jemand sagen, welche Möglichkeiten ich habe?

Ich wäre sehr, sehr dankbar.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Samstag 8. Juli 2006, 21:12

ich verstehe nicht so ganz das Problem.
Wenn du einen Cylinder Zeichnen willst, musst du nur die Funktion "drawCube" anpassen.
Die zeichnet zZ 8 Vierecke.

Ein (genäherter) Zylinder wären (als Hülle) n Vierecke, und als Deckel und Boden ein n-eck. Die vierecke berühren jeweils 2 Punkte des unteren und des oberen Deckels.
Die Punkte der Deckel lassen sich mit Sinus/Cosinus errechnen:

deg = (n / nMax) * 2 Pi
x = cos(deg)
y = sin(deg)

n ist die nummer des Punktes, nMax die Anzahl der Punkte, x,y die Koordinaten des errechneten Punktes.

Nagel mich nicht drauf fest, da könnten Vorzeichenfehler oder sin/cos-Verwechselungen drin sein.

Wenn du so Punkte für zwei Kreise (die Deckel) gebaut hast, zeichnest damit die Deckel, (Polygon mit allen Punkten des Kreises) und die Vierecke (Viereck mit 2 punkten aus dem oberen Kreis und zwei punkten aus dem unteren Kreis).
Antworten