2017-05-01 6 views
1

ベクトルを表示するクラスを作成しようとしています。 1つのベクトルオブジェクトを作成すると、すべてが意図どおりに機能します。私のサンプルコードでは、オブジェクトlin1draw()関数の助けを借りて描画されます。2番目のオブジェクトを作成すると、クラスの関数がもう機能しなくなる

ここで2番目のベクトルオブジェクトを作成すると、オブジェクト自体は変更されていなくても、(変更されていない)描画関数は何も行いません。これは他の方法と同じです:第2のオブジェクトが唯一のものであるか、描画可能ですが、lin1が存在しない限りです。

誰かが私の間違いを知っていますか?

vector lin; 
vector lin2; 

void setup() 
{ 
    size(500,500); 
    background(255); 
    cenX = width/2; 
    cenY = height/2; 
    noLoop(); 
} 

void draw() 
{ 
    coordSys(); 
    lin = new vector(0,0,100,100); 
    lin2 = new vector(0,0,-200,-200); 
    lin.draw(); 
    lin2.draw(); 
    lin.getAll(); 
} 

class vector 
{ 
    float x1,y1,x2,y2; 
    float length; 
    float angle; 
    float gegenK, anK; 

    vector(float nx1, float ny1, float nx2, float ny2) 
    { 
    translate(cenX,cenY); 
    x1 = nx1; y1 = -ny1; x2 = nx2; y2 = -ny2; 
    strokeWeight(2); 
    // Gegenkathete 
    gegenK = ny2 - ny1; 
    // Ankathete 
    anK = x2 - x1; 
    // length and angle 
    length = sqrt(sq(anK) + sq(gegenK)); 
    angle = winkel(gegenK, anK); 
    } 

    void draw() 
    { 
    stroke(0); 
    line(x1,y1,x2,y2); 
    } 
} 
} 
+0

あなたは 'lin2.getAll()'を呼び出すことはありません理由はありますか? – Ishnark

+0

ソースコードを 'stroke()'と 'line()'に表示できますか? 'stroke(0)'は何をするのですか? –

+0

これは処理内部関数です。線は線を描画し、線は線の色を設定します。 – user7948346

答えて

0

コードを書くときは、標準的な命名規則を使用してください。具体的には、クラスは大文字のVを使用してVectorにする必要があります。また、コンパイルして実行するMCVEの形式でコードを投稿してください。

とにかく、あなたのVector()コンストラクタの最初の呼び出しはこれです:

translate(cenX,cenY); 

これは途中でウィンドウ間でウィンドウの原点を移動します。これを一度行うと、これはウィンドウの中心を基準にして描画呼び出しを行うだけです。しかし、これを2回行うと、原点がウィンドウの右下隅に移動するので、すべての図面が画面の端から外れます。

問題を解決するには、Vectorを描画するたびに1回だけ(おそらくdraw()関数の先頭に)この行を移動する必要があります。これに対処するもう1つの方法は、ウィンドウ翻訳のこの積み重ねを避けるためにpushMatrix()popMatrix()関数を使用することです。

+0

!どうもありがとう! – user7948346

関連する問題