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

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

新規登録して質問してみよう
ただいま回答率
85.48%
openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

3067閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

openFrameworks

openFrameworksは、C++で記述されたライブラリ群です。既存のライブラリの設定なしで使用できるため「糊」のようなツールキットと呼ばれています。簡単なコードだけで様々なグラフィックスやインタラクションをデザインすることが可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/01/17 13:48

前提・実現したいこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

ofApp.h

c++

1class Line { 2 public: 3 Line(int x, int y) { //コンストラクタ 4 t = x; 5 h = y; 6 kaiten = 0; 7 } 8 9 void update() { 10 time_ += 0.01; 11 kaiten += 6; 12 } 13 void draw() { drawsessen(t, h, 30 + 25); } 14 void drawsessen(float t, float h, float r) { 15 ofPushMatrix(); 16 ofTranslate(t, h); 17 //座標を回転する 18 //ofRotate(kaiten); 19 ofRotateDeg(kaiten); 20 21 //色を変化させる 22 float red = ofNoise(x1, y1_, time_ / 0.57) * 255 + 100; 23 float green = ofNoise(x1, y1_, time_ / 0.5) * 255 + 100; 24 float blue = ofNoise(x1, y1_, time_ / 0.4) * 255 + 100; 25 26 //円の接線をかく 27 for (x1 = -r / 2; x1 <= r / 2; x1 = x1 + 15) { 28 x2 = x1 * x1; 29 y2 = y1_ * y1_; 30 31 y2 = r * r - x2; 32 33 //平方根の計算 34 float x3 = sqrt(x2); 35 float y3 = sqrt(y2); 36 37 for (x4 = -r * 2; x4 <= r * 2; x4 = x4 + 0.1) { 38 y4 = (r * r - x3 * x4) / y3; 39 40 ofNoFill(); 41 ofSetColor(red, green, blue); 42 ofDrawCircle(x4, y4, 0.01); 43 } 44 } 45 ofPopMatrix(); 46 } 47 float x1, y1_, x2, y2, x3, y3, x4, y4, red, green, blue, time_, kaiten, r, t, h; 48}; 49 50class ofApp : public ofBaseApp { 51 ...(中略) 52 vector<Line> lines; //配列を宣言 53}

ofApp.cpp

c++

1#include "ofApp.h" 2//-------------------------------------------------------------- 3void ofApp::setup() { 4 ofSetBackgroundAuto(false); 5 ofBackground(0, 0, 0); 6 ofSetFrameRate(5); 7} 8 9//-------------------------------------------------------------- 10void ofApp::update() { 11 for (int i = 0; i < lines.size(); i++) { 12 lines[i].update(); 13 } 14} 15 16//-------------------------------------------------------------- 17void ofApp::draw() { 18 for (int i = 0; i < lines.size(); i++) { 19 lines[i].draw(); 20 } 21} 22 23//-------------------------------------------------------------- 24void ofApp::mousePressed(int x, int y, int button) { 25 lines.push_back(Line(x, y)); 26}

投稿2020/01/27 03:34

nasymt

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問