#ifndef __SHAPE_H_
#define __SHAPE_H_
#include "flp.h"
#include "npe.h"
#define MAX_STACK 128
typedef struct shape_t_st
{
double *x;
double *y;
int *left_pos;
int *right_pos;
double *median;
int size;
}shape_t;
typedef struct tree_node_t_st
{
shape_t *curve;
union {
int cut_type;
int unit;
}label;
struct tree_node_t_st *left;
struct tree_node_t_st *right;
}tree_node_t;
typedef struct tree_node_stack_t_st
{
tree_node_t *array[MAX_STACK];
int top;
}tree_node_stack_t;
shape_t *shape_from_aspect(double area, double min,
double max, int rotable,
int n_orients);
shape_t *shape_add(shape_t *shape1, shape_t *shape2, int cut_type);
void free_shape(shape_t *shape);
int min_area_pos(shape_t *curve);
void print_shape(shape_t *shape);
tree_node_stack_t *new_tree_node_stack(void);
void tree_node_stack_push(tree_node_stack_t *stack, tree_node_t *node);
tree_node_t *tree_node_stack_pop(tree_node_stack_t *stack);
int tree_node_stack_isfull(tree_node_stack_t *stack);
int tree_node_stack_isempty(tree_node_stack_t *stack);
void free_tree_node_stack(tree_node_stack_t *stack);
void tree_node_stack_clear(tree_node_stack_t *stack);
tree_node_t *tree_from_NPE(flp_desc_t *flp_desc,
tree_node_stack_t *stack,
NPE_t *expr);
void free_tree(tree_node_t *root);
void print_tree(tree_node_t *root, flp_desc_t *flp_desc);
void print_tree_relevant(tree_node_t *root, int pos, flp_desc_t *flp_desc);
int tree_to_flp(tree_node_t *root, flp_t *flp, int compact_dead,
double compact_ratio);
#endif