2

openFrameworks 0.7.4、VS2012、v100 プラットフォーム ツールセットを使用。

私はサークルのファミリーを作っていcircles.size() < 200 && rand() % 20 == 0ます。

各円は、std::vectorそのpush_back()関数を使用して にプッシュされます。

子円によって構築された多角形の線は、各要素に 6 つの整数値が含まれる a に従って描画されstd::vector<std::vector<int>>ます。それぞれは、前の子円と現在の子円の x 位置と y 位置、および の前と現在の子円のインデックスです。前述のstd::vector

そして、ランダムにこのエラーが発生します。

エラー

cout2 つのベクトルが保持する要素の数を確認するためにを使用してみましたが、結果は一定ではありませんでした。

1: circles.size() = 57, lines.size() = 56;
2: circles.size() = 42, lines.size() = 41;
3: circles.size() = 72, lines.size() = 71;
4: circles.size() = 78, lines.size() = 77;

エラーは、「再試行」を押してデバッグすることを示しています。

オートウォッチ

問題は にあるはずですcircles

circlesを折りたたんだ時の上部パーツと下部パーツです。

上 下

スタック オーバーフローで既に尋ねられたいくつかの質問を読みましたが、私の問題は「スタックの破損」の=代わりに使用することにあるとは思いません。push_back()

ソースコード:

testApp.cpp

#include "testApp.h"

void testApp::setup(){
ofSetWindowShape(1200, 800);
ofBackground(0, 0, 0);

lCircles = lLines = 0;

circle rc = circle(600, 400);
circles.push_back(rc);

ofEnableAlphaBlending();
}

void testApp::update(){
cout << circles.size() << ", " << lines.size() << endl;

if (circles.size() < 200) {
    if (rand() % 20 == 0) {
        int ci = rand() % circles.size();

        detectIndex(ci, true);

        if (!circles[ci].isNear) {
            circles[ci].isNear = true;

            int iterant = rand() % 7 + 3;
            int actual = 0;

            for (int cci = 0; cci < iterant; cci++) {
                circle nc = circle(circles[ci].x + cos(360 / iterant * cci * PI / 180) * spawnRadius, circles[ci].y + sin(360 / iterant * cci * PI / 180) * spawnRadius);
                if (!detectCircle(nc, true)) {
                    circles.push_back(nc);
                    actual++;
                    circles[ci].radius++;
                }
            }

            for (int sli = circles.size() - actual + 1; sli < circles.size(); sli++) {
                std::vector<int> nline;
                nline.push_back(circles[sli - 1].x);
                nline.push_back(circles[sli - 1].y);
                nline.push_back(circles[sli].x);
                nline.push_back(circles[sli].y);
                nline.push_back(sli - 1);
                nline.push_back(sli);
                lines.push_back(nline);
            }

            std::vector<int> nline;
            nline.push_back(circles[circles.size() - actual].x);
            nline.push_back(circles[circles.size() - actual].y);
            nline.push_back(circles[circles.size() - 1].x);
            nline.push_back(circles[circles.size() - 1].y);
            nline.push_back(circles.size() - actual);
            nline.push_back(circles.size() - 1);
            lines.push_back(nline);
        }
    }
}
}

bool testApp::detectIndex(int ci, bool change = false) {
bool res = false;

for (int chi = 0; chi < circles.size(); chi++) {
    if (ci != chi) {
        if (ofDist(circles[ci].x, circles[ci].y, circles[chi].x, circles[chi].y) < circles[ci].aradar * circles[ci].radius) {
            res = true;
            if (change) circles[ci].isNear = circles[chi].isNear = true;
        }
    }
}

return res;
}

bool testApp::detectCircle(circle ci, bool change = false) {
bool res = false;

for (int chi = 0; chi < circles.size(); chi++) {
    if (ofDist(ci.x, ci.y, circles[chi].x, circles[chi].y) < ci.aradar * ci.radius) {
        res = true;
        if (change) ci.isNear = circles[chi].isNear = true;
    }
}

return res;
}

void testApp::draw(){
for (int dci = 0; dci < circles.size(); dci++) {
    ofSetColor(circles[dci].color);
    ofCircle(circles[dci].x, circles[dci].y, circles[dci].radius);
    ofNoFill();
    ofSetColor(circles[dci].color, 128);
    ofCircle(circles[dci].x, circles[dci].y, circles[dci].aradar * circles[dci].radius);
    ofFill();
}

for (int dli = 0; dli < lines.size(); dli++) {
    ofSetColor(circles[lines[dli][4]].color);
    ofLine(lines[dli][0], lines[dli][1], (lines[dli][2] + lines[dli][0]) / 2, (lines[dli][3] + lines[dli][1]) / 2);
    ofSetColor(circles[lines[dli][5]].color);
    ofLine(lines[dli][2], lines[dli][3], (lines[dli][2] + lines[dli][0]) / 2, (lines[dli][3] + lines[dli][1]) / 2);
}
}

void testApp::keyPressed(int key){
    ofSaveFrame();
}

testApp.h のデフォルト以外の部分

#define spawnRadius 50

#include "circle.h"

class testApp : public ofBaseApp {
    public:
        ...
        std::vector<circle> circles;
        std::vector<std::vector<int>> lines;

        bool detectIndex(int ci, bool change);
        bool detectCircle(circle ci, bool change);

        int lCircles;
        int lLines;

circle.h

#include "ofMain.h"

class circle {

public:
    int x;
    int y;
    int radius;
    int aradar;

    ofColor color;

    bool isNear;

    circle(int cx, int cy) {
        x = cx;
        y = cy;
        radius = 5;
        aradar = 6;

        color = ofColor(ofRandom(255));

        isNear = false;
    }

};

VS でデバッガーを使用する方法がよくわからないので、コードまたはデバッガーに関するヘルプが必要です。

4

0 に答える 0