Ballistic solvers, for those that use them.

Matt --=--
I believe that you are hitting all of the right buttons in your quest to make this ballistic solver the best one out there.
So, with that in mind, most, if not all users are on a mobile device. Meaning that all of the information needs to be readable in various weather conditions, sun being the most difficult to see the device screen.
When finalizing your solver, that might be something to consider. Strelok for instance has a tough to read screen in the sun (SoCal).
Perhaps make a few screen colorization options or simply make it readable under most weather conditions.

mike

The cool thing is, if I ever release this to the public, you could customize the UI to your liking without much effort. I've considered a light and dark mode, which on mobile, is already available by default through google sheets.

I'm not out to compete with the other solvers out there, the challenge here to me is making one that is comparable to existing solvers, with a spreadsheet, which is accessible via all operating systems/devices without requiring cross-platform development on my end, nor the same solver installed on different devices for the user end. This means I can setup the solver on pc, analyze it on pc, and use it on mobile out in the field, all with the same saved sets of data that I don't have to enter in for each device.

The only alternative to the latter of the above statement, is hosting a server and having logins for each user that stores your data and loads it to each device, which...where as in this iteration, its self hosted via google drive.

Without the ability to get the devices GPS automatically, connect to weather devices, or use the mobile devices internal compass / camera for angles, this spreadsheet will always be gimped in some way. So in the end, its still just a fun project by myself, for myself, that I may or may not share with others once I am happy with the end results. I never plan on using those dongles/devices for weather nor do I care for internal compass/camera, but getting the phones GPS coordinates on the fly would be nice.


-Matt
 
Added dope at each mil from -1 to 7 that is over half the distance of your second zero. Not sure I am a huge fan as I never used this feature on Sterlok or Mero myself, I only care about target distance not every mil drop distance. Target below set at 100 yard. With as limiting as google sheet charts is, I don't think I'll keep this feature. Could also add the drops below half way between 1st and 2nd zero on the right but I feel a proper setup has far zero optimized for 'battle zero' and it would only clutter the reticle view more.

Two examples below, left JSB mk ll @ 876 fps , right h&n 15.89 @ 630 fps, shot placement doesn't show on right since both targets are set at 100 yards and the drop off is greater than 8 mils for h&n.

1729542373800.png
1729542926894.png



-Matt
 
Its kinda growing on me after changing the transparency, wish I could make the white line below transparent. Alternatively I could offset the various ranges at different mildots without wind which would allow me to remove the white dashes by centering the distance labels within their dots. The devs at google are bums for not making the dash take on the same transparency as the data labels/dots.



1729563058482.png


Without wind included in each distance, which allows the removal of the white lines :


1729563652514.png


With wind and dotted line, keeping the distance marks central to where the shot placement would be:

1729570179124.png


Offset distance markers and line including wind for shot placements.


1729565889281.png


#5, offset distances with faint dots that include wind (and optionally spin drift)

1729572760960.png


4 Looks, which one is best, hmm. I kinda dig # 5 myself. Lots of ways one could go with this...
 
Last edited:
Matt --=--

I too like #5 best.
Likely would not use the varying wind zones though.
You have a LOT in a short time....and it's GOOD!

mike

Yea I think 99.99% of the people using a ballistic solver won't use the wind zones. But I found the UI side of it a challenge enough to want to endure integrating it. The way I did it does not interfere with the current UI flow of things, its even a bit of a hidden feature.

#5 is probably here to stay, won't add more distances, as Sterlok and Mero display both full mil and half mil ranges, and Mero goes down to 4~ yards, I replicated feature and found those distances just...not useful, I am not shooting at 4-8 yards and if I am, I wouldn't be looking thru a scope, so less clutter for my already over-stimulated mind. Half mil distance are half way between ful mil, ie: 76 yard at 6 mil and 82 at 7 mil = 79 mil at 6.5, simple math, no need to over-saturate the reticle view.


-Matt
 
Had to take a step back so to speak with design. The overlays I did on the reticle weren't compatible with mobile. Just a quirk of google sheets where graphs with transparent backgrounds show up as white opposed to transparent on mobile...so, the current look is:

(Also had to move all the info I displayed around the reticle)


1729654896122.png


The above screenshot is PC, but looks identical 1:1 in mobile as you see above. I'll keep the code and the overlays on the side in case google devs ever get their stuff together, easy enough to re-introduce if they fixed graph transparency on mobile. I wasn't that attached to it anyways, as it takes away from my 'spread' feature which if I had to choose between the two, I would take the spread version opposed to the show entire trajectory version since that is unique to my solver, plus, the graph below the reticle shows hold over for every 10 yards, which can be set at custom range/increments.

I'll be taking some time off from further development and refinement, as winter is around the corner and I'll have plenty of time to finalize things then. Don't be surprised to either hear continued ramblings as I develop this, or nothing at all for a month or two.

Until then, hopefully some of my design features inspire other designs, such as the vertical spread visual feature, vertical+horizontal spread visual feature, target PBR and POA margin of error.


*edit*: light mode mobile:

1729657396787.png



-Matt
 
Last edited:
  • Like
Reactions: Revoman
Today's look, lots of refinement done on primary UI, trying to optimize both screen space for mobile and maximum usable data.


1729831291276.png





Other progress made today:


1729832814833.png


Current work flow has you lock in zero for a gun/projectile based on a profile that can include or exclude the weather. Each gun (up to 10 guns) can store 5 profiles. I could expand that but not worried currently.


-Matt
 
Wrote some fun code tonight to find ballistic coefficient using my solver. It searches trajectory data using the selected drag law to determine which ballistic coefficient within a thousandths, matches your inputs, being distance, velocity 1 and velocity 2. This means I can 'true' my BC to my solver. I believe Chairgun and MERO use similar methods to determine ballistic coefficient from the same inputs as well.

This has been my best formulation to determine ballistic coefficient to date.

What it does:
Loops through every tenth bc from .01 to .2 and obtain trajectory data at the provided distance. Closest match to second velocity fetched.

Rinse repeat for hundredth, thousandths, then ten thousandths. Best matching ballistic coefficient for given parameters obtained.

Tested with GA, GA2, RA4, SLG0, SLG1, G1, against MERO's bc calculator and all lines up 1:1. Another mystery solved.


Code snippet:


function FindBC(DragFunction, Vi, SightHeight, ShootingAngle, ZAngle, WindSpeed, WindAngle, windVar, targetDistanceYards, pelletWeightGrains, zeroRangeYards, DensityFactor, Vi2) {
const ptr = new Array(2); // Preallocate space for outputs (only what is needed)
const dragCoefficientsTenths = Array.from({ length: 20 }, (_, i) => (i + 1) * 0.01); // Drag coefficients from 0.01 to 0.2
const dragCoefficientsHundredths = Array.from({ length: 200 }, (_, i) => (i + 1) * 0.001); // Drag coefficients from 0.001 to 0.2
const dragCoefficientsThousandths = Array.from({ length: 2000 }, (_, i) => (i + 1) * 0.0001); // Drag coefficients from 0.0001 to 0.2
const dragCoefficientsTenThousandths = Array.from({ length: 20000 }, (_, i) => (i + 1) * 0.00001); // Drag coefficients from 0.00001 to 0.1
let closestVelocity = null;
let closestDragCoefficientTenth = null;
// Step 1: Find the closest drag coefficient in tenths
for (const DragCoefficient of dragCoefficientsTenths) {
const result = SolveSingle(DragFunction, DragCoefficient, Vi, SightHeight, ShootingAngle, ZAngle, WindSpeed, WindAngle, windVar, targetDistanceYards, pelletWeightGrains, zeroRangeYards, DensityFactor);
if (result && result[7] !== undefined) {
const currentVelocity = parseFloat(result[7]);
if (closestVelocity === null || Math.abs(currentVelocity - Vi2) < Math.abs(closestVelocity - Vi2)) {
closestVelocity = currentVelocity;
closestDragCoefficientTenth = DragCoefficient;
}
}
}
const lowerBoundHundredth = Math.max(0.01, closestDragCoefficientTenth - 0.005);
const upperBoundHundredth = Math.min(0.2, closestDragCoefficientTenth + 0.005);
let closestDragCoefficientHundredth = null;
for (const DragCoefficient of dragCoefficientsHundredths) {
if (DragCoefficient >= lowerBoundHundredth && DragCoefficient <= upperBoundHundredth) {
const result = SolveSingle(DragFunction, DragCoefficient, Vi, SightHeight, ShootingAngle, ZAngle, WindSpeed, WindAngle, windVar, targetDistanceYards, pelletWeightGrains, zeroRangeYards, DensityFactor);
if (result && result[7] !== undefined) {
const currentVelocity = parseFloat(result[7]);
if (closestDragCoefficientHundredth === null || Math.abs(currentVelocity - Vi2) < Math.abs(closestVelocity - Vi2)) {
closestVelocity = currentVelocity;
closestDragCoefficientHundredth = DragCoefficient;
}
}
}
}
const lowerBoundThousandth = Math.max(0.001, closestDragCoefficientHundredth - 0.0005);
const upperBoundThousandth = Math.min(0.2, closestDragCoefficientHundredth + 0.0005);
let closestDragCoefficientThousandth = null;
for (const DragCoefficient of dragCoefficientsThousandths) {
if (DragCoefficient >= lowerBoundThousandth && DragCoefficient <= upperBoundThousandth) {
const result = SolveSingle(DragFunction, DragCoefficient, Vi, SightHeight, ShootingAngle, ZAngle, WindSpeed, WindAngle, windVar, targetDistanceYards, pelletWeightGrains, zeroRangeYards, DensityFactor);
if (result && result[7] !== undefined) {
const currentVelocity = parseFloat(result[7]);
if (closestDragCoefficientThousandth === null || Math.abs(currentVelocity - Vi2) < Math.abs(closestVelocity - Vi2)) {
closestVelocity = currentVelocity;
closestDragCoefficientThousandth = DragCoefficient;
}
}
}
}
const lowerBoundTenThousandth = Math.max(0.00001, closestDragCoefficientThousandth - 0.00005);
const upperBoundTenThousandth = Math.min(0.2, closestDragCoefficientThousandth + 0.00005);
let closestDragCoefficientTenThousandth = null;
for (const DragCoefficient of dragCoefficientsTenThousandths) {
if (DragCoefficient >= lowerBoundTenThousandth && DragCoefficient <= upperBoundTenThousandth) {
const result = SolveSingle(DragFunction, DragCoefficient, Vi, SightHeight, ShootingAngle, ZAngle, WindSpeed, WindAngle, windVar, targetDistanceYards, pelletWeightGrains, zeroRangeYards, DensityFactor);
if (result && result[7] !== undefined) {
const currentVelocity = parseFloat(result[7]);
if (closestDragCoefficientTenThousandth === null || Math.abs(currentVelocity - Vi2) < Math.abs(closestVelocity - Vi2)) {
closestVelocity = currentVelocity;
closestDragCoefficientTenThousandth = DragCoefficient;
}
}
}
}
ptr[0] = closestDragCoefficientTenThousandth;
return ptr;
}


-Matt
 
Last edited:
  • Like
Reactions: Airgun-hobbyist
Dayum Matt!

mike

Truth be told, I cannot formulate ballistic co-efficient 100% any other way via 2 velocities at a given distance without solving in this manner to my knowledge. You need to have a functional, and precise ballistic solver to brute force it with data obtained from field testing.

Outside of that you're pissing in the wind. Ballistic co-efficient, more like ballistic calibration! ;)

I also did test my current method against MERO's bc calculator and results are identical between the two.

-Matt
 
My "Dayum Matt" was simply in marvel of that formula. Quite impressive!
I have also read your other thread regarding BC and understand the issue in asking for a formula to attain BC, which cannot be done without the proper data input and "brute force" as you put it.
None-the-less, nicely done Matt!

mike

Demystifying how BC is calculated from 2 velocities at a given distance is pretty neat, it just came to me, so I whipped up the above code and low and behold, it lined up 1:1 with MERO/Chairgun.

-Matt
 
  • Like
Reactions: Airgun-hobbyist
Demystifying how BC is calculated from 2 velocities at a given distance is pretty neat, it just came to me, so I whipped up the above code and low and behold, it lined up 1:1 with MERO/Chairgun.

-Matt
This is a good looking program and graphics. When you're done proving and testing theory on it, please put it into an app format for the two major phone operating systems (apple and android) for the masses. You build it, we will buy it.
 
Last edited:
This is a good looking program and graphics. When you're done proving and testing theory on it, please put it into an app format for the two major phone operating systems (apple and android) for the masses. You build it, well buy it.

I don't have current interests in developing apple or android specific apps, because that requires support and frequent updates as the os's update, along with a litany of other requirements / learning curves. Not enough bread for all this butter.


In its current form its accessible via apple, android, windows pc, linux, tablet, ect, however remaining private for now.


Current look:

-Updates:

--Added Crosswind Jump as an option to turn on/off
--added menu adjustments that allow user to tweak 4 settings) wind variance, fps variance, muzzle vel, killzone via 2 menus. (All values are stored, but as you select the menu you can stage those to be adjusted on the fly)

1730612168267.png

1730612177351.png



Dark vs Light mode:

1730612363109.png
1730612473213.png




-Matt