2016-12-09 2 views
0

Ich versuche, durch diese Vesica Piscis Form zu arbeiten, die hat mich verwirrt. Ich probierte verschiedene Methoden aus, wie Objekte nach Code-Reihenfolge gezeichnet werden, und ich habe auch versucht, die Kreise in Weiß gefüllt zu bekommen, aber wir können nicht nur einen Abschnitt des Kreises gefärbt haben.Vesica Piscis Form in Graphics.py

Ab jetzt bin ich stecken in was soll ich versuchen und das ist warum ich mich für Vorschläge öffnen.

Ich sage, dass, was ich zu erreichen versuche, haben einen Leerraum halten alle Linien, innerhalb der Kreuzung der beiden Kreise bilden die Form Vesica Piscis.

This is what i've done so far.

from graphics import * 

def canvas(): 

    win = GraphWin("Patch", 100, 100) 

    for i in range(10): 

     lineSet1 = Line(Point(0, 0), Point((i+1)*10, 100)) 
     lineSet1.draw(win) 

     lineSet2 = Line(Point(0, 0), Point(100, (i+1)*10)) 
     lineSet2.draw(win) 

     lineSet3 = Line(Point(100,100), Point(0, 100-(i+1)*10)) 
     lineSet3.draw(win) 

     lineSet4 = Line(Point(100,100), Point(100-(i+1)*10, 0)) 
     lineSet4.draw(win) 

    circle1 = Circle(Point(0, 100), 100) 
    circle1.setOutline("red") 
    circle1.draw(win) 

    circle2 = Circle(Point(100, 0), 100) 
    circle2.setOutline("blue") 
    circle2.draw(win) 
+0

was 'Vesica Piscis shape'? Fügen Sie einen Link zu einer Beschreibung und einem Bild hinzu. – furas

Antwort

0

Graphics Verwendung Tkinter im Hintergrund, die mehr nützliche Funktionen.

Es kann arc, chord, pie zeichnen.

Tkinter: Canvas und more

from graphics import * 

# --- constants --- 

WIDTH = 300 
HEIGHT = 300 

# --- main ---- 

win = GraphWin("Patch", WIDTH, HEIGHT) 

bbox = (5, 5, WIDTH-5, HEIGHT-5) 

win.create_arc(bbox, fill="red", outline='green', width=3, start=0, extent=90, style='arc') 
win.create_arc(bbox, fill="red", outline='green', width=3, start=95, extent=90, style='chord') 
win.create_arc(bbox, fill="red", outline='green', width=3, start=190, extent=90, style='pieslice') 

# --- wait for mouse click --- 

#win.getKey() 
win.getMouse() 

win.close() 

enter image description here


BTW:win.after(miliseconds, function_name) unter Verwendung periodisch Funktion auszuführen, die Objekte bewegt.

from graphics import * 

# --- constants --- 

WIDTH = 300 
HEIGHT = 300 

# --- functions --- 

def moves(): 

    # move figure 1  
    s = win.itemcget(fig1, 'start')  # get option 
    win.itemconfig(fig1, start=float(s)+5) # set option 

    # move figure 2 
    s = win.itemcget(fig2, 'start') 
    win.itemconfig(fig2, start=float(s)+5) 

    # move figure 3 
    s = win.itemcget(fig3, 'start') 
    win.itemconfig(fig3, start=float(s)+5) 

    # run again after 100ms (0.1s) 
    win.after(100, moves) 

# --- main ---- 

win = GraphWin("Patch", WIDTH, HEIGHT) 

bbox = (5, 5, WIDTH-5, HEIGHT-5) 

fig1 = win.create_arc(bbox, fill="red", outline='green', width=3, start=0, extent=90, style='arc') 
fig2 = win.create_arc(bbox, fill="red", outline='green', width=3, start=95, extent=90, style='chord') 
fig3 = win.create_arc(bbox, fill="red", outline='green', width=3, start=190, extent=90, style='pieslice') 

# run first time 
moves() 

#win.getKey() 
win.getMouse() 

win.close() 

EDIT:

from graphics import * 

# --- constants --- 

WIDTH = 300 
HEIGHT = 300 

# --- main ---- 

win = GraphWin("Patch", WIDTH, HEIGHT) 

win.create_arc((0, -75, 300, 300-75), fill="blue", outline="blue", extent=120, style='chord', start=30+180) 
win.create_arc((0, 75, 300, 300+75), fill="blue", outline="blue", extent=120, style='chord', start=30) 

win.create_oval((100, 100, 200, 200), fill="white", outline="white") 
win.create_oval((130, 130, 170, 170), fill="black", outline="black") 

#win.getKey() 
win.getMouse() 

win.close() 

enter image description here

0

halten alle Linien innerhalb der Schnittpunkt der beiden Kreise die Vesica Piscis bildenden Form

Nach mehreren Lesungen Ihrer Frage und Studium der Figur, ich glaube, ich verstehe, was Sie wollen. Die Lösung hat nichts mit den zugrundeliegenden Grafikobjekten, sondern mit Mathematik zu tun. Wir müssen herausfinden, wo die Sekanten die Kreise schneiden, um sie in Akkorde zu machen:

from graphics import * 

def intersection(center, radius, p1, p2): 

    dx, dy = p2.x - p1.x, p2.y - p1.y 

    a = dx**2 + dy**2 
    b = 2 * (dx * (p1.x - center.x) + dy * (p1.y - center.y)) 
    c = (p1.x - center.x)**2 + (p1.y - center.y)**2 - radius**2 

    discriminant = b**2 - 4 * a * c 
    assert (discriminant > 0), 'Not a secant!' 

    t = (-b + discriminant**0.5)/(2 * a) 

    x = dx * t + p1.x 
    y = dy * t + p1.y 

    return Point(x, y) 

def canvas(win): 
    radius = 100 

    center = Point(0, 100) # Red circle 

    circle = Circle(center, radius) 
    circle.setOutline('red') 
    circle.draw(win) 

    for i in range(1, 10 + 1): 

     p1 = Point(0, 0) 
     p2 = Point(100, i * 10) 
     p3 = intersection(center, radius, p1, p2) 

     Line(p1, p3).draw(win) 

     p1 = Point(100, 100) 
     p2 = Point(100 - i * 10, 0) 
     p3 = intersection(center, radius, p1, p2) 

     Line(p1, p3).draw(win) 

    center = Point(100, 0) # Blue circle 

    circle = Circle(center, radius) 
    circle.setOutline('blue') 
    circle.draw(win) 

    for i in range(1, 10 + 1): 

     p1 = Point(0, 0) 
     p2 = Point(i * 10, 100) 
     p3 = intersection(center, radius, p1, p2) 

     Line(p1, p3).draw(win) 

     p1 = Point(100, 100) 
     p2 = Point(0, 100 - i * 10) 
     p3 = intersection(center, radius, p1, p2) 

     Line(p1, p3).draw(win) 

win = GraphWin('Patch', 100, 100) 

canvas(win) 

win.getMouse() 

Die Mathematik wahrscheinlich vereinfacht werden kann, aber ich habe es geschrieben, da dies nicht etwas, das ich mit oft arbeiten.

OUTPUT

enter image description here