void generateData () { int k; int sx; int sy; Complex z, w, *c; if (fracData == NULL) allocData (); int *fracPoint = fracData; for (sx = 0; sx < n1; ++sx) { for (sy = 0; sy < n2; ++sy, ++fracPoint) { screenToComplex (sx, sy, &w); z = w; if (mode == 1) c = &w; else c = &julia; for (k = 0; k < MAX_ITERATIONS; ++k) { z = cmultComplex (&z, &z); // z = cmultComplex (&z, &z); z = addComplex (&z, c); // z = sinComplex (&z); // z = cmultComplex (c, &z); // z.real = c->imaginary + z.real; // z.imaginary = c->real - z.imaginary; // z = cmultComplex (c, &z); if (z.real * z.real + z.imaginary * z.imaginary > ESCAPE_RADIUS) break; } *fracPoint = k; } } }
inline void screenToComplex (int sx, int sy, Complex *z) { double complexHeight = INIT_COMPLEX_DOMAIN_WIDTH * (double)n2 / (double)n1; Complex sub = newComplex (INIT_COMPLEX_DOMAIN_WIDTH / 2, complexHeight / 2); *z = newComplex (INIT_COMPLEX_DOMAIN_WIDTH * (double)(sx) / (double)(n1), complexHeight * (double)(sy) / (double)(n2)); *z = minusComplex (z, &sub); *z = rmultComplex (zoom, z); *z = addComplex (z, &trans); }
int main() { Comp a = {1, 0}; Comp b = {2, 1}; Comp c = addComplex(a, b); show(a); show(b); show(c); return 0; }
void mouse (int button, int state, int x, int y) { static int clickx; static int clicky; switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { Complex c; screenToComplex (x, (n2 - y - 1), &c); if (glutGetModifiers () == GLUT_ACTIVE_SHIFT) { if (mode == 1) { mode = 0; julia = c; } else { mode = 1; } trans = newComplex (0, 0); zoom = 2; } else { trans = c; if (glutGetModifiers () == GLUT_ACTIVE_CTRL) zoom /= 0.7; else zoom *= 0.7; } generateData (); glutPostRedisplay (); } break; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) { clickx = x; clicky = y; } else { Complex c; Complex r; screenToComplex (clickx, (n2 - clicky - 1), &c); screenToComplex (x, (n2 - y - 1), &r); trans = addComplex (&trans, &c); trans = minusComplex (&trans, &r); generateData (); glutPostRedisplay (); } default: break; } }
//input sample array, # of points void FFT(Complex *data, Complex const *factor, int num, int series) { //temporary storage variables Complex topData; Complex lowData; Complex dataIndex; //difference between top/lower leg int leg_diff; int lower_leg; //index/step through twiddle constant int index = 0; //step between values int step = 1; //difference between upper & lower legs leg_diff = num / 2; imagSetToZero(data, num); //for N-point FFT for (int i = 0; i < series; i++) { index = 0; for (int j = 0; j < leg_diff; j++) { for (int upper_leg = j; upper_leg < num; upper_leg += (2 * leg_diff)) { lower_leg = upper_leg + leg_diff; addComplex(&topData, (data + upper_leg), (data + lower_leg)); subComplex(&lowData, (data + upper_leg), (data + lower_leg)); dataIndex.real = (factor + index)->real; dataIndex.imag = (factor + index)->imag; mulComplex((data + lower_leg), &lowData, &dataIndex); (data + upper_leg)->real = topData.real; (data + upper_leg)->imag = topData.imag; } index += step; } leg_diff >>= 1; step *= 2; } inReverse(data, num); }