2

使用 openFrameworks 0.7.4、VS2012、v100 平台工具集。

我正在制作一个圈子,如果circles.size() < 200 && rand() % 20 == 0.

每个圆圈都被推入一个std::vector使用它的push_back()功能。

由子圆构成的多边形的线是按照 a 绘制的,std::vector<std::vector<int>>其中每个元素包含 6 个整数值,每个值是前一个子圆和当前子圆的 x 和 y 位置,以及前一个和当前子圆在中的索引前面提到的std::vector

并且在随机时间我得到这个错误。

错误

我尝试使用cout来检查两个向量包含多少个元素,结果不是恒定的:

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是折叠时的顶部和底部。

最佳 底部

我阅读了一些已经在 Stack Overflow 上提出的问题,但我不认为我的问题在于使用=而不是push_back()“堆栈损坏”。

源代码:

测试应用程序.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;

圈子.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