I think what you are finding with your linear equation is the same thing you could observe with a very simple test set-up using a pulse generator and amplifier to drive the motor "manually". There are two effects taking place in the stepping motor.
First: Assuming the motor is at rest on one of its poles, it is being held there by the remnant magnetism of the pole pieces comprised of the stator and rotor. In order to get the rotor to break away from this condition, it must be activated for a certain amount of time with a certain amount of force. The force comes from the current driven thru the coil(s), and will of course be variable with the magnitude of that current. The TIME has to be long enough to overcome the attractive force of the current (i.e. present) rotor position to the pole and also long enough that the inertia developed in the rotor by the applied force will allow it to "jump" or "coast" or be magnetically attracted to the next pole, in sequence, by that "target" pole's remnant magnetism. This is the fixed "C" factor in your equation.
What is lacking in your equation is the magnitude of the applied current and the "force factor" of your stepper motor. That is, how the magnitude of the electric current is converted to a magnitude of magnetic attractive or repulsive force. You would have to figure this out empircally in a similar manner to how you have figured out your present equation. You would probably end up with a family of equations, one for each drive current. If you plan on using a fixed drive current, your single equation will be adequate.
Once you have enough minimum drive pulse width to get the stepper motor to "jump" poles, the rest is merely repetition rate. That is, how often you apply the pulses to the drive coils. That's your "M" coefficient.
As another commenter has pointed out you are "lacking" a second delay in your loop. At least by traditional methods of this type of timed drive scheme. Nonetheless, your drive scheme has a "Drive - Delay with Drive - Very Fast Idle - Drive - Delay with Drive - Very Fast Idle - etc..." sequence. Since your Idle command is merely stepping the drive sequencer to its next drive state, you are never allowing the rotor to come to a complete stop. Or, the amount of time it is stopping is being dictated by the amount of time the Drive pulse is "over driving". That is, the time the coils are being driven while the rotor is properly positioned over the "target" pole. This produces uneccessary heat because it is producing no rotor motion, just resistive loss in the coils. If you include that additional dwell delay in your loop you will likely find that you are expending less energy to rotate the motor. You will also have to recalculate your "M" coefficient, and maybe even your "C" offset factor. The additional delay provides a defined idle time.
If you have a strobe light you can learn a lot about the rotor movement with respect to your drive pulses by attaching a disk to the rotor shaft, marking the disk with a few equally spaced white "spoke" marks, and then triggering the strobe light from your drive pulses, or from auxilliary microcontroller output pulses which you can vary with respect to the main drive pulses.
By "properly" I mean smoothly, quietly and efficiently. "Smooth" means the radial motion is linear and not a jerky stop-&-stop sequence. "Quietly" means the motor is not chattering as it runs because it is not running smoothly. "Efficient" means you are allowing only enough drive time to get the motion you need and not "overdriving" (as I described above) and thereby merely adding additional heat to the motor and wasting supply current and energy. Part of the art of applying stepper motors is determining which of these three performance factors are important to your specific application and tailoring the drive profile to optimize these operational qualities of smoothness, quietness and efficiency.