createDragModelMultiBC function

DragModel createDragModelMultiBC({
  1. required List<BCPoint> bcPoints,
  2. required dynamic dragTable,
  3. Weight? weight,
  4. Distance? diameter,
  5. Distance? length,
})

Implementation

DragModel createDragModelMultiBC({
  required List<BCPoint> bcPoints,
  required dynamic dragTable,
  Weight? weight,
  Distance? diameter,
  Distance? length,
}) {
  final wObj = weight ?? Weight.grain(0);
  final dObj = diameter ?? Distance.inch(0);

  final double bc = (wObj.raw > 0 && dObj.raw > 0)
      ? calculateSectionalDensity(wObj.in_(Unit.grain), dObj.in_(Unit.inch))
      : 1.0;

  final List<DragDataPoint> sourcePoints = (dragTable is DragTable)
      ? dragTable.points
      : makeDataPoints(dragTable as List);

  final sortedBCPoints = List<BCPoint>.from(bcPoints)
    ..sort((a, b) => a.mach.compareTo(b.mach));

  final bcFactors = linearInterpolation(
    sourcePoints.map((p) => p.mach).toList(),
    sortedBCPoints.map((p) => p.mach).toList(),
    sortedBCPoints.map((p) => p.bc / bc).toList(),
  );

  final adjustedTable = List<DragDataPoint>.generate(sourcePoints.length, (i) {
    final factor = bcFactors[i];
    return (
      mach: sourcePoints[i].mach,
      cd: factor > 0 ? sourcePoints[i].cd / factor : sourcePoints[i].cd,
    );
  });

  return DragModel(
    bc: bc,
    dragTable: adjustedTable,
    weight: wObj,
    diameter: dObj,
    length: length,
  );
}