2017-06-24 31 views
4

私のコードはここで動作しますが、私の現在の方法は非常に非効率的で時間がかかります。私は4つのデカルト座標を生成し、それらをリストに追加しています。次に、4つのPsychopy線オブジェクト(visual.Line)を作成し、各オブジェクトに座標リスト(zdot_list)からx、y座標を割り当てます。現在、私は4つの線オブジェクトを1つずつ作成し、それぞれの '開始'パラメータにxy位置を割り当てています。Psychopy:同時に複数のラインオブジェクトを作成する

from psychopy import visual, core, event, sound 
import random 
import math 

win = visual.Window([800,600],color=(0,0,0), colorSpace='rgb', rgb=None, allowGUI=True, monitor='testMonitor', units='deg', fullscr=True, screen=2) 

# input polar, output cartesian coords 
def pol_to_cart(distance, angle, x_origin=0, y_origin=0): 

    x=distance*math.cos(math.radians(angle)) 
    y=distance*math.sin(math.radians(angle)) 

    return x +x_origin, y + y_origin 


zdots = 4 
zdot_list = [] 
j=(-8) 

# generate 4 xy coordinates and append to list 
for i in range(zdots): 

    angle=0 

    line_cart = pol_to_cart(j, angle) 
    dotx = line_cart[0] 
    doty = line_cart[1] 
    zdot_list.append([dotx, doty]) 

    j += .2 

# generate 4 lines, add xy coordinate (from list^) to 'start' argument of each 
linea = visual.Line(win, start=(zdot_list[0]), end=(4,0), lineColor="white") 
lineb = visual.Line(win, start=(zdot_list[1]), end=(4,0), lineColor="white") 
linec = visual.Line(win, start=(zdot_list[2]), end=(4,0), lineColor="white") 
lined = visual.Line(win, start=(zdot_list[3]), end=(4,0), lineColor="white") 

lines = [linea, lineb, linec, lined] 

# display lines 
for line in lines: 
    line.draw() 
    win.flip() 
    core.wait(3) 
    win.close() 

ループを使用して線(または任意の形状)オブジェクトを作成する効率的な方法はありますか?私は必要なオブジェクトを自動生成し、それぞれのオブジェクトの 'start'引数にxy座標を追加したいと思います。画像には4つの線オブジェクトしかありませんが、実際にはそれぞれが異なるxy開始座標を持つ80以上が必要です。

乾杯、 ジョン

答えて

3

あなたがしようとすると、視覚モジュールからポリゴンを探索することができます。

from psychopy import visual, core, event, sound 
win = visual.Window([680,480],color=(0,0,0), colorSpace='rgb', rgb=None, allowGUI=True, monitor='testMonitor', units='deg', fullscr=False, screen=2) 
pgon = visual.Polygon(win, edges=4) 
pgon.draw() 
win.flip() 

下のポリゴンの使用量のサンプルあなたがpsychophyドキュメントを経て頂点と他の選択肢を模索することができます。

あなたのコードの最適化は、次のようになります。

zdots=40 
zdot_list = [] 

for i in range(zdots): 
    angle=0 
    line_cart = pol_to_cart(j, angle) 
    zdot_list.append(visual.Line(win, start=([line_cart[0], line_cart[1]]), end=(4,0), lineColor="white")) 
    j += .2 

for i in zdot_list: 
    i.draw() 

win.flip() 
core.wait(3) 
win.close() 
+0

あなたの最適化は一度に1行ずつ表示されます。一緒に表示する必要があります。 – Jon

+0

@Jonの最適化がすべてを一度に表示するように変更されました。 –

+0

ループ自体の間に描画する必要はありませんか?ループの外側にこれらを描画すると、1つの行だけが表示されます(おそらくループの最後の繰り返し)。私はこれらの線を描くときに、より多くのコントロールが必要です。 – Jon

2

ライン4で提案された解決策は大丈夫です。配列内の行数を増やすと、多数のオブジェクトをより効率的に描画するためにElementArrayStimを使用する必要があります。これはもともとはビットマップテクスチャを描画するために設計されていましたが、sizeパラメータをlongとthinに設定し、テクスチャに何も設定しないと効果的に線が得られません。 例えば、ここでのコードを参照してください:

https://github.com/psychopy/psychopy/issues/1350

だから、80+ラインにスケールアップするためにあなたがそのルートを行く必要があります。

+0

Brilliant、thanks Jon!しましょう。 – Jon

+0

ElementArrayStimを使用すると、その行の開始点と終了点をどのように作成できますか?これらのオプションは、クラスparamsでは使用できません。 – Jon

関連する問題