In processing:

```
// https://en.wikipedia.org/wiki/Polar_coordinate_system#Converting_between_polar_and_Cartesian_coordinates
size(512, 512); //Going larger that 512 is not worth it. You only get 255 steps of value in any direction anyway.
loadPixels();
float maxLength = dist( 0.5, 0.5, 0, 0 ); //Get the maximum distance to a corner, for normalization.
for(int x = 0; x < width; x++ ){
for( int y = 0; y < height; y++ ){
int index = x + y * width;
float X = x;
float Y = y;
float U = (X / width) - 0.5; //Translate the origin to 0.5,0.5;
float V = (Y / width) - 0.5;
float r = 1 - (dist(U, V, 0, 0) / maxLength); //Get the radius sqrt(x^2 + y^2) and normalize.
//This normalization may not be what you want. Feel free to replace maxLength with 0.5
float angle = atan2(V, U) / (PI); //Get the angle in radians, then normalize.
color c = color( r * 255, angle * 255, 0 ); //Multiply by 255 to get 0,255 range color.
pixels[index] = c;
}
}
updatePixels();
save("RadialUVTexture.tga"); //Check your Sketch>Show Sketch Folder. (Ctrl+K)
```

Outputs:

Normalizing to 0.5 instead:

I recommend ignoring the V value in this case actually, you just want a radius. With that you can add distortion or whatever you want to it and just sample X values only. That way you don’t worry about creases. Instead you just make your pattern a single row instead of needing Y information. If you do choose to use both make sure your texture is tileable in all directions.

In addition: There is this old blog post which does what you want probably with both textures, and nodes.