mirror of
https://github.com/Decscots/Lockpick_RCM
synced 2024-11-22 18:59:24 +00:00
79 lines
1.7 KiB
C
79 lines
1.7 KiB
C
/**
|
|
* @file lv_circ.c
|
|
* Circle drawing algorithm (with Bresenham)
|
|
* Only a 1/8 circle is calculated. Use CIRC_OCT1_X, CIRC_OCT1_Y macros to get
|
|
* the other octets.
|
|
*/
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "lv_circ.h"
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC PROTOTYPES
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC VARIABLES
|
|
**********************/
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
/**********************
|
|
* GLOBAL FUNCTIONS
|
|
**********************/
|
|
|
|
/**
|
|
* Initialize the circle drawing
|
|
* @param c pointer to a point. The coordinates will be calculated here
|
|
* @param tmp point to a variable. It will store temporary data
|
|
* @param radius radius of the circle
|
|
*/
|
|
void lv_circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius)
|
|
{
|
|
c->x = radius;
|
|
c->y = 0;
|
|
*tmp = 1 - radius;
|
|
}
|
|
|
|
/**
|
|
* Test the circle drawing is ready or not
|
|
* @param c same as in circ_init
|
|
* @return true if the circle is not ready yet
|
|
*/
|
|
bool lv_circ_cont(lv_point_t * c)
|
|
{
|
|
return c->y <= c->x ? true : false;
|
|
}
|
|
|
|
/**
|
|
* Get the next point from the circle
|
|
* @param c same as in circ_init. The next point stored here.
|
|
* @param tmp same as in circ_init.
|
|
*/
|
|
void lv_circ_next(lv_point_t * c, lv_coord_t * tmp)
|
|
{
|
|
c->y++;
|
|
|
|
if(*tmp <= 0) {
|
|
(*tmp) += 2 * c->y + 1; // Change in decision criterion for y -> y+1
|
|
} else {
|
|
c->x--;
|
|
(*tmp) += 2 * (c->y - c->x) + 1; // Change for y -> y+1, x -> x-1
|
|
}
|
|
}
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|