#include <iostream>
#include <cmath>
struct VolumeObject
{
float Red, Green, Blue, Alpha, Volume;
VolumeObject(float red, float green, float blue, float alpha, float volume) : Red(red), Green(green), Blue(blue), Alpha(alpha), Volume(volume)
{
}
};
int main()
{
VolumeObject volumes[] = { VolumeObject(1, 0, 0, 0.5f, 0.25f), VolumeObject(1, 0, 0, 0.5f, 0.5f), VolumeObject(1, 0, 0, 0.5f, 0.25f) };
float colorR = 0;
float colorG = 0;
float colorB = 0;
float colorA = 1;
for (int i = 0; i < 3; ++i)
{
float scale = colorA - colorA * exp(-volumes[i].Alpha * volumes[i].Volume);
std::cout << "Scale: " << scale << std::endl;
colorR += volumes[i].Red * scale;
colorG += volumes[i].Green * scale;
colorB += volumes[i].Blue * scale;
colorA *= exp(-volumes[i].Alpha * volumes[i].Volume);
std::cout << colorR << " " << colorG << " " << colorB << " " << colorA << std::endl;
}
colorR /= colorA;
colorG /= colorA;
colorB /= colorA;
colorA /= colorA;
std::cout << "Final Color" << std::endl;
std::cout << colorR << " " << colorG << " " << colorB << " " << colorA << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CgpzdHJ1Y3QgVm9sdW1lT2JqZWN0CnsKCWZsb2F0IFJlZCwgR3JlZW4sIEJsdWUsIEFscGhhLCBWb2x1bWU7CgoJVm9sdW1lT2JqZWN0KGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhLCBmbG9hdCB2b2x1bWUpIDogUmVkKHJlZCksIEdyZWVuKGdyZWVuKSwgQmx1ZShibHVlKSwgQWxwaGEoYWxwaGEpLCBWb2x1bWUodm9sdW1lKQoJewoJfQp9OwoKaW50IG1haW4oKQp7CglWb2x1bWVPYmplY3Qgdm9sdW1lc1tdID0geyBWb2x1bWVPYmplY3QoMSwgMCwgMCwgMC41ZiwgMC4yNWYpLCBWb2x1bWVPYmplY3QoMSwgMCwgMCwgMC41ZiwgMC41ZiksIFZvbHVtZU9iamVjdCgxLCAwLCAwLCAwLjVmLCAwLjI1ZikgfTsKCglmbG9hdCBjb2xvclIgPSAwOwoJZmxvYXQgY29sb3JHID0gMDsKCWZsb2F0IGNvbG9yQiA9IDA7CglmbG9hdCBjb2xvckEgPSAxOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKQoJewoJCWZsb2F0IHNjYWxlID0gY29sb3JBIC0gY29sb3JBICogZXhwKC12b2x1bWVzW2ldLkFscGhhICogdm9sdW1lc1tpXS5Wb2x1bWUpOwoJCXN0ZDo6Y291dCA8PCAiU2NhbGU6ICIgPDwgc2NhbGUgPDwgc3RkOjplbmRsOwoJCWNvbG9yUiArPSB2b2x1bWVzW2ldLlJlZCAqIHNjYWxlOwoJCWNvbG9yRyArPSB2b2x1bWVzW2ldLkdyZWVuICogc2NhbGU7CgkJY29sb3JCICs9IHZvbHVtZXNbaV0uQmx1ZSAqIHNjYWxlOwoJCWNvbG9yQSAqPSBleHAoLXZvbHVtZXNbaV0uQWxwaGEgKiB2b2x1bWVzW2ldLlZvbHVtZSk7CgkJc3RkOjpjb3V0IDw8IGNvbG9yUiA8PCAiICIgPDwgY29sb3JHIDw8ICIgIiA8PCBjb2xvckIgPDwgIiAiIDw8IGNvbG9yQSA8PCBzdGQ6OmVuZGw7Cgl9Cgljb2xvclIgLz0gY29sb3JBOwoJY29sb3JHIC89IGNvbG9yQTsKCWNvbG9yQiAvPSBjb2xvckE7Cgljb2xvckEgLz0gY29sb3JBOwoJc3RkOjpjb3V0IDw8ICJGaW5hbCBDb2xvciIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGNvbG9yUiA8PCAiICIgPDwgY29sb3JHIDw8ICIgIiA8PCBjb2xvckIgPDwgIiAiIDw8IGNvbG9yQSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==