int main() { char filename[] = "cardioid.png"; struct image *i; int x,y; double a, r; i = draw_create_image(300,300); draw_full(i, white); draw_color(i, black); for(x=-4;x<=4;x++) draw_textf(i, 150+x*30+3,150+3, 1, "%d", x); for(y=-4;y<=4;y++) draw_textf(i, 150+3,150-y*30+4, 1, "%d", y); draw_color(i,blue); for(x=0;x<300;x+=30) draw_line(i, x,0, x,i->height-1); for(y=0;y<300;y+=30) draw_line(i, 0,y, i->width-1,y); draw_box(i, 0,0, i->width-1,i->height-1); draw_color(i, black); for(x=-1;x<=1;x++) draw_line(i, 150+x,0, 150+x,i->height-1); for(y=-1;y<=1;y++) draw_line(i, 0,150+y, i->width-1,150+y); draw_color(i, green); /* Cardioid */ for(a = 0.0; a < 360.0; a += 0.5) { r = 0.0 - sin(0.5*a/180*M_PI)*120.0; draw_pixel(i, 150+sin(a/180*M_PI)*r, 150+cos(a/180*M_PI)*r, red); } draw_color(i, black); draw_textf(i, 5,i->height-16-2, 2, "Cardioid"); draw_write_png(i, filename); draw_free_image(i); return 0; }
void fill_vbat_arr(char *arr, long vbat) { long relax_vbat; substract_charge(vbat); switch (g_state) { case STATE_CHARGED: { draw_full(arr); if (vbat < 1000 * VBATOCVDOWN) { g_average = vbat; g_relax_counter = 0; g_state = STATE_INUSE; g_relax_in_Vbat = vbat; // Prev vbat in fact } } break; case STATE_INUSE: { draw_charge(arr, g_charge); g_average = (49 * g_average + vbat) / 50; // 10 seconds average #ifdef USE_RELAX relax_vbat = get_relax_t(g_charge); if (myabs(g_average - vbat) <= RELAX_THRESHOLD || vbat > relax_vbat) // 0.15V g_relax_counter++; else g_relax_counter = 0; if (g_relax_counter > RELAX_EVENTS) { g_relax_in_Vbat = vbat; g_state = STATE_RELAX; } #endif if (vbat < 1000 * VBATLOW || g_charge < 1000 * BATLIMIT) { g_state = STATE_TOO_LOW; } if (vbat > 1000 * VBATOCVUP) { g_state = STATE_CHARGING; } } break; case STATE_RELAX: { draw_charge(arr, g_charge); g_average = (49 * g_average + vbat) / 50; // 10 seconds average relax_vbat = get_relax_t(g_charge); if (g_average - vbat >= RELAX_THRESHOLD || myabs(g_relax_in_Vbat - vbat) >= RELAX_THRESHOLD || (relax_vbat - vbat) > 400) { g_relax_counter = 0; g_state = STATE_INUSE; } if (vbat > 1000 * VBATOCVUP) { g_state = STATE_CHARGING; } if (vbat < 1000 * VBATLOW || g_charge < 1000 * BATLIMIT) { g_state = STATE_TOO_LOW; } } break; case STATE_TOO_LOW: { draw_alarm(arr); if (vbat > 1000 * VBATOCVUP) { g_state = STATE_CHARGING; } g_average = 0; } break; case STATE_CHARGING: { draw_charging(arr); if (vbat > 1000 * VBATENDCHARGE) { g_state = STATE_CHARGED; g_charge = 1000 * BATCAP; } draw_charging(arr); if (vbat < 1000 * VBATRELAXHI) { g_state = STATE_INUSE; } } break; } }