前提・実現したいこと
自分で定義した関数drawsessen(接線)で、クリックした位置に図形を描くプログラミングを作っています。今のプログラムだと、新しい場所をクリックすると前の図形の描写が止まってしまうので、それぞれが描写され続けるようにしたいです。
配列を使えばいいのだと思うのですが、エラーが出てしまったりクリックした位置とは違う位置に描画されてしまったりします。
このプログラムに配列を組み込むにはどうしたらいいのでしょうか?
大学の授業でプログラミングを習い始め、基本的な知識しかありません…
どなたか分かる方がいらっしゃいましたらよろしくお願いいたします。
#include "ofApp.h"
float x1,y1_,x2,y2,x3,y3,x4,y4,red,green,blue,time_,kaiten,r,t,h;
int i;
//rは接線を引く円の半径
//--------------------------------------------------------------
void ofApp::drawsessen(float t,float h,float r){
ofTranslate(t, h); //座標を回転する ofRotateDeg(kaiten); //色を変化させる float red=ofNoise(x1,y1_,time_/0.57)*255+100; float green=ofNoise(x1,y1_,time_/0.5)*255+100; float blue=ofNoise(x1,y1_,time_/0.4)*255+100; //円の接線をかく for (x1 = -r/2; x1 <= r/2; x1=x1+15) { x2=x1*x1; y2=y1_*y1_; y2=r*r-x2; //平方根の計算 float x3=sqrt(x2); float y3=sqrt(y2); for (x4 = -r*2; x4 <= r*2; x4=x4+0.1) { y4=(r*r-x3*x4)/y3; ofNoFill(); ofSetColor(red, green, blue); ofDrawCircle(x4, y4, 0.01); } }
}
//--------------------------------------------------------------
void ofApp::setup(){
ofSetBackgroundAuto(false);
ofBackground(0, 0, 0);
ofSetFrameRate(5);
}
//--------------------------------------------------------------
void ofApp::update(){
time_+=0.01; kaiten+=6;
}
//--------------------------------------------------------------
void ofApp::draw(){
if(i>0){ drawsessen(t, h,30+25); }
}
//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){
t=x;
h=y;
kaiten=0;
i++;
}
発生している問題・エラーメッセージ
配列を組み込もうとすると、 Subscripted value is not an array, pointer, or vector などのエラーが出たり、図形が描画されなくなったりします…。
該当のソースコード
ソースコード
試したこと
試してみたプログラムです。
#include "ofApp.h"
float x1,y1_,x2,y2,x3,y3,x4,y4,red,green,blue,time_,kaiten,r=50;
int click=0;
float px[100],py[100];
int k,i;
//rは接線を引く円の半径
//--------------------------------------------------------------
void ofApp::Zukei(float r){
for(int i=0; i<click; i++){ ofTranslate(px[i], py[i],100); //座標を回転する ofRotateDeg(kaiten); //色を変化させる float red=ofNoise(x1,y1_,time_/0.57)*255+100; float green=ofNoise(x1,y1_,time_/0.5)*255+100; float blue=ofNoise(x1,y1_,time_/0.4)*255+100; //円の接線をかく for (x1 = -r/2; x1 <= r/2; x1=x1+15) { x2=x1*x1; y2=y1_*y1_; y2=r*r-x2; //平方根の計算 float x3=sqrt(x2); float y3=sqrt(y2); for (x4 = -r*2; x4 <= r*2; x4=x4+0.1) { y4=(r*r-x3*x4)/y3; ofNoFill(); ofSetColor(red, green, blue); ofDrawCircle(x4, y4, 0.01); } } }
}
//--------------------------------------------------------------
void ofApp::setup(){
ofSetBackgroundAuto(false);
ofBackground(0, 0, 0);
ofSetFrameRate(5);
image.load("syukusyou.png"); image2.load("kakudai.png");
}
//--------------------------------------------------------------
void ofApp::update(){
time_+=0.01; kaiten+=6;
}
//--------------------------------------------------------------
void ofApp::draw(){
image.draw(0, 0, 150, 150);
image2.draw(0, 150, 150, 150);
if(k>0){ for(int i=0; i<1000; i++){ Zukei(r); } }
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
}
//--------------------------------------------------------------
void ofApp::keyReleased(int key){
}
//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){
}
//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){
}
//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){
if(x>=0 and x<=150 and y>=0 and y<=150){
r=r-30;
k=0;
}
else if(x>=0 and x<=150 and y>=150 and y<=300){
r=r+30;
k=0;
}
else{
px[click]=x;
py[click]=y;
click++;
kaiten=0;
k++;
}
}
補足情報(FW/ツールのバージョンなど)
openframeworks
Xcode
を使用しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。