簡體   English   中英

如何在pyprocessing中正確繪制框?

[英]How correctly draw boxes in pyprocessing?

我正在嘗試使用pyprocessing編寫一個非常基本的盒子繪圖程序,但是當邏輯看起來正常時,檢查鼠標是否在盒子中的條件失敗:

#!/usr/bin/env python
from pyprocessing import *

S = 20
W = 5
H = 5

data = [[0] * W] * H

def setup():
    size(W*(S+5),H*(S+5))

def draw():
    background(0)
    for y in xrange(H):
        for x in xrange(W):
            fill(data[x][y] * 255)
            rect(x*S,y*S,S,S)

def mouseDragged():
    for y in xrange(H):
        for x in xrange(W):
            xs = x * S
            ys = y * S
            # this doesn't behave as expected: it should draw a single box if the condition is met, not the whole row
            if (mouse.x >= xs) and (mouse.x <= (xs+S)) and (mouse.y >= ys and mouse.y <= (ys+S)):
                if key.pressed:
                    data[x][y] = 0
                else:   
                    data[x][y] = 1

run()

我已經嘗試過使用Java版本的Processing處理相同的方法,並且可以按預期工作:

int S = 20;
int W = 5;
int H = 5;

int[][] data = new int[W][H];

void setup(){
  size(100,100);
  noStroke();
}

void draw(){
  background(0);
  for (int y = 0 ; y < H; y++){
    for (int x = 0 ; x < W; x++){
      fill(data[x][y] * 255);
      rect(x*S,y*S,S,S);
    }
  }
}
void mouseDragged(){
  for (int y = 0 ; y < H; y++){
    for (int x = 0 ; x < W; x++){
      int xs = x * S;
      int ys = y * S;
      if ((mouseX > xs) && (mouseX < (xs+S)) && (mouseY >= ys && mouseY <= (ys+S))){
        data[x][y] = 1;
      }
    }
  }
}

JS中的類似行為:

 var S = 20; var W = 5; var H = 5; var data = new Array(W); function setup(){ createCanvas(100,100); noStroke(); for (var i = 0 ; i < H; i++) data[i] = [0,0,0,0,0]; } function draw(){ background(0); for (var y = 0 ; y < H; y++){ for (var x = 0 ; x < W; x++){ fill(data[x][y] * 255); rect(x*S,y*S,S,S); } } } function mouseDragged(){ for (var y = 0 ; y < H; y++){ for (var x = 0 ; x < W; x++){ var xs = x * S; var ys = y * S; if ((mouseX > xs) && (mouseX < (xs+S)) && (mouseY >= ys && mouseY <= (ys+S))){ data[x][y] = 1; } } } } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.4.23/p5.min.js"></script> 

我是否在Python中正確編寫了框邊界條件? 如果是這樣,pyprocessing是否存在錯誤? 我該如何克服?

我正在使用pyprocessing.version '0.1.3.22'

試圖變得懶惰是問題所在:

data = [[0] * W] * H

這不只是創建一個嵌套數組,它還會復制第一個數組( [0] )的引用 ,因此當我在一行中修改一個值時,整行都會被修改。

由於我對python很有經驗,因此我以一種非Python的方式初始化了數組:

data = []
for y in xrange(H):
    data.append([])
    for x in xrange(W):
        data[y].append(0)

因此,完整的工作代碼是:

#!/usr/bin/env python
from pyprocessing import *

S = 20
W = 5
H = 5

# data = [[0] * W] * H #trouble
data = []
for y in xrange(H):
    data.append([])
    for x in xrange(W):
        data[y].append(0)

def setup():
    size(W*(S),H*(S))

def draw():
    background(0)
    for y in xrange(H):
        for x in xrange(W):
            fill(data[x][y] * 255)
            rect(x*S,y*S,S,S)

def mouseDragged():
    for y in xrange(H):
        for x in xrange(W):
            xs = x * S
            ys = y * S
            if (mouse.x >= xs) and (mouse.x <= (xs+S)) and (mouse.y >= ys and mouse.y <= (ys+S)):
                if key.pressed:
                    data[x][y] = 0
                else:   
                    data[x][y] = 1

run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM