Построение функции демпфирования косинуса с использованием Openframeworks - PullRequest
0 голосов
/ 19 октября 2019

Недавно нам в классе сказали работать над заданием, в котором мы должны были построить некоторые инженерные функции. Их было несколько, поэтому я беру только косинус в качестве примера. Мы должны были написать и вызвать несколько функций, которые будут принимать реальные координаты, а затем отображать их в пиксельные координаты, а также получать значения y на основе заданных массивов значений x. Я думаю, что все в порядке с функциями, но теперь, когда они все записаны, я понятия не имею, какую функцию использовать в рисовании, чтобы иметь возможность фактически нарисовать эту функцию косинуса. Я в основном хочу получить совет о том, как я могу продолжать и правильно вызывать эти функции в какой функции рисования, чтобы можно было просто отобразить эту косинусную кривую. Я буду признателен за любую помощь, которую смогу получить.

Я пытался использовать функцию ofDrawCurve для построения точек, но это не позволяет мне использовать мои массивы в списке аргументов. ofXPlotter, похоже, тоже не работает, хотя я не совсем уверен, что использовал его правильно.

Вот мои функции для построения точек и отображения:

        int getXSamples(float xmin, float xmax, float step, float x[])
{
int n;
n = (xmax - xmin) / step + 1;
for (int i = 0; i < n; i++)
{
    x[i] = xmin + i * step;
}
return n;
}

void getDampedCosSamples(int n, float x[], float y[], float alpha, float w)
{

for (int i = 0; i < n; i++)
{
    y[i] = exp(-alpha * x[i])*cos(w*x[i]);
}

}

void getGaussianSamples(int n, float x[], float y[], float alpha, float mu)
{
for (int i = 0; i < n; i++)
{
    y[i] = exp(-alpha * (x[i] - mu)*(x[i] - mu));
}

}
void getSincSamples(int n, float x[], float y[], float alpha)
{
for (int i = 0; i < n; i++)
{
    y[i] = (sin(alpha*PI*x[i]) / (alpha*PI*x[i]));
}

}
float map(float in, float inMin, float inMax, float outMin, float outMax)
{
float m, b, out;

m = (outMax - outMin) / (inMax - inMin);
b = outMax - m * inMax;
out = m * in + b;
return(out);
}
void map_vec(int n, float in[], float out[], float inMin, float inMax, float outMin, float outMax)
{
float m, b;

m = (outMax - outMin) / (inMax - inMin);
b = outMax - m * inMax;

for (int i = 0; i < n; i++)
{
    out[i] = m * in[i] + b;
}

}

1 Ответ

0 голосов
/ 20 октября 2019

Вы модифицируете массивы внутри функции, но эффекты не происходят вне ее.

Попробуйте передать в качестве аргумента указатель на массив или вернуть массив, содержащий точки, которые вы хотитесм. рисунок.

Затем используйте ofPath или ofPolyline для хранения этих точек.

Например:

void getGaussianSamples(int n, float x[], float y[], float alpha, float mu)
{
for (int i = 0; i < n; i++)
{
    y[i] = exp(-alpha * (x[i] - mu)*(x[i] - mu));
}

будет переписано следующим образом:

std::vector < float > getGaussianSamples(int n, float x[], float alpha, float mu){
// this way the size of y doesn't have top be initialised 
std::vector < float > arrayY;
for (int i = 0; i < n; i++)
{
    float currentY = exp(-alpha * (x[i] - mu)*(x[i] - mu));
    arrayY.push_back(currentY);
}
return arrayY;
}

затем объявите ломаную и массив Y в ofApp.h :: setup ():

ofPolyline poly
std::vector < float > y;

, затем в ofApp.cpp :: setup ():

// n, x, alpha, mu all have to be declared somewhere
y = getGaussianSamples(n, x, alpha, mu);
for( int i = 0; i < y.size(); i++){
poly.addVertex(ofVec3f(y[i].x, y[i].y, 0));
}

в ofApp.cpp :: draw ():

// styling only for this polyline
ofPushStyle();
// color is red
ofSetColor(255, 0, 0);
poly.draw();
ofPopStyle();
...