2012-11-09 103 views
2

我需要在指定的時間間隔內繪製一個函數。函數爲f1,代碼如下所示,間隔爲[-7,-3]; [-1,1]; [3,7],步長爲.01。當我執行程序時,什麼都沒有畫出來。有任何想法嗎?Python龜圖形,如何在一段時間內繪製函數?

import turtle 
from math import sqrt 

wn = turtle.Screen() 
wn.bgcolor("white") 
wn.title("Plotting") 
mypen = turtle.Turtle() 
mypen.shape("classic") 
mypen.color("black") 
mypen.speed(10) 

while True: 
try: 
    def f1(x): 
     return 2 * sqrt((-abs(abs(x)-1)) * abs(3 - abs(x))/((abs(x)-1)*(3-abs(x)))) * \ 
(1 + abs(abs(x)-3)/(abs(x)-3))*sqrt(1-(x/7)**2)+(5+0.97*(abs(x-0.5)+abs(x+0.5))-\ 
3*(abs(x-0.75)+abs(x+0.75)))*(1+abs(1-abs(x))/(1-abs(x))) 

    mypen.penup() 

    step=.01 
    startf11=-7 
    stopf11=-3 
    startf12=-1 
    stopf12=1 
    startf13=3 
    stopf13=7 
    def f11 (startf11,stopf11,step): 
     rc=[] 
     y = f1(startf11) 
     while y<=stopf11: 
      rc.append(startf11) 
      #y+=step 
      mypen.setpos(f1(startf11)*25,y*25) 
      mypen.dot() 
    def f12 (startf12,stopf12,step): 
     rc=[] 
     y = f1(startf12) 
     while y<=stopf12: 
      rc.append(startf12) 
      #y+=step 
      mypen.setpos(f1(startf12)*25, y*25) 
      mypen.dot() 
    def f13 (startf13,stopf13,step): 
     rc=[] 
     y = f1(startf13) 
     while y<=stopf13: 
      rc.append(startf13) 
      #y+=step 
      mypen.setpos(f1(startf13)*25, y*25) 
      mypen.dot() 

    f11(startf11,stopf11,step) 
    f12(startf12,stopf12,step) 
    f13(startf13,stopf13,step) 

except ZeroDivisionError: 
    continue 
+0

因爲mypen.penup()? – palsch

+1

不,@ palsch,那是不正確的。OP使用'turtle.dot()'來繪製哪個輸出點獨立於筆的向上或向下。 – cdlane

回答

0

我想因爲f1返回一個虛數值。 我從字面上剛開始學習python就像15分鐘前,我開始與烏龜。所以我可能不會完全明白,並且會關閉......但總的來說,我明白代碼...

但是,當你定義它;這一點;你的第二任期。

的sqrt(( - ABS(ABS(X)-1))

你要得到一個負數的平方根這不是笛卡爾平面的數學不知道如何解釋,沒有。想法龜怎麼解釋它,但這是我的第一個猜測......

0

你正在試圖繪製一個使用buggy繪圖代碼的越野車功能,你需要分別調試它們,而不是在一起,讓我們從函數開始。看問題的三個間隔的開始,-7,-1和3,並且對其調用f1(),我們得到:

-7 -> 0.0 
-1 -> division by zero 
3 -> division by zero 

在第一,永遠不會啓動ploting爲f1(startf11)> stopf11又名-3循環開始前:

y = f1(startf11) 
while y <= stopf11: 

在其它兩種情況下,沒有y由於作爲

的被零除
except ZeroDivisionError: 
    continue 

不能解決這個問題。所以沒有陰謀。這可能無關緊要,因爲繪圖代碼本身不起作用。所有這三個f1*功能(這是相同的BTW這是沒有意義的)做的事:

while y <= stop: 

y永遠不會改變所以它是一個無限循環。註釋掉y += step會有所幫助,但代碼中的位置不同。此外,它試圖爲每個單獨的屏幕像素繪製100個值!這可以通過改變座標系來適應,但我不會在這裏進行討論,只需將每個屏幕像素的值減少到10個值就可以加快結果。

讓我們重新開始使用一個簡單的測試功能的繪圖代碼:

def f1(x): 
    return x 

和獲取繪製成功地。這裏是我的繪製代碼的返工:

from turtle import Turtle, Screen 

def f1(x): 
    return x # dummy test plot 

wn = Screen() 

mypen = Turtle(visible=False) 
mypen.speed('fastest') 
mypen.penup() 

def f11(start, stop, step): 

    y = f1(start) 

    while y <= stop: 

     try: 
      mypen.setpos(f1(start) * 25, y * 25) 
      mypen.dot() 
      y += step 

     except ZeroDivisionError: 
      continue 

step = 0.1 # increased from 0.01 for debugging/speed 

startf11 = -7 
stopf11 = -3 

f11(startf11, stopf11, step) 

startf12 = -1 
stopf12 = 1 

f11(startf12, stopf12, step) 

startf13 = 3 
stopf13 = 7 

f11(startf13, stopf13, step) 

wn.exitonclick() 

這讓我們的測試結果:

enter image description here

這似乎合理的爲我們的測試功能。現在,您可以使用工作繪圖儀更改座標系以獲得更高分辨率的繪圖和/或調試您的功能f1()