From 004ce262fb217afd0fa48efa402505f4a068f0bb Mon Sep 17 00:00:00 2001 From: Luke Pighetti Date: Fri, 5 Sep 2025 08:33:20 -0400 Subject: [PATCH 1/7] add ra4 drag function --- lib/src/drag.dart | 100 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/lib/src/drag.dart b/lib/src/drag.dart index de23897..e4f8b69 100644 --- a/lib/src/drag.dart +++ b/lib/src/drag.dart @@ -7,6 +7,7 @@ enum DragTableId { g8, gS, gC, + ra4, } typedef DragFunction = double Function(double mach); @@ -76,8 +77,10 @@ DragFunction dragFunctionFactory(DragTableId dragTable) { return (mach) => calculateByCurve(g8Table, g8Curve, mach); case DragTableId.gS: return (mach) => calculateByCurve(gSTable, gSCurve, mach); - default: - throw ArgumentError('Unknown drag table type'); + case DragTableId.gC: + throw UnimplementedError('$dragTable not implemented'); + case DragTableId.ra4: + return (mach) => calculateByCurve(ra4Table, ra4Curve, mach); } } @@ -742,6 +745,99 @@ List gSTable = [ List gSCurve = calculateCurve(gSTable); +// source: https://jbmballistics.com/ballistics/downloads/downloads.shtml +List ra4Table = [ + DataPoint(A: 0.000, B: 0.2283), + DataPoint(A: 0.050, B: 0.2283), + DataPoint(A: 0.100, B: 0.2282), + DataPoint(A: 0.150, B: 0.2281), + DataPoint(A: 0.200, B: 0.2281), + DataPoint(A: 0.250, B: 0.2281), + DataPoint(A: 0.300, B: 0.2281), + DataPoint(A: 0.350, B: 0.2281), + DataPoint(A: 0.400, B: 0.2281), + DataPoint(A: 0.450, B: 0.2281), + DataPoint(A: 0.500, B: 0.2281), + DataPoint(A: 0.550, B: 0.2281), + DataPoint(A: 0.600, B: 0.2281), + DataPoint(A: 0.650, B: 0.2281), + DataPoint(A: 0.700, B: 0.2288), + DataPoint(A: 0.725, B: 0.2296), + DataPoint(A: 0.750, B: 0.2307), + DataPoint(A: 0.775, B: 0.2320), + DataPoint(A: 0.800, B: 0.2334), + DataPoint(A: 0.825, B: 0.2359), + DataPoint(A: 0.850, B: 0.2389), + DataPoint(A: 0.875, B: 0.2480), + DataPoint(A: 0.900, B: 0.2604), + DataPoint(A: 0.925, B: 0.2819), + DataPoint(A: 0.950, B: 0.3111), + DataPoint(A: 0.975, B: 0.3496), + DataPoint(A: 1.000, B: 0.3975), + DataPoint(A: 1.025, B: 0.4530), + DataPoint(A: 1.050, B: 0.5010), + DataPoint(A: 1.075, B: 0.5476), + DataPoint(A: 1.100, B: 0.5719), + DataPoint(A: 1.125, B: 0.5895), + DataPoint(A: 1.150, B: 0.5943), + DataPoint(A: 1.175, B: 0.5933), + DataPoint(A: 1.200, B: 0.5881), + DataPoint(A: 1.225, B: 0.5810), + DataPoint(A: 1.250, B: 0.5736), + DataPoint(A: 1.275, B: 0.5690), + DataPoint(A: 1.300, B: 0.5651), + DataPoint(A: 1.325, B: 0.5629), + DataPoint(A: 1.350, B: 0.5609), + DataPoint(A: 1.375, B: 0.5591), + DataPoint(A: 1.400, B: 0.5575), + DataPoint(A: 1.425, B: 0.5558), + DataPoint(A: 1.450, B: 0.5543), + DataPoint(A: 1.475, B: 0.5527), + DataPoint(A: 1.500, B: 0.5513), + DataPoint(A: 1.525, B: 0.5499), + DataPoint(A: 1.550, B: 0.5485), + DataPoint(A: 1.575, B: 0.5472), + DataPoint(A: 1.600, B: 0.5460), + DataPoint(A: 1.625, B: 0.5449), + DataPoint(A: 1.650, B: 0.5438), + DataPoint(A: 1.675, B: 0.5428), + DataPoint(A: 1.700, B: 0.5419), + DataPoint(A: 1.725, B: 0.5410), + DataPoint(A: 1.750, B: 0.5401), + DataPoint(A: 1.775, B: 0.5393), + DataPoint(A: 1.800, B: 0.5385), + DataPoint(A: 1.825, B: 0.5377), + DataPoint(A: 1.850, B: 0.5369), + DataPoint(A: 1.875, B: 0.5361), + DataPoint(A: 1.900, B: 0.5354), + DataPoint(A: 1.925, B: 0.5346), + DataPoint(A: 1.950, B: 0.5338), + DataPoint(A: 2.000, B: 0.5323), + DataPoint(A: 2.100, B: 0.5294), + DataPoint(A: 2.200, B: 0.5267), + DataPoint(A: 2.300, B: 0.5240), + DataPoint(A: 2.400, B: 0.5216), + DataPoint(A: 2.500, B: 0.5193), + DataPoint(A: 2.600, B: 0.5170), + DataPoint(A: 2.650, B: 0.5160), + DataPoint(A: 2.700, B: 0.5149), + DataPoint(A: 2.800, B: 0.5129), + DataPoint(A: 2.900, B: 0.5109), + DataPoint(A: 3.000, B: 0.5091), + DataPoint(A: 3.100, B: 0.5074), + DataPoint(A: 3.200, B: 0.5058), + DataPoint(A: 3.300, B: 0.5043), + DataPoint(A: 3.400, B: 0.5029), + DataPoint(A: 3.500, B: 0.5017), + DataPoint(A: 3.600, B: 0.5006), + DataPoint(A: 3.700, B: 0.4995), + DataPoint(A: 3.800, B: 0.4986), + DataPoint(A: 3.900, B: 0.4977), + DataPoint(A: 4.000, B: 0.4969), +]; + +List ra4Curve = calculateCurve(ra4Table); + List calculateCurve(List dataPoints) { List curve = []; int numPoints = dataPoints.length; From 15e4d78599abbd82f43f4fc0bd5836ce474c3131 Mon Sep 17 00:00:00 2001 From: Luke Pighetti Date: Fri, 5 Sep 2025 08:38:50 -0400 Subject: [PATCH 2/7] add GI drag table --- lib/src/drag.dart | 92 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/lib/src/drag.dart b/lib/src/drag.dart index e4f8b69..b343238 100644 --- a/lib/src/drag.dart +++ b/lib/src/drag.dart @@ -7,6 +7,7 @@ enum DragTableId { g8, gS, gC, + gI, ra4, } @@ -79,6 +80,8 @@ DragFunction dragFunctionFactory(DragTableId dragTable) { return (mach) => calculateByCurve(gSTable, gSCurve, mach); case DragTableId.gC: throw UnimplementedError('$dragTable not implemented'); + case DragTableId.gI: + return (mach) => calculateByCurve(gITable, gICurve, mach); case DragTableId.ra4: return (mach) => calculateByCurve(ra4Table, ra4Curve, mach); } @@ -745,7 +748,94 @@ List gSTable = [ List gSCurve = calculateCurve(gSTable); -// source: https://jbmballistics.com/ballistics/downloads/downloads.shtml +// source: https://jbmballistics.com/ballistics/downloads/text/mcgi.txt +List gITable = [ + DataPoint(A: 0.00, B: 0.2282), + DataPoint(A: 0.05, B: 0.2282), + DataPoint(A: 0.10, B: 0.2282), + DataPoint(A: 0.15, B: 0.2282), + DataPoint(A: 0.20, B: 0.2282), + DataPoint(A: 0.25, B: 0.2282), + DataPoint(A: 0.30, B: 0.2282), + DataPoint(A: 0.35, B: 0.2282), + DataPoint(A: 0.40, B: 0.2282), + DataPoint(A: 0.45, B: 0.2282), + DataPoint(A: 0.50, B: 0.2282), + DataPoint(A: 0.55, B: 0.2282), + DataPoint(A: 0.60, B: 0.2282), + DataPoint(A: 0.65, B: 0.2282), + DataPoint(A: 0.70, B: 0.2282), + DataPoint(A: 0.725, B: 0.2353), + DataPoint(A: 0.75, B: 0.2434), + DataPoint(A: 0.775, B: 0.2515), + DataPoint(A: 0.80, B: 0.2596), + DataPoint(A: 0.825, B: 0.2677), + DataPoint(A: 0.85, B: 0.2759), + DataPoint(A: 0.875, B: 0.2913), + DataPoint(A: 0.90, B: 0.3170), + DataPoint(A: 0.925, B: 0.3442), + DataPoint(A: 0.95, B: 0.3728), + DataPoint(A: 1.0, B: 0.4349), + DataPoint(A: 1.05, B: 0.5034), + DataPoint(A: 1.075, B: 0.5402), + DataPoint(A: 1.10, B: 0.5756), + DataPoint(A: 1.125, B: 0.5887), + DataPoint(A: 1.15, B: 0.6018), + DataPoint(A: 1.175, B: 0.6149), + DataPoint(A: 1.20, B: 0.6279), + DataPoint(A: 1.225, B: 0.6418), + DataPoint(A: 1.25, B: 0.6423), + DataPoint(A: 1.30, B: 0.6423), + DataPoint(A: 1.35, B: 0.6423), + DataPoint(A: 1.40, B: 0.6423), + DataPoint(A: 1.45, B: 0.6423), + DataPoint(A: 1.50, B: 0.6423), + DataPoint(A: 1.55, B: 0.6423), + DataPoint(A: 1.60, B: 0.6423), + DataPoint(A: 1.625, B: 0.6407), + DataPoint(A: 1.65, B: 0.6378), + DataPoint(A: 1.70, B: 0.6321), + DataPoint(A: 1.75, B: 0.6266), + DataPoint(A: 1.80, B: 0.6213), + DataPoint(A: 1.85, B: 0.6163), + DataPoint(A: 1.90, B: 0.6113), + DataPoint(A: 1.95, B: 0.6066), + DataPoint(A: 2.00, B: 0.6020), + DataPoint(A: 2.05, B: 0.5976), + DataPoint(A: 2.10, B: 0.5933), + DataPoint(A: 2.15, B: 0.5891), + DataPoint(A: 2.20, B: 0.5850), + DataPoint(A: 2.25, B: 0.5811), + DataPoint(A: 2.30, B: 0.5773), + DataPoint(A: 2.35, B: 0.5733), + DataPoint(A: 2.40, B: 0.5679), + DataPoint(A: 2.45, B: 0.5626), + DataPoint(A: 2.50, B: 0.5576), + DataPoint(A: 2.60, B: 0.5478), + DataPoint(A: 2.70, B: 0.5386), + DataPoint(A: 2.80, B: 0.5298), + DataPoint(A: 2.90, B: 0.5215), + DataPoint(A: 3.00, B: 0.5136), + DataPoint(A: 3.10, B: 0.5061), + DataPoint(A: 3.20, B: 0.4989), + DataPoint(A: 3.30, B: 0.4921), + DataPoint(A: 3.40, B: 0.4855), + DataPoint(A: 3.50, B: 0.4792), + DataPoint(A: 3.60, B: 0.4732), + DataPoint(A: 3.70, B: 0.4674), + DataPoint(A: 3.80, B: 0.4618), + DataPoint(A: 3.90, B: 0.4564), + DataPoint(A: 4.00, B: 0.4513), + DataPoint(A: 4.20, B: 0.4415), + DataPoint(A: 4.40, B: 0.4323), + DataPoint(A: 4.60, B: 0.4238), + DataPoint(A: 4.80, B: 0.4157), + DataPoint(A: 5.00, B: 0.4082), +]; + +List gICurve = calculateCurve(gITable); + +// source: https://jbmballistics.com/ballistics/downloads/text/ra4.txt List ra4Table = [ DataPoint(A: 0.000, B: 0.2283), DataPoint(A: 0.050, B: 0.2283), From fae295616ca1c681db2e1ea84068be374910f976 Mon Sep 17 00:00:00 2001 From: Luke Pighetti Date: Fri, 5 Sep 2025 08:42:45 -0400 Subject: [PATCH 3/7] add sources --- lib/src/drag.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/src/drag.dart b/lib/src/drag.dart index b343238..9c5f919 100644 --- a/lib/src/drag.dart +++ b/lib/src/drag.dart @@ -151,6 +151,7 @@ class CurvePoint { const double pir = 2.08551e-04; +// source: https://jbmballistics.com/ballistics/downloads/text/mcg1.txt List g1Table = [ DataPoint(A: 0.00, B: 0.2629), DataPoint(A: 0.05, B: 0.2558), @@ -235,6 +236,7 @@ List g1Table = [ List g1Curve = calculateCurve(g1Table); +// source: https://jbmballistics.com/ballistics/downloads/text/mcg7.txt List g7Table = [ DataPoint(A: 0.00, B: 0.1198), DataPoint(A: 0.05, B: 0.1197), @@ -324,6 +326,7 @@ List g7Table = [ List g7Curve = calculateCurve(g7Table); +// source: https://jbmballistics.com/ballistics/downloads/text/mcg2.txt List g2Table = [ DataPoint(A: 0.00, B: 0.2303), DataPoint(A: 0.05, B: 0.2298), @@ -414,6 +417,7 @@ List g2Table = [ List g2Curve = calculateCurve(g2Table); +// source: https://jbmballistics.com/ballistics/downloads/text/mcg5.txt List g5Table = [ DataPoint(A: 0.00, B: 0.1710), DataPoint(A: 0.05, B: 0.1719), @@ -495,6 +499,7 @@ List g5Table = [ List g5Curve = calculateCurve(g5Table); +// source: https://jbmballistics.com/ballistics/downloads/text/mcg6.txt List g6Table = [ DataPoint(A: 0.00, B: 0.2617), DataPoint(A: 0.05, B: 0.2553), @@ -579,6 +584,7 @@ List g6Table = [ List g6Curve = calculateCurve(g6Table); +// https://jbmballistics.com/ballistics/downloads/text/mcg8.txt List g8Table = [ DataPoint(A: 0.00, B: 0.2105), DataPoint(A: 0.05, B: 0.2105), From bff0a4247974370a5b045ff18e730515dd7357ef Mon Sep 17 00:00:00 2001 From: Luke Pighetti Date: Fri, 5 Sep 2025 08:56:06 -0400 Subject: [PATCH 4/7] add comments to DragTableId values --- lib/src/drag.dart | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/src/drag.dart b/lib/src/drag.dart index 9c5f919..8bee252 100644 --- a/lib/src/drag.dart +++ b/lib/src/drag.dart @@ -1,13 +1,27 @@ enum DragTableId { + /// FB Spitzer g1, + g2, + g5, + g6, + + /// Boattail g7, + g8, + + /// Sphere (musket ball) gS, + + /// Cylinder (wad cutter) gC, + gI, + + /// .22LR ra4, } From 099f09ab1e8e78ba32f48370834a8018fc44e278 Mon Sep 17 00:00:00 2001 From: Luke Pighetti Date: Fri, 5 Sep 2025 08:59:57 -0400 Subject: [PATCH 5/7] add gA airgun pellet table --- lib/src/drag.dart | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/lib/src/drag.dart b/lib/src/drag.dart index 8bee252..35dd318 100644 --- a/lib/src/drag.dart +++ b/lib/src/drag.dart @@ -21,6 +21,9 @@ enum DragTableId { gI, + /// Airgun pellets + gA, + /// .22LR ra4, } @@ -96,6 +99,8 @@ DragFunction dragFunctionFactory(DragTableId dragTable) { throw UnimplementedError('$dragTable not implemented'); case DragTableId.gI: return (mach) => calculateByCurve(gITable, gICurve, mach); + case DragTableId.gA: + return (mach) => calculateByCurve(gATable, gACurve, mach); case DragTableId.ra4: return (mach) => calculateByCurve(ra4Table, ra4Curve, mach); } @@ -948,6 +953,49 @@ List ra4Table = [ List ra4Curve = calculateCurve(ra4Table); +// source: https://www.gatewaytoairguns.org/GTA/index.php?topic=159961 +List gATable = [ + DataPoint(A: 0.000, B: 0.250), + DataPoint(A: 0.100, B: 0.235), + DataPoint(A: 0.200, B: 0.221), + DataPoint(A: 0.300, B: 0.207), + DataPoint(A: 0.400, B: 0.196), + DataPoint(A: 0.500, B: 0.189), + DataPoint(A: 0.600, B: 0.189), + DataPoint(A: 0.700, B: 0.202), + DataPoint(A: 0.800, B: 0.241), + DataPoint(A: 0.900, B: 0.329), + DataPoint(A: 1.000, B: 0.488), + DataPoint(A: 1.100, B: 0.597), + DataPoint(A: 1.200, B: 0.649), + DataPoint(A: 1.300, B: 0.669), + DataPoint(A: 1.400, B: 0.672), + DataPoint(A: 1.500, B: 0.667), + DataPoint(A: 1.600, B: 0.657), + DataPoint(A: 1.700, B: 0.644), + DataPoint(A: 1.800, B: 0.630), + DataPoint(A: 1.900, B: 0.616), + DataPoint(A: 2.000, B: 0.602), + DataPoint(A: 2.100, B: 0.589), + DataPoint(A: 2.200, B: 0.577), + DataPoint(A: 2.300, B: 0.566), + DataPoint(A: 2.400, B: 0.556), + DataPoint(A: 2.500, B: 0.548), + DataPoint(A: 2.600, B: 0.540), + DataPoint(A: 2.700, B: 0.534), + DataPoint(A: 2.800, B: 0.529), + DataPoint(A: 2.900, B: 0.524), + DataPoint(A: 3.000, B: 0.521), + DataPoint(A: 3.100, B: 0.521), + DataPoint(A: 3.200, B: 0.517), + DataPoint(A: 3.300, B: 0.514), + DataPoint(A: 3.400, B: 0.510), + DataPoint(A: 3.500, B: 0.507), + DataPoint(A: 3.600, B: 0.503), +]; + +List gACurve = calculateCurve(ra4Table); + List calculateCurve(List dataPoints) { List curve = []; int numPoints = dataPoints.length; From d5c6729eaca750ed986e6363339bfeaa8ca4d1cd Mon Sep 17 00:00:00 2001 From: Luke Pighetti Date: Fri, 5 Sep 2025 09:01:47 -0400 Subject: [PATCH 6/7] clean up docs --- lib/src/drag.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/drag.dart b/lib/src/drag.dart index 35dd318..03a9829 100644 --- a/lib/src/drag.dart +++ b/lib/src/drag.dart @@ -13,18 +13,18 @@ enum DragTableId { g8, - /// Sphere (musket ball) + /// Sphere gS, - /// Cylinder (wad cutter) + /// Cylinder gC, gI, - /// Airgun pellets + /// Airgun Pellets gA, - /// .22LR + /// 22 LR ra4, } From bac7c1c3296767a9bbd393ec9c0facce0368b75c Mon Sep 17 00:00:00 2001 From: Luke Pighetti Date: Sun, 7 Sep 2025 12:10:10 -0400 Subject: [PATCH 7/7] Update lib/src/drag.dart Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- lib/src/drag.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/drag.dart b/lib/src/drag.dart index 03a9829..b2799db 100644 --- a/lib/src/drag.dart +++ b/lib/src/drag.dart @@ -994,7 +994,7 @@ List gATable = [ DataPoint(A: 3.600, B: 0.503), ]; -List gACurve = calculateCurve(ra4Table); +List gACurve = calculateCurve(gATable); List calculateCurve(List dataPoints) { List curve = [];