#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
 
class Gradient
{
      int height;
      int width;
      float x_center;
      float y_center;
      string chars;
      float radius;
      int ratio;
public:
       void Init(int height, int width, float x_center, float y_center, string chars);
       Gradient(int height, int width, float x_center, float y_center, string chars);
       Gradient(int height, int width, float x_center, float y_center, string chars, float radius);
       void Print();
};
 
int main(int argc, char *argv[])
{
    int height=0,width=0;
    float x_center=0,y_center=0,radius=0;
    string chars;
    cout<<"Enter height:"<<endl;
    while (height<=0) cin>>height;
    cout<<"Enter width:"<<endl;
    while (width<=0) cin>>width;
    cout<<"Enter x_center"<<endl;
    cin>>x_center;
    cout<<"Enter y_center"<<endl;
    cin>>y_center;
    cout<<"Enter radius(optional, 0 to ommit)"<<endl;
    cin>>radius;
    cout<<"Enter char string"<<endl;
    cin>>chars;
    Gradient *grad;
    if (radius)
       grad=new Gradient(height, width, x_center, y_center, chars, radius);
    else
       grad=new Gradient(height, width, x_center, y_center, chars);
    grad->Print();
    return EXIT_SUCCESS;
}
void Gradient::Print()
{
     float distForEach=(radius)/chars.size();
     for (int i=0;i<height;i++)
     {
         for (int j=0;j<width;j++)
         {
             char c;
             float dist=sqrt((j-x_center)*(j-x_center)+(i*ratio-y_center*ratio)*(i*ratio-y_center*ratio));
             dist=abs(dist);
             int charN=dist/distForEach;
             charN;
             if (chars.size()>charN)
                c=chars[charN];
             else
                c=' ';
             cout<<c;
         }
         cout<<endl;
     }
}
Gradient::Gradient(int height, int width, float x_center, float y_center, string chars)
{                
    Init(height,width,x_center,y_center,chars);
    float point_x=x_center<=width/2?(width-x_center):(0+x_center);//Calculate distance from center to farthest point in x
    float point_y=y_center<=height/2?(height-y_center):(0+y_center);//Calculate distance from center to farthest point in y
    point_y*=ratio;//Convert to LU (length units), multiplies by ratio, that indicates how many LUs in height is each character
    cout<<"Point x:"<<point_x<<" Point y:"<<point_y<<endl;
    this->radius=sqrt(point_x*point_x+point_y*point_y);//Calculate radius
}
 
Gradient::Gradient(int height, int width, float x_center, float y_center, string chars, float radius)
{
    Init(height,width,x_center,y_center,chars);
    this->radius=radius;
}
void Gradient::Init(int height, int width, float x_center, float y_center, string chars)
{
    this->height=height;
    this->width=width;
    this->x_center=x_center;
    this->y_center=y_center;
    this->chars=chars;
    this->ratio=2;
}