使用 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 中使用调试器,我真的很想得到一些关于代码或调试器的帮助。