This is a quick demo and code listing I used to calculate the volume of a tank that is a combination of box, cylinder, and sphere shapes. The controller is a Red Lion G3 Graphite.
float TankCalcs.FindVolume(int TankType, float FluidHeight) //define local variables float TankRadius; float TankLength; float TankD; float LegSize; float LegHeight; float LegStaticVol; float FluidArea; float VolumeF; float VolumeL; //units are inches and gallons //set tank parameters based on TankType switch( TankType ) { case 225: TankRadius := 18.75; TankLength := 41.75; TankD := 37.5; LegSize := 38.0; LegHeight := 19.0; LegStaticVol := 10.42; break; case 335: TankRadius := 22.0; TankLength := 43.5; TankD := 43.5; LegSize := 43.0; LegHeight := 22.0; LegStaticVol := 12.06; break; default: TankRadius := 0.0; TankLength := 0.0; TankD := 0.0; LegSize := 0.0; LegHeight := 0.0; LegStaticVol := 0.0; break; } //calculate the area of the fluid based on level and radius of tank FluidArea := TankRadius*TankRadius*acos((TankRadius-FluidHeight)/TankRadius)-(TankRadius-FluidHeight)*Sqrt(2*TankRadius*FluidHeight-FluidHeight*FluidHeight); //calculate the volume of the part of the tank based on ASME flanged and dished formula VolumeF := (TankLength*FluidArea+0.215483*FluidHeight*FluidHeight*(1.5*TankD-FluidHeight))*0.00433; //calculate the volume of the leg portion of the tank if( FluidHeight <= LegHeight ) VolumeL := ((FluidHeight*LegSize-FluidArea)*15)*0.00433; else VolumeL := LegStaticVol; //total volume return VolumeF + VolumeL;