質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

OpenFrameworks 配列を使って図形を描画する方法

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,168
退会済みユーザー

退会済みユーザー

前提・実現したいこと

自分で定義した関数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
を使用しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

今回のやり方だと、描画用クラスを作って、そのクラスの配列を作ると実現できるかと思います。

下の例では、Lineクラスの中にdrawsessen関数を作って、Lineクラスにマウス座標を与えて、その座標を中心に回転するようになっています。

ofApp.h

class Line {
   public:
    Line(int x, int y) { //コンストラクタ
        t = x;
        h = y;
        kaiten = 0;
    }

    void update() {
        time_ += 0.01;
        kaiten += 6;
    }
    void draw() { drawsessen(t, h, 30 + 25); }
    void drawsessen(float t, float h, float r) {
        ofPushMatrix();
        ofTranslate(t, h);
        //座標を回転する
        //ofRotate(kaiten);
        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);
            }
        }
        ofPopMatrix();
    }
    float x1, y1_, x2, y2, x3, y3, x4, y4, red, green, blue, time_, kaiten, r, t, h;
};

class ofApp : public ofBaseApp {
  ...(中略)
  vector<Line> lines; //配列を宣言
}

ofApp.cpp

#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup() {
    ofSetBackgroundAuto(false);
    ofBackground(0, 0, 0);
    ofSetFrameRate(5);
}

//--------------------------------------------------------------
void ofApp::update() {
    for (int i = 0; i < lines.size(); i++) {
        lines[i].update();
    }
}

//--------------------------------------------------------------
void ofApp::draw() {
    for (int i = 0; i < lines.size(); i++) {
        lines[i].draw();
    }
}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button) {
    lines.push_back(Line(x, y));
} 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る