@orbat-mapper/control-measures 0.2.0-alpha.22 → 0.2.0-alpha.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -508,10 +508,11 @@ declare const unproject: (x: number, y: number) => Position;
508
508
  /**
509
509
  * Great-circle distance in meters between two lon/lat positions (haversine on
510
510
  * the WGS84 mean-radius sphere). Accurate at all scales — use this for
511
- * measurement readouts (segment lengths, radii). Note the deliberate
512
- * asymmetry with generation: generators build geometry in projected Web
513
- * Mercator meters, so at high latitudes a graphic's Mercator dimensions
514
- * exceed the true ground distance this returns.
511
+ * measurement readouts (segment lengths, radii). Most generators still build
512
+ * geometry in projected Web Mercator meters, so at high latitudes a graphic's
513
+ * Mercator dimensions can exceed the true ground distance this returns; the
514
+ * generic circle is the exception — it samples at constant geodesic radius,
515
+ * so its ring and this readout agree exactly.
515
516
  */
516
517
  declare const haversineDistance: (a: Position, b: Position) => number;
517
518
  //#endregion
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as ObstacleBypassDifficultOptions, $n as StrongPointOptions, $t as SupportByFireOptions, A as roundToFixed, An as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Ar as TextAmplifiers, At as DEFAULT_TACTICAL_ARROW_OPTIONS, B as isKind, Bn as ControlMeasureRender, Bt as BlockMissionTaskOptions, C as BaselineFrame, Cn as computeInitialWidthPoint, Cr as AmplifierPlacements, Ct as ScreenOptions, D as createBaselineFrame, Dn as PickupZoneOptions, Dr as TEXT_AMPLIFIER_FIELDS, Dt as DelayOptions, E as BaselineFrameOrigin, En as DEFAULT_PICKUP_ZONE_OPTIONS, Er as LabelPlacementOverride, Et as DEFAULT_DELAY_OPTIONS, F as freezeOrientationOptions, Fn as DEFAULT_AREA_DEFENSE_OPTIONS, Fr as ControlMeasureDrawRule, Ft as DEFAULT_CANALIZE_OPTIONS, G as OptionsByKind, Gn as PrincipalDirectionOfFireOptions, Gt as HandoverLineOptions, H as CONTROL_MEASURE_METADATA, Hn as StyleHints, Ht as BattleHandoverLineOptions, I as RenderOptions, In as DEFAULT_ENCIRCLEMENT_OPTIONS, It as BypassOptions, J as getDefaultOptions, Jn as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, Jt as DEFAULT_FLOT_OPTIONS, K as getControlMeasureMetadata, Kn as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, Kt as DEFAULT_PHASE_LINE_OPTIONS, L as renderControlMeasure, Ln as EncirclementOptions, Lt as DEFAULT_BYPASS_OPTIONS, M as SimpleStyleRender, Mn as AssemblyAreaOptions, Mr as normalizeTextAmplifiers, Mt as ClearOptions, N as toSimpleStyle, Nn as DEFAULT_ASSEMBLY_AREA_OPTIONS, Nr as resolveAmplifierPlacement, Nt as DEFAULT_CLEAR_OPTIONS, O as EPSILON, On as DEFAULT_LANDING_ZONE_OPTIONS, Or as TextAmplifierField, Ot as CoverOptions, P as resolveStyleHints, Pn as AreaDefenseOptions, Pr as AnchorTransformEvent, Pt as CanalizeOptions, Q as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, Qn as DEFAULT_STRONG_POINT_OPTIONS, Qt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, R as ControlMeasure, Rn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Rt as BreachOptions, S as snapToMidpointPerpendicular, Sn as calculateMetrics, Sr as AmplifierPlacement, St as DEFAULT_SCREEN_OPTIONS, T as BaselineFrameOptions, Tn as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, Tr as GeneratedLabelKey, Tt as GuardOptions, U as ControlMeasureId, Un as controlMeasureIdFromFeature, Ut as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, V as CONTROL_MEASURE_IDS, Vn as FeaturePartProps, Vt as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, W as ControlMeasureKind, Wn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, Wt as DEFAULT_HANDOVER_LINE_OPTIONS, X as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, Xn as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, Xt as AttackByFireOptions, Y as listControlMeasureMetadata, Yn as DirectionOfMainAttackOptions, Yt as FLOTOptions, Z as ObstacleBypassImpossibleOptions, Zn as DirectionOfAttackAviationOptions, Zt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, _ as MidpointPerpendicularDrawRuleOptions, _n as DEFAULT_CLASSIC_ARROW_OPTIONS, _r as ControlMeasureGeometry, _t as FortifiedLineOptions, a as supportByFireDrawRule, an as GenericCircleOptions, ar as GenericC2LineOptions, at as FixOptions, b as getMidpointPerpendicularSignedDistance, bn as DEFAULT_MAIN_ATTACK_OPTIONS, br as ParamDescriptor, bt as AntitankDitchOptions, c as line23DrawRule, cn as DEFAULT_GENERIC_POLYGON_OPTIONS, cr as DEFAULT_LIGHT_LINE_OPTIONS, ct as BlockOptions, d as ambushDrawRule, dn as GenericLineOptions, dr as Point2D, dt as TurningMovementOptions, en as AttackHelicopterOptions, er as BattlePositionOptions, et as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, f as attackByFireDrawRule, fn as BlockArrowHeadStyle, fr as haversineDistance, ft as DEFAULT_FRONTAL_ATTACK_OPTIONS, g as blockDrawRule, gn as ClassicArrowOptions, gr as DEFAULT_BOUNDARY_OPTIONS, gt as DEFAULT_FORTIFIED_LINE_OPTIONS, h as disruptDrawRule, hn as ClassicArrowHeadStyle, hr as BoundaryOptions, ht as FortifiedAreaOptions, i as axis1DrawRule, in as DEFAULT_GENERIC_CIRCLE_OPTIONS, ir as DEFAULT_GENERIC_C2_LINE_OPTIONS, it as DEFAULT_FIX_OPTIONS, j as SimpleStyleProps, jn as JointTacticalActionAreaOptions, jr as canonicalTextAmplifierKey, jt as TacticalArrowOptions, k as getMetersPerPixel, kn as LandingZoneOptions, kr as TextAmplifierKey, kt as DEFAULT_COVER_OPTIONS, l as turnDrawRule, ln as GenericPolygonOptions, lr as LightLineOptions, lt as DEFAULT_BLOCK_OPTIONS, m as centerRadiusDrawRule, mn as DEFAULT_BLOCK_ARROW_OPTIONS, mr as unproject, mt as DEFAULT_FORTIFIED_AREA_OPTIONS, n as DEFAULT_AMBUSH_OPTIONS, nn as AirborneAttackOptions, nr as ControlMeasureStyle, nt as DEFAULT_TURN_OPTIONS, o as line26DrawRule, on as DEFAULT_GENERIC_RECTANGLE_OPTIONS, or as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, ot as DEFAULT_DISRUPT_OPTIONS, p as point12DrawRule, pn as BlockArrowOptions, pr as project, pt as FrontalAttackOptions, q as getControlMeasureMetadataByValue, qn as DirectionOfSupportingAttackOptions, qt as PhaseLineOptions, r as rectangleDrawRule, rn as DEFAULT_AIRBORNE_ATTACK_OPTIONS, rr as FillPattern, rt as TurnOptions, s as line24DrawRule, sn as GenericRectangleOptions, sr as EngineerWorkLineOptions, st as DisruptOptions, t as AmbushOptions, tn as DEFAULT_ATTACK_HELICOPTER_OPTIONS, tr as DEFAULT_BATTLE_POSITION_OPTIONS, tt as ObstacleBypassEasyOptions, u as line1DrawRule, un as DEFAULT_GENERIC_LINE_OPTIONS, ur as LabelSizeOptions, ut as DEFAULT_TURNING_MOVEMENT_OPTIONS, v as computeDefaultMidpointPerpendicularPoint, vn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, vr as ControlMeasureGeometryType, vt as AntitankWallOptions, w as BaselineFrameNormal, wn as AreaOfOperationsOptions, wr as CanonicalTextAmplifiers, wt as DEFAULT_GUARD_OPTIONS, x as pointOnMidpointPerpendicularAxis, xn as MainAttackOptions, xr as TextAmplifierDescriptor, xt as DEFAULT_ANTITANK_DITCH_OPTIONS, y as createMidpointPerpendicularDrawRule, yn as SupportingAttackOptions, yr as ControlMeasureMetadata, yt as DEFAULT_ANTITANK_WALL_OPTIONS, z as cloneControlMeasure, zn as FinalProtectiveFireOptions, zt as DEFAULT_BREACH_OPTIONS } from "./index-BTViqLbA.mjs";
1
+ import { $ as ObstacleBypassDifficultOptions, $n as StrongPointOptions, $t as SupportByFireOptions, A as roundToFixed, An as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, Ar as TextAmplifiers, At as DEFAULT_TACTICAL_ARROW_OPTIONS, B as isKind, Bn as ControlMeasureRender, Bt as BlockMissionTaskOptions, C as BaselineFrame, Cn as computeInitialWidthPoint, Cr as AmplifierPlacements, Ct as ScreenOptions, D as createBaselineFrame, Dn as PickupZoneOptions, Dr as TEXT_AMPLIFIER_FIELDS, Dt as DelayOptions, E as BaselineFrameOrigin, En as DEFAULT_PICKUP_ZONE_OPTIONS, Er as LabelPlacementOverride, Et as DEFAULT_DELAY_OPTIONS, F as freezeOrientationOptions, Fn as DEFAULT_AREA_DEFENSE_OPTIONS, Fr as ControlMeasureDrawRule, Ft as DEFAULT_CANALIZE_OPTIONS, G as OptionsByKind, Gn as PrincipalDirectionOfFireOptions, Gt as HandoverLineOptions, H as CONTROL_MEASURE_METADATA, Hn as StyleHints, Ht as BattleHandoverLineOptions, I as RenderOptions, In as DEFAULT_ENCIRCLEMENT_OPTIONS, It as BypassOptions, J as getDefaultOptions, Jn as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, Jt as DEFAULT_FLOT_OPTIONS, K as getControlMeasureMetadata, Kn as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, Kt as DEFAULT_PHASE_LINE_OPTIONS, L as renderControlMeasure, Ln as EncirclementOptions, Lt as DEFAULT_BYPASS_OPTIONS, M as SimpleStyleRender, Mn as AssemblyAreaOptions, Mr as normalizeTextAmplifiers, Mt as ClearOptions, N as toSimpleStyle, Nn as DEFAULT_ASSEMBLY_AREA_OPTIONS, Nr as resolveAmplifierPlacement, Nt as DEFAULT_CLEAR_OPTIONS, O as EPSILON, On as DEFAULT_LANDING_ZONE_OPTIONS, Or as TextAmplifierField, Ot as CoverOptions, P as resolveStyleHints, Pn as AreaDefenseOptions, Pr as AnchorTransformEvent, Pt as CanalizeOptions, Q as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, Qn as DEFAULT_STRONG_POINT_OPTIONS, Qt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, R as ControlMeasure, Rn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Rt as BreachOptions, S as snapToMidpointPerpendicular, Sn as calculateMetrics, Sr as AmplifierPlacement, St as DEFAULT_SCREEN_OPTIONS, T as BaselineFrameOptions, Tn as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, Tr as GeneratedLabelKey, Tt as GuardOptions, U as ControlMeasureId, Un as controlMeasureIdFromFeature, Ut as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, V as CONTROL_MEASURE_IDS, Vn as FeaturePartProps, Vt as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, W as ControlMeasureKind, Wn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, Wt as DEFAULT_HANDOVER_LINE_OPTIONS, X as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, Xn as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, Xt as AttackByFireOptions, Y as listControlMeasureMetadata, Yn as DirectionOfMainAttackOptions, Yt as FLOTOptions, Z as ObstacleBypassImpossibleOptions, Zn as DirectionOfAttackAviationOptions, Zt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, _ as MidpointPerpendicularDrawRuleOptions, _n as DEFAULT_CLASSIC_ARROW_OPTIONS, _r as ControlMeasureGeometry, _t as FortifiedLineOptions, a as supportByFireDrawRule, an as GenericCircleOptions, ar as GenericC2LineOptions, at as FixOptions, b as getMidpointPerpendicularSignedDistance, bn as DEFAULT_MAIN_ATTACK_OPTIONS, br as ParamDescriptor, bt as AntitankDitchOptions, c as line23DrawRule, cn as DEFAULT_GENERIC_POLYGON_OPTIONS, cr as DEFAULT_LIGHT_LINE_OPTIONS, ct as BlockOptions, d as ambushDrawRule, dn as GenericLineOptions, dr as Point2D, dt as TurningMovementOptions, en as AttackHelicopterOptions, er as BattlePositionOptions, et as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, f as attackByFireDrawRule, fn as BlockArrowHeadStyle, fr as haversineDistance, ft as DEFAULT_FRONTAL_ATTACK_OPTIONS, g as blockDrawRule, gn as ClassicArrowOptions, gr as DEFAULT_BOUNDARY_OPTIONS, gt as DEFAULT_FORTIFIED_LINE_OPTIONS, h as disruptDrawRule, hn as ClassicArrowHeadStyle, hr as BoundaryOptions, ht as FortifiedAreaOptions, i as axis1DrawRule, in as DEFAULT_GENERIC_CIRCLE_OPTIONS, ir as DEFAULT_GENERIC_C2_LINE_OPTIONS, it as DEFAULT_FIX_OPTIONS, j as SimpleStyleProps, jn as JointTacticalActionAreaOptions, jr as canonicalTextAmplifierKey, jt as TacticalArrowOptions, k as getMetersPerPixel, kn as LandingZoneOptions, kr as TextAmplifierKey, kt as DEFAULT_COVER_OPTIONS, l as turnDrawRule, ln as GenericPolygonOptions, lr as LightLineOptions, lt as DEFAULT_BLOCK_OPTIONS, m as centerRadiusDrawRule, mn as DEFAULT_BLOCK_ARROW_OPTIONS, mr as unproject, mt as DEFAULT_FORTIFIED_AREA_OPTIONS, n as DEFAULT_AMBUSH_OPTIONS, nn as AirborneAttackOptions, nr as ControlMeasureStyle, nt as DEFAULT_TURN_OPTIONS, o as line26DrawRule, on as DEFAULT_GENERIC_RECTANGLE_OPTIONS, or as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, ot as DEFAULT_DISRUPT_OPTIONS, p as point12DrawRule, pn as BlockArrowOptions, pr as project, pt as FrontalAttackOptions, q as getControlMeasureMetadataByValue, qn as DirectionOfSupportingAttackOptions, qt as PhaseLineOptions, r as rectangleDrawRule, rn as DEFAULT_AIRBORNE_ATTACK_OPTIONS, rr as FillPattern, rt as TurnOptions, s as line24DrawRule, sn as GenericRectangleOptions, sr as EngineerWorkLineOptions, st as DisruptOptions, t as AmbushOptions, tn as DEFAULT_ATTACK_HELICOPTER_OPTIONS, tr as DEFAULT_BATTLE_POSITION_OPTIONS, tt as ObstacleBypassEasyOptions, u as line1DrawRule, un as DEFAULT_GENERIC_LINE_OPTIONS, ur as LabelSizeOptions, ut as DEFAULT_TURNING_MOVEMENT_OPTIONS, v as computeDefaultMidpointPerpendicularPoint, vn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, vr as ControlMeasureGeometryType, vt as AntitankWallOptions, w as BaselineFrameNormal, wn as AreaOfOperationsOptions, wr as CanonicalTextAmplifiers, wt as DEFAULT_GUARD_OPTIONS, x as pointOnMidpointPerpendicularAxis, xn as MainAttackOptions, xr as TextAmplifierDescriptor, xt as DEFAULT_ANTITANK_DITCH_OPTIONS, y as createMidpointPerpendicularDrawRule, yn as SupportingAttackOptions, yr as ControlMeasureMetadata, yt as DEFAULT_ANTITANK_WALL_OPTIONS, z as cloneControlMeasure, zn as FinalProtectiveFireOptions, zt as DEFAULT_BREACH_OPTIONS } from "./index-CuLg1vvg.mjs";
2
2
  export { type AirborneAttackOptions, type AmbushOptions, type AmplifierPlacement, type AmplifierPlacements, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AreaDefenseOptions, type AreaOfOperationsOptions, type AssemblyAreaOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, type BattleHandoverLineOptions, type BattlePositionOptions, type BlockArrowHeadStyle, type BlockArrowOptions, type BlockMissionTaskOptions, type BlockOptions, type BoundaryOptions, type BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type CanonicalTextAmplifiers, type ClassicArrowHeadStyle, type ClassicArrowOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureStyle, type CoverOptions, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_AREA_DEFENSE_OPTIONS, DEFAULT_AREA_OF_OPERATIONS_OPTIONS, DEFAULT_ASSEMBLY_AREA_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, DEFAULT_BATTLE_POSITION_OPTIONS, DEFAULT_BLOCK_ARROW_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BOUNDARY_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_COVER_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_ENGINEER_WORK_LINE_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_FRONTAL_ATTACK_OPTIONS, DEFAULT_GENERIC_C2_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_GUARD_OPTIONS, DEFAULT_HANDOVER_LINE_OPTIONS, DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, DEFAULT_LANDING_ZONE_OPTIONS, DEFAULT_LIGHT_LINE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PHASE_LINE_OPTIONS, DEFAULT_PICKUP_ZONE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_SCREEN_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURNING_MOVEMENT_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DirectionOfAttackAviationOptions, type DirectionOfMainAttackOptions, type DirectionOfSupportingAttackOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type EngineerWorkLineOptions, type FLOTOptions, type FeaturePartProps, type FillPattern, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type FrontalAttackOptions, type GeneratedLabelKey, type GenericC2LineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type GuardOptions, type HandoverLineOptions, type JointTacticalActionAreaOptions, type LabelPlacementOverride, type LabelSizeOptions, type LandingZoneOptions, type LightLineOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type PhaseLineOptions, type PickupZoneOptions, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, type ScreenOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, TEXT_AMPLIFIER_FIELDS, type TacticalArrowOptions, type TextAmplifierDescriptor, type TextAmplifierField, type TextAmplifierKey, type TextAmplifiers, type TurnOptions, type TurningMovementOptions, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, canonicalTextAmplifierKey, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, haversineDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, line26DrawRule, listControlMeasureMetadata, normalizeTextAmplifiers, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveAmplifierPlacement, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as DEFAULT_BLOCK_ARROW_OPTIONS, A as DEFAULT_FLOT_OPTIONS, At as disruptDrawRule, B as DEFAULT_GENERIC_RECTANGLE_OPTIONS, Bt as haversineDistance, C as DEFAULT_SCREEN_OPTIONS, Ct as line23DrawRule, D as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, Dt as attackByFireDrawRule, E as DEFAULT_FORTIFIED_LINE_OPTIONS, Et as ambushDrawRule, F as DEFAULT_GUARD_OPTIONS, Ft as pointOnMidpointPerpendicularAxis, G as DEFAULT_CANALIZE_OPTIONS, Gt as roundToFixed, H as DEFAULT_GENERIC_LINE_OPTIONS, Ht as unproject, I as DEFAULT_DELAY_OPTIONS, It as snapToMidpointPerpendicular, J as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, K as DEFAULT_BYPASS_OPTIONS, L as DEFAULT_COVER_OPTIONS, Lt as createBaselineFrame, M as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Mt as computeDefaultMidpointPerpendicularPoint, N as DEFAULT_ENCIRCLEMENT_OPTIONS, Nt as createMidpointPerpendicularDrawRule, O as DEFAULT_HANDOVER_LINE_OPTIONS, Ot as point12DrawRule, P as DEFAULT_DISRUPT_OPTIONS, Pt as getMidpointPerpendicularSignedDistance, Q as DEFAULT_BOUNDARY_OPTIONS, R as DEFAULT_TACTICAL_ARROW_OPTIONS, Rt as calculateMetrics, S as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, St as line24DrawRule, T as DEFAULT_FORTIFIED_AREA_OPTIONS, Tt as line1DrawRule, U as DEFAULT_GENERIC_CIRCLE_OPTIONS, Ut as EPSILON, V as DEFAULT_GENERIC_POLYGON_OPTIONS, Vt as project, W as DEFAULT_CLASSIC_ARROW_OPTIONS, Wt as getMetersPerPixel, X as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, Y as DEFAULT_GENERIC_C2_LINE_OPTIONS, Z as DEFAULT_LIGHT_LINE_OPTIONS, _ as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, _t as DEFAULT_AIRBORNE_ATTACK_OPTIONS, a as DEFINITIONS, at as DEFAULT_ANTITANK_DITCH_OPTIONS, b as DEFAULT_MAIN_ATTACK_OPTIONS, bt as supportByFireDrawRule, c as getDefaultOptions, ct as DEFAULT_AREA_DEFENSE_OPTIONS, d as DEFAULT_TURN_OPTIONS, dt as normalizeTextAmplifiers, et as DEFAULT_BLOCK_OPTIONS, f as DEFAULT_SUPPORTING_ATTACK_OPTIONS, ft as resolveAmplifierPlacement, g as DEFAULT_PICKUP_ZONE_OPTIONS, gt as DEFAULT_AMBUSH_OPTIONS, h as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, ht as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, i as CONTROL_MEASURE_METADATA, it as DEFAULT_ANTITANK_WALL_OPTIONS, j as DEFAULT_FIX_OPTIONS, jt as blockDrawRule, k as DEFAULT_PHASE_LINE_OPTIONS, kt as centerRadiusDrawRule, l as listControlMeasureMetadata, lt as TEXT_AMPLIFIER_FIELDS, m as DEFAULT_STRONG_POINT_OPTIONS, mt as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, n as resolveStyleHints, nt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, o as getControlMeasureMetadata, ot as DEFAULT_ASSEMBLY_AREA_OPTIONS, p as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, pt as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, q as DEFAULT_BREACH_OPTIONS, r as CONTROL_MEASURE_IDS, rt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, s as getControlMeasureMetadataByValue, st as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, t as renderControlMeasure, tt as DEFAULT_BATTLE_POSITION_OPTIONS, u as DEFAULT_TURNING_MOVEMENT_OPTIONS, ut as canonicalTextAmplifierKey, v as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, vt as rectangleDrawRule, w as DEFAULT_FRONTAL_ATTACK_OPTIONS, wt as turnDrawRule, x as DEFAULT_LANDING_ZONE_OPTIONS, xt as line26DrawRule, y as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, yt as axis1DrawRule, z as DEFAULT_CLEAR_OPTIONS, zt as computeInitialWidthPoint } from "./renderControlMeasure-Bc0d45Iv.mjs";
1
+ import { $ as DEFAULT_BLOCK_ARROW_OPTIONS, A as DEFAULT_FLOT_OPTIONS, At as disruptDrawRule, B as DEFAULT_GENERIC_RECTANGLE_OPTIONS, Bt as haversineDistance, C as DEFAULT_SCREEN_OPTIONS, Ct as line23DrawRule, D as DEFAULT_BATTLE_HANDOVER_LINE_OPTIONS, Dt as attackByFireDrawRule, E as DEFAULT_FORTIFIED_LINE_OPTIONS, Et as ambushDrawRule, F as DEFAULT_GUARD_OPTIONS, Ft as pointOnMidpointPerpendicularAxis, G as DEFAULT_CANALIZE_OPTIONS, Gt as roundToFixed, H as DEFAULT_GENERIC_LINE_OPTIONS, Ht as unproject, I as DEFAULT_DELAY_OPTIONS, It as snapToMidpointPerpendicular, J as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, K as DEFAULT_BYPASS_OPTIONS, L as DEFAULT_COVER_OPTIONS, Lt as createBaselineFrame, M as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, Mt as computeDefaultMidpointPerpendicularPoint, N as DEFAULT_ENCIRCLEMENT_OPTIONS, Nt as createMidpointPerpendicularDrawRule, O as DEFAULT_HANDOVER_LINE_OPTIONS, Ot as point12DrawRule, P as DEFAULT_DISRUPT_OPTIONS, Pt as getMidpointPerpendicularSignedDistance, Q as DEFAULT_BOUNDARY_OPTIONS, R as DEFAULT_TACTICAL_ARROW_OPTIONS, Rt as calculateMetrics, S as DEFAULT_JOINT_TACTICAL_ACTION_AREA_OPTIONS, St as line24DrawRule, T as DEFAULT_FORTIFIED_AREA_OPTIONS, Tt as line1DrawRule, U as DEFAULT_GENERIC_CIRCLE_OPTIONS, Ut as EPSILON, V as DEFAULT_GENERIC_POLYGON_OPTIONS, Vt as project, W as DEFAULT_CLASSIC_ARROW_OPTIONS, Wt as getMetersPerPixel, X as DEFAULT_ENGINEER_WORK_LINE_OPTIONS, Y as DEFAULT_GENERIC_C2_LINE_OPTIONS, Z as DEFAULT_LIGHT_LINE_OPTIONS, _ as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, _t as DEFAULT_AIRBORNE_ATTACK_OPTIONS, a as DEFINITIONS, at as DEFAULT_ANTITANK_DITCH_OPTIONS, b as DEFAULT_MAIN_ATTACK_OPTIONS, bt as supportByFireDrawRule, c as getDefaultOptions, ct as DEFAULT_AREA_DEFENSE_OPTIONS, d as DEFAULT_TURN_OPTIONS, dt as normalizeTextAmplifiers, et as DEFAULT_BLOCK_OPTIONS, f as DEFAULT_SUPPORTING_ATTACK_OPTIONS, ft as resolveAmplifierPlacement, g as DEFAULT_PICKUP_ZONE_OPTIONS, gt as DEFAULT_AMBUSH_OPTIONS, h as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, ht as DEFAULT_DIRECTION_OF_ATTACK_AVIATION_OPTIONS, i as CONTROL_MEASURE_METADATA, it as DEFAULT_ANTITANK_WALL_OPTIONS, j as DEFAULT_FIX_OPTIONS, jt as blockDrawRule, k as DEFAULT_PHASE_LINE_OPTIONS, kt as centerRadiusDrawRule, l as listControlMeasureMetadata, lt as TEXT_AMPLIFIER_FIELDS, m as DEFAULT_STRONG_POINT_OPTIONS, mt as DEFAULT_DIRECTION_OF_MAIN_ATTACK_OPTIONS, n as resolveStyleHints, nt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, o as getControlMeasureMetadata, ot as DEFAULT_ASSEMBLY_AREA_OPTIONS, p as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, pt as DEFAULT_DIRECTION_OF_SUPPORTING_ATTACK_OPTIONS, q as DEFAULT_BREACH_OPTIONS, r as CONTROL_MEASURE_IDS, rt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, s as getControlMeasureMetadataByValue, st as DEFAULT_AREA_OF_OPERATIONS_OPTIONS, t as renderControlMeasure, tt as DEFAULT_BATTLE_POSITION_OPTIONS, u as DEFAULT_TURNING_MOVEMENT_OPTIONS, ut as canonicalTextAmplifierKey, v as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, vt as rectangleDrawRule, w as DEFAULT_FRONTAL_ATTACK_OPTIONS, wt as turnDrawRule, x as DEFAULT_LANDING_ZONE_OPTIONS, xt as line26DrawRule, y as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, yt as axis1DrawRule, z as DEFAULT_CLEAR_OPTIONS, zt as computeInitialWidthPoint } from "./renderControlMeasure-CsrLHwjB.mjs";
2
2
  //#region src/freeze-orientation.ts
3
3
  /**
4
4
  * Dispatches to a measure kind's `freezeOrientation` hook (see
@@ -1,4 +1,4 @@
1
- import { Ar as TextAmplifiers, U as ControlMeasureId, rr as FillPattern } from "../index-BTViqLbA.mjs";
1
+ import { Ar as TextAmplifiers, U as ControlMeasureId, rr as FillPattern } from "../index-CuLg1vvg.mjs";
2
2
  import { FeatureCollection, Geometry } from "geojson";
3
3
 
4
4
  //#region src/preview/index.d.ts
@@ -1,4 +1,4 @@
1
- import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-Bc0d45Iv.mjs";
1
+ import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-CsrLHwjB.mjs";
2
2
  //#region src/preview/index.ts
3
3
  /** Side length (SVG units) of the repeating hatch tile in {@link PREVIEW_FILL_PATTERNS}. */
4
4
  const PREVIEW_PATTERN_TILE = 8;
@@ -61,6 +61,7 @@ const getMetersPerPixel = (latitude, zoomLevel) => {
61
61
  };
62
62
  //#endregion
63
63
  //#region src/projection.ts
64
+ const EARTH_RADIUS = 6371008.8;
64
65
  /**
65
66
  * Project WGS84 (Lon/Lat) to Web Mercator (Meters).
66
67
  */
@@ -82,13 +83,13 @@ const unproject = (x, y) => {
82
83
  /**
83
84
  * Great-circle distance in meters between two lon/lat positions (haversine on
84
85
  * the WGS84 mean-radius sphere). Accurate at all scales — use this for
85
- * measurement readouts (segment lengths, radii). Note the deliberate
86
- * asymmetry with generation: generators build geometry in projected Web
87
- * Mercator meters, so at high latitudes a graphic's Mercator dimensions
88
- * exceed the true ground distance this returns.
86
+ * measurement readouts (segment lengths, radii). Most generators still build
87
+ * geometry in projected Web Mercator meters, so at high latitudes a graphic's
88
+ * Mercator dimensions can exceed the true ground distance this returns; the
89
+ * generic circle is the exception — it samples at constant geodesic radius,
90
+ * so its ring and this readout agree exactly.
89
91
  */
90
92
  const haversineDistance = (a, b) => {
91
- const R = 6371008.8;
92
93
  const [lon1, lat1] = a;
93
94
  const [lon2, lat2] = b;
94
95
  const φ1 = lat1 * Math.PI / 180;
@@ -96,7 +97,33 @@ const haversineDistance = (a, b) => {
96
97
  const Δφ = (lat2 - lat1) * Math.PI / 180;
97
98
  const Δλ = (lon2 - lon1) * Math.PI / 180;
98
99
  const h = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
99
- return 2 * R * Math.asin(Math.min(1, Math.sqrt(h)));
100
+ return 2 * EARTH_RADIUS * Math.asin(Math.min(1, Math.sqrt(h)));
101
+ };
102
+ /**
103
+ * Initial great-circle bearing from `a` to `b`, in radians clockwise from
104
+ * north (0 = north, π/2 = east).
105
+ */
106
+ const sphericalBearing = (a, b) => {
107
+ const [lon1, lat1] = a;
108
+ const [lon2, lat2] = b;
109
+ const φ1 = lat1 * Math.PI / 180;
110
+ const φ2 = lat2 * Math.PI / 180;
111
+ const Δλ = (lon2 - lon1) * Math.PI / 180;
112
+ return Math.atan2(Math.sin(Δλ) * Math.cos(φ2), Math.cos(φ1) * Math.sin(φ2) - Math.sin(φ1) * Math.cos(φ2) * Math.cos(Δλ));
113
+ };
114
+ /**
115
+ * Spherical forward (direct) solution: the position reached by travelling
116
+ * `distance` meters from `origin` along an initial `bearing` (radians
117
+ * clockwise from north), on the WGS84 mean-radius sphere.
118
+ */
119
+ const destinationPoint = (origin, distance, bearing) => {
120
+ const [lon1, lat1] = origin;
121
+ const φ1 = lat1 * Math.PI / 180;
122
+ const λ1 = lon1 * Math.PI / 180;
123
+ const δ = distance / EARTH_RADIUS;
124
+ const θ = bearing;
125
+ const φ2 = Math.asin(Math.sin(φ1) * Math.cos(δ) + Math.cos(φ1) * Math.sin(δ) * Math.cos(θ));
126
+ return [roundToFixed((λ1 + Math.atan2(Math.sin(θ) * Math.sin(δ) * Math.cos(φ1), Math.cos(δ) - Math.sin(φ1) * Math.sin(φ2))) * 180 / Math.PI), roundToFixed(φ2 * 180 / Math.PI)];
100
127
  };
101
128
  //#endregion
102
129
  //#region src/internal/vector-utils.ts
@@ -6862,6 +6889,31 @@ const FILLED_AREA_PARAMS = [{
6862
6889
  //#endregion
6863
6890
  //#region src/generators/cm99-generic-graphics/circle.ts
6864
6891
  const CIRCLE_SEGMENTS = 64;
6892
+ const MAX_SEGMENT_ANGLE = 6;
6893
+ const MAX_SUBDIVISION_DEPTH = 5;
6894
+ /**
6895
+ * Lon/lat gap between two positions, wrapping the longitude difference to
6896
+ * (-180, 180] so it stays meaningful across the antimeridian.
6897
+ */
6898
+ const angularGap = (a, b) => {
6899
+ const wrappedLonDiff = Math.abs(((b[0] - a[0]) % 360 + 540) % 360 - 180);
6900
+ const latDiff = Math.abs(b[1] - a[1]);
6901
+ return Math.max(wrappedLonDiff, latDiff);
6902
+ };
6903
+ /**
6904
+ * Recursively bisects a bearing interval so consecutive ring vertices stay
6905
+ * within MAX_SEGMENT_ANGLE of each other, keeping straight polygon chords
6906
+ * close to the true geodesic circle near the poles. Only pushes the start of
6907
+ * each leaf segment; the caller supplies the final closing vertex.
6908
+ */
6909
+ const densifySegment = (center, radius, bearingA, posA, bearingB, posB, depth, out) => {
6910
+ if (depth < MAX_SUBDIVISION_DEPTH && angularGap(posA, posB) > MAX_SEGMENT_ANGLE) {
6911
+ const midBearing = (bearingA + bearingB) / 2;
6912
+ const midPos = destinationPoint(center, radius, midBearing);
6913
+ densifySegment(center, radius, bearingA, posA, midBearing, midPos, depth + 1, out);
6914
+ densifySegment(center, radius, midBearing, midPos, bearingB, posB, depth + 1, out);
6915
+ } else out.push(posA);
6916
+ };
6865
6917
  const DEFAULT_GENERIC_CIRCLE_OPTIONS = { filled: false };
6866
6918
  const GENERIC_CIRCLE_METADATA = {
6867
6919
  id: "circle",
@@ -6879,19 +6931,42 @@ const GENERIC_CIRCLE_METADATA = {
6879
6931
  params: FILLED_AREA_PARAMS
6880
6932
  };
6881
6933
  function createGenericCircle(coordinates, options = {}) {
6882
- const center = project(coordinates[0][0], coordinates[0][1]);
6883
- const radiusVector = vecSub(project(coordinates[1][0], coordinates[1][1]), center);
6884
- const radius = vecMag(radiusVector);
6934
+ const center = coordinates[0];
6935
+ const radiusPoint = coordinates[1];
6936
+ const radius = haversineDistance(center, radiusPoint);
6885
6937
  if (radius < 1e-6) return {
6886
6938
  type: "FeatureCollection",
6887
6939
  features: []
6888
6940
  };
6889
- const startAngle = Math.atan2(radiusVector[1], radiusVector[0]);
6941
+ const startBearing = sphericalBearing(center, radiusPoint);
6890
6942
  const ring = [];
6891
- for (let index = 0; index <= CIRCLE_SEGMENTS; index++) {
6892
- const angle = startAngle + index / CIRCLE_SEGMENTS * Math.PI * 2;
6893
- ring.push(unproject(center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius));
6894
- }
6943
+ let previousBearing = startBearing;
6944
+ let previousPoint = destinationPoint(center, radius, previousBearing);
6945
+ for (let index = 1; index <= CIRCLE_SEGMENTS; index++) {
6946
+ const bearing = startBearing - index / CIRCLE_SEGMENTS * 2 * Math.PI;
6947
+ const point = destinationPoint(center, radius, bearing);
6948
+ densifySegment(center, radius, previousBearing, previousPoint, bearing, point, 0, ring);
6949
+ previousBearing = bearing;
6950
+ previousPoint = point;
6951
+ }
6952
+ ring.push(previousPoint);
6953
+ const vertex0 = [ring[0][0], ring[0][1]];
6954
+ let poleLat = null;
6955
+ if (haversineDistance(center, [center[0], 90]) < radius) poleLat = 90;
6956
+ else if (haversineDistance(center, [center[0], -90]) < radius) poleLat = -90;
6957
+ if (poleLat !== null) {
6958
+ for (let index = 1; index < ring.length - 1; index++) {
6959
+ const previousLon = ring[index - 1][0];
6960
+ const lon = ring[index][0];
6961
+ ring[index] = [lon + 360 * Math.round((previousLon - lon) / 360), ring[index][1]];
6962
+ }
6963
+ const penultimateLon = ring[ring.length - 2][0];
6964
+ const unwrappedClosingLon = vertex0[0] + 360 * Math.round((penultimateLon - vertex0[0]) / 360);
6965
+ ring[ring.length - 1] = [unwrappedClosingLon, vertex0[1]];
6966
+ ring.push([unwrappedClosingLon, poleLat]);
6967
+ ring.push([vertex0[0], poleLat]);
6968
+ ring.push([vertex0[0], vertex0[1]]);
6969
+ } else ring[ring.length - 1] = [vertex0[0], vertex0[1]];
6895
6970
  return {
6896
6971
  type: "FeatureCollection",
6897
6972
  features: [{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbat-mapper/control-measures",
3
- "version": "0.2.0-alpha.22",
3
+ "version": "0.2.0-alpha.23",
4
4
  "description": "Library for drawing tactical graphics and control measures according to MIL-STD-2525 and APP-6 standards.",
5
5
  "license": "MIT",
6
6
  "author": "Orbat Mapper",