@orbat-mapper/control-measures 0.2.0-alpha.6 → 0.2.0-alpha.8
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.
- package/README.md +9 -3
- package/dist/{index-DUGzYzPy.d.mts → index-BHWESyWA.d.mts} +23 -17
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/preview/index.d.mts +1 -1
- package/dist/preview/index.mjs +1 -1
- package/dist/{renderControlMeasure-D5NKuws0.mjs → renderControlMeasure-DnM2w9jS.mjs} +138 -110
- package/media/battle-position.svg +1 -1
- package/media/circle.svg +1 -0
- package/media/encirclement.svg +1 -0
- package/media/line.svg +1 -0
- package/media/polygon.svg +1 -0
- package/media/rectangle.svg +1 -0
- package/media/strong-point.svg +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -75,8 +75,8 @@ controls how invalid coordinate input is handled:
|
|
|
75
75
|
|
|
76
76
|
- `validationMode: "silent" | "warn" | "throw"`
|
|
77
77
|
|
|
78
|
-
When omitted, validation
|
|
79
|
-
useful for strict integrations and tests.
|
|
78
|
+
When omitted, validation defaults to `silent` mode — invalid input yields an
|
|
79
|
+
empty render. `"throw"` is useful for strict integrations and tests.
|
|
80
80
|
|
|
81
81
|
## Supported control measures
|
|
82
82
|
|
|
@@ -107,10 +107,12 @@ code.
|
|
|
107
107
|
| --- | --- | --- | --- |
|
|
108
108
|
| <img src="media/fortified-area.svg" width="96" height="48" alt=""> | `fortified-area` | Fortified Area | `151000` |
|
|
109
109
|
| <img src="media/battle-position.svg" width="96" height="48" alt=""> | `battle-position` | Battle Position | `151200` |
|
|
110
|
+
| <img src="media/strong-point.svg" width="96" height="48" alt=""> | `strong-point` | Strong Point | `151203` |
|
|
110
111
|
| <img src="media/airborne-attack.svg" width="96" height="48" alt=""> | `airborne-attack` | Airborne Attack | `151401` |
|
|
111
112
|
| <img src="media/attack-helicopter.svg" width="96" height="48" alt=""> | `attack-helicopter` | Attack Helicopter | `151402` |
|
|
112
113
|
| <img src="media/main-attack.svg" width="96" height="48" alt=""> | `main-attack` | Main Attack | `151403` |
|
|
113
114
|
| <img src="media/supporting-attack.svg" width="96" height="48" alt=""> | `supporting-attack` | Supporting Attack | `151404` |
|
|
115
|
+
| <img src="media/encirclement.svg" width="96" height="48" alt=""> | `encirclement` | Encirclement | `151800` |
|
|
114
116
|
| <img src="media/attack-by-fire.svg" width="96" height="48" alt=""> | `attack-by-fire` | Attack by Fire | `152000` |
|
|
115
117
|
| <img src="media/support-by-fire.svg" width="96" height="48" alt=""> | `support-by-fire` | Support By Fire | `152100` |
|
|
116
118
|
| <img src="media/search-area.svg" width="96" height="48" alt=""> | `search-area` | Search Area | `152200` |
|
|
@@ -148,12 +150,16 @@ code.
|
|
|
148
150
|
| <img src="media/delay.svg" width="96" height="48" alt=""> | `delay` | Delay | `340800` |
|
|
149
151
|
| <img src="media/isolate.svg" width="96" height="48" alt=""> | `isolate` | Isolate | `341500` |
|
|
150
152
|
|
|
151
|
-
### Generic
|
|
153
|
+
### Generic Graphics
|
|
152
154
|
|
|
153
155
|
| Preview | `kind` | Measure | 2525E Value |
|
|
154
156
|
| --- | --- | --- | --- |
|
|
155
157
|
| <img src="media/block-arrow.svg" width="96" height="48" alt=""> | `block-arrow` | Block Arrow | `990001` |
|
|
156
158
|
| <img src="media/classic-arrow.svg" width="96" height="48" alt=""> | `classic-arrow` | Classic Arrow | `990002` |
|
|
159
|
+
| <img src="media/line.svg" width="96" height="48" alt=""> | `line` | Line | `990101` |
|
|
160
|
+
| <img src="media/polygon.svg" width="96" height="48" alt=""> | `polygon` | Polygon | `990102` |
|
|
161
|
+
| <img src="media/rectangle.svg" width="96" height="48" alt=""> | `rectangle` | Rectangle | `990103` |
|
|
162
|
+
| <img src="media/circle.svg" width="96" height="48" alt=""> | `circle` | Circle | `990104` |
|
|
157
163
|
|
|
158
164
|
<!-- /AUTO-GENERATED:measures-table -->
|
|
159
165
|
|
|
@@ -292,6 +292,8 @@ interface BoundaryOptions {
|
|
|
292
292
|
*/
|
|
293
293
|
smoothResolution?: number;
|
|
294
294
|
}
|
|
295
|
+
/** Default options for the Boundary control measure. */
|
|
296
|
+
declare const DEFAULT_BOUNDARY_OPTIONS: BoundaryOptions;
|
|
295
297
|
/**
|
|
296
298
|
* Creates a Boundary control measure: a polyline through `positions` carrying
|
|
297
299
|
* repeated echelon + unit-designator labels.
|
|
@@ -378,6 +380,8 @@ interface BattlePositionOptions {
|
|
|
378
380
|
*/
|
|
379
381
|
smoothResolution?: number;
|
|
380
382
|
}
|
|
383
|
+
/** Default options for the Battle Position control measure. */
|
|
384
|
+
declare const DEFAULT_BATTLE_POSITION_OPTIONS: BattlePositionOptions;
|
|
381
385
|
/**
|
|
382
386
|
* Creates a Battle Position control measure: a closed area through `positions`
|
|
383
387
|
* carrying a single echelon (Field B) glyph straddling its boundary — anchored
|
|
@@ -447,7 +451,7 @@ interface FinalProtectiveFireOptions {
|
|
|
447
451
|
* Blade height (its perpendicular reach into the inside of the V) relative
|
|
448
452
|
* to the bladed arm's own length (default: 0.03).
|
|
449
453
|
*/
|
|
450
|
-
|
|
454
|
+
bladeHeightRatio?: number;
|
|
451
455
|
}
|
|
452
456
|
declare const DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS: Required<FinalProtectiveFireOptions>;
|
|
453
457
|
type FpfProps = {
|
|
@@ -512,8 +516,8 @@ declare const unproject: (x: number, y: number) => Position;
|
|
|
512
516
|
//#region src/attack-utils.d.ts
|
|
513
517
|
interface AttackOptions {
|
|
514
518
|
shaftWidthRatio?: number;
|
|
515
|
-
|
|
516
|
-
|
|
519
|
+
smooth?: boolean;
|
|
520
|
+
smoothResolution?: number;
|
|
517
521
|
}
|
|
518
522
|
/**
|
|
519
523
|
* Calculates the relative metrics (longitudinal and lateral) of the width point
|
|
@@ -607,6 +611,7 @@ interface ClassicArrowOptions {
|
|
|
607
611
|
/** Arrowhead base width as a fraction of the total path length. */
|
|
608
612
|
arrowheadWidthRatio?: number;
|
|
609
613
|
}
|
|
614
|
+
declare const DEFAULT_CLASSIC_ARROW_OPTIONS: Required<ClassicArrowOptions>;
|
|
610
615
|
/**
|
|
611
616
|
* Generates a GeoJSON FeatureCollection for the Classic Arrow: a shaft
|
|
612
617
|
* LineString (trimmed so it doesn't poke through the head) plus a head feature
|
|
@@ -638,7 +643,7 @@ declare function createClassicArrow(coordinates: Position[], options?: ClassicAr
|
|
|
638
643
|
type BlockArrowHeadStyle = "triangle" | "barbed" | "concave" | "diamond" | "harpoon" | "swallowtail" | "tee";
|
|
639
644
|
interface BlockArrowOptions {
|
|
640
645
|
/** Shaft band width as a fraction of the total path length. */
|
|
641
|
-
|
|
646
|
+
shaftWidthRatio?: number;
|
|
642
647
|
/** Arrowhead silhouette. */
|
|
643
648
|
arrowheadStyle?: BlockArrowHeadStyle;
|
|
644
649
|
/** Arrowhead base width as a fraction of the total path length. */
|
|
@@ -652,6 +657,7 @@ interface BlockArrowOptions {
|
|
|
652
657
|
/** Fill the body solid; when false the arrow is drawn as an outline only. */
|
|
653
658
|
filled?: boolean;
|
|
654
659
|
}
|
|
660
|
+
declare const DEFAULT_BLOCK_ARROW_OPTIONS: Required<BlockArrowOptions>;
|
|
655
661
|
/**
|
|
656
662
|
* Generates a GeoJSON FeatureCollection for the Block Arrow: a single filled
|
|
657
663
|
* Polygon whose outline runs up the left side of the shaft, around the head
|
|
@@ -742,8 +748,8 @@ declare function createAttackHelicopter(coordinates: Position[], options?: Attac
|
|
|
742
748
|
//#region src/generators/cm15-maneuver-areas/supportByFire.d.ts
|
|
743
749
|
interface SupportByFireOptions {
|
|
744
750
|
arrowheadWidthRatio?: number;
|
|
745
|
-
|
|
746
|
-
|
|
751
|
+
rearLineLengthRatio?: number;
|
|
752
|
+
rearLineAngle?: number;
|
|
747
753
|
}
|
|
748
754
|
declare const DEFAULT_SUPPORT_BY_FIRE_OPTIONS: Required<SupportByFireOptions>;
|
|
749
755
|
/**
|
|
@@ -760,8 +766,8 @@ declare function createSupportByFire(coordinates: Position[], options?: SupportB
|
|
|
760
766
|
//#region src/generators/cm15-maneuver-areas/attackByFire.d.ts
|
|
761
767
|
interface AttackByFireOptions {
|
|
762
768
|
arrowheadWidthRatio?: number;
|
|
763
|
-
|
|
764
|
-
|
|
769
|
+
rearLineLengthRatio?: number;
|
|
770
|
+
rearLineAngle?: number;
|
|
765
771
|
}
|
|
766
772
|
declare const DEFAULT_ATTACK_BY_FIRE_OPTIONS: Required<AttackByFireOptions>;
|
|
767
773
|
/**
|
|
@@ -810,7 +816,7 @@ interface FLOTOptions {
|
|
|
810
816
|
* Higher values create smoother arcs.
|
|
811
817
|
* @default 16
|
|
812
818
|
*/
|
|
813
|
-
|
|
819
|
+
arcSegments?: number;
|
|
814
820
|
}
|
|
815
821
|
/**
|
|
816
822
|
* Default options for the FLOT graphic.
|
|
@@ -831,7 +837,7 @@ declare const DEFAULT_FLOT_OPTIONS: Required<Omit<FLOTOptions, "metersPerPixel">
|
|
|
831
837
|
* ```typescript
|
|
832
838
|
* const flot = createFLOT(
|
|
833
839
|
* [[-122.4194, 37.7749], [-122.4100, 37.7800], [-122.4000, 37.7750]],
|
|
834
|
-
* { radius: 100,
|
|
840
|
+
* { radius: 100, arcSegments: 20 }
|
|
835
841
|
* );
|
|
836
842
|
* ```
|
|
837
843
|
*/
|
|
@@ -1126,21 +1132,21 @@ interface FortifiedLineOptions {
|
|
|
1126
1132
|
/**
|
|
1127
1133
|
* The size of the square teeth in meters.
|
|
1128
1134
|
* This controls both the width and height of the castellated pattern.
|
|
1129
|
-
* This is ignored if
|
|
1135
|
+
* This is ignored if toothSizePixels is provided along with metersPerPixel.
|
|
1130
1136
|
* @default 50
|
|
1131
1137
|
*/
|
|
1132
|
-
|
|
1138
|
+
toothSize?: number;
|
|
1133
1139
|
/**
|
|
1134
1140
|
* The size of the square teeth in pixels.
|
|
1135
1141
|
* When provided along with metersPerPixel, the actual meter size is calculated
|
|
1136
1142
|
* dynamically to maintain consistent visual size on screen.
|
|
1137
|
-
* Takes precedence over
|
|
1143
|
+
* Takes precedence over toothSize when metersPerPixel is also provided.
|
|
1138
1144
|
* @default 10
|
|
1139
1145
|
*/
|
|
1140
|
-
|
|
1146
|
+
toothSizePixels?: number;
|
|
1141
1147
|
/**
|
|
1142
1148
|
* The meters-per-pixel ratio at the current zoom level and latitude.
|
|
1143
|
-
* Required when using
|
|
1149
|
+
* Required when using toothSizePixels for zoom-aware sizing.
|
|
1144
1150
|
*/
|
|
1145
1151
|
metersPerPixel?: number;
|
|
1146
1152
|
/**
|
|
@@ -1787,7 +1793,7 @@ declare const rectangleDrawRule: ControlMeasureDrawRule;
|
|
|
1787
1793
|
*/
|
|
1788
1794
|
interface AmbushOptions {
|
|
1789
1795
|
/** Number of segments used to draw the quadratic curve (default: 30) */
|
|
1790
|
-
|
|
1796
|
+
arcSegments?: number;
|
|
1791
1797
|
/** Size of arrowhead relative to chord span (default: 0.15) */
|
|
1792
1798
|
arrowheadLengthRatio?: number;
|
|
1793
1799
|
/** Width of arrowhead wings relative to its length (default: 0.5) */
|
|
@@ -1822,4 +1828,4 @@ interface TacticalArrowOptions {
|
|
|
1822
1828
|
*/
|
|
1823
1829
|
declare const DEFAULT_TACTICAL_ARROW_OPTIONS: Required<TacticalArrowOptions>;
|
|
1824
1830
|
//#endregion
|
|
1825
|
-
export { getControlMeasureMetadata as $, DEFAULT_GENERIC_LINE_OPTIONS as $t, getMetersPerPixel as A, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Bt, snapToMidpointPerpendicular as C,
|
|
1831
|
+
export { getControlMeasureMetadata as $, DEFAULT_GENERIC_LINE_OPTIONS as $t, getMetersPerPixel as A, ControlMeasureMetadata as An, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Bt, snapToMidpointPerpendicular as C, StrongPointOptions as Cn, AntitankDitchOptions as Ct, BaselineFrameOrigin as D, DEFAULT_BOUNDARY_OPTIONS as Dn, ClearOptions as Dt, BaselineFrameOptions as E, BoundaryOptions as En, DelayOptions as Et, resolveStyleHints as F, BlockMissionTaskOptions as Ft, cloneControlMeasure as G, AirborneAttackOptions as Gt, StyleHints as H, SupportByFireOptions as Ht, freezeOrientationOptions as I, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as It, CONTROL_MEASURE_IDS as J, GenericCircleOptions as Jt, isKind as K, DEFAULT_AIRBORNE_ATTACK_OPTIONS as Kt, RenderOptions as L, DEFAULT_FLOT_OPTIONS as Lt, SimpleStyleProps as M, AnchorTransformEvent as Mn, DEFAULT_BYPASS_OPTIONS as Mt, SimpleStyleRender as N, ControlMeasureDrawRule as Nn, BreachOptions as Nt, createBaselineFrame as O, ControlMeasureGeometry as On, DEFAULT_CLEAR_OPTIONS as Ot, toSimpleStyle as P, DEFAULT_BREACH_OPTIONS as Pt, OptionsByKind as Q, GenericPolygonOptions as Qt, renderControlMeasure as R, FLOTOptions as Rt, pointOnMidpointPerpendicularAxis as S, DEFAULT_STRONG_POINT_OPTIONS as Sn, DEFAULT_ANTITANK_WALL_OPTIONS as St, BaselineFrameNormal as T, DEFAULT_BATTLE_POSITION_OPTIONS as Tn, DEFAULT_DELAY_OPTIONS as Tt, controlMeasureIdFromFeature as U, AttackHelicopterOptions as Ut, FeaturePartProps as V, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as Vt, ControlMeasure as W, DEFAULT_ATTACK_HELICOPTER_OPTIONS as Wt, ControlMeasureId as X, GenericRectangleOptions as Xt, CONTROL_MEASURE_METADATA as Y, DEFAULT_GENERIC_RECTANGLE_OPTIONS as Yt, ControlMeasureKind as Z, DEFAULT_GENERIC_POLYGON_OPTIONS as Zt, blockDrawRule as _, EncirclementOptions as _n, DEFAULT_FORTIFIED_AREA_OPTIONS as _t, rectangleDrawRule as a, ClassicArrowOptions as an, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as at, createMidpointPerpendicularDrawRule as b, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as bn, FortifiedLineOptions as bt, line24DrawRule as c, SupportingAttackOptions as cn, ObstacleBypassEasyOptions as ct, line1DrawRule as d, calculateMetrics as dn, DEFAULT_FIX_OPTIONS as dt, GenericLineOptions as en, getControlMeasureMetadataByValue as et, ambushDrawRule as f, computeInitialWidthPoint as fn, FixOptions as ft, disruptDrawRule as g, DEFAULT_ENCIRCLEMENT_OPTIONS as gn, DEFAULT_BLOCK_OPTIONS as gt, centerRadiusDrawRule as h, unproject as hn, BlockOptions as ht, DEFAULT_AMBUSH_OPTIONS as i, ClassicArrowHeadStyle as in, ObstacleBypassImpossibleOptions as it, roundToFixed as j, ParamDescriptor as jn, BypassOptions as jt, EPSILON as k, ControlMeasureGeometryType as kn, CanalizeOptions as kt, line23DrawRule as l, DEFAULT_MAIN_ATTACK_OPTIONS as ln, DEFAULT_TURN_OPTIONS as lt, point12DrawRule as m, project as mn, DisruptOptions as mt, TacticalArrowOptions as n, BlockArrowOptions as nn, listControlMeasureMetadata as nt, axis1DrawRule as o, DEFAULT_CLASSIC_ARROW_OPTIONS as on, ObstacleBypassDifficultOptions as ot, attackByFireDrawRule as p, Point2D as pn, DEFAULT_DISRUPT_OPTIONS as pt, ControlMeasureStyle as q, DEFAULT_GENERIC_CIRCLE_OPTIONS as qt, AmbushOptions as r, DEFAULT_BLOCK_ARROW_OPTIONS as rn, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as rt, supportByFireDrawRule as s, DEFAULT_SUPPORTING_ATTACK_OPTIONS as sn, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as st, DEFAULT_TACTICAL_ARROW_OPTIONS as t, BlockArrowHeadStyle as tn, getDefaultOptions as tt, turnDrawRule as u, MainAttackOptions as un, TurnOptions as ut, MidpointPerpendicularDrawRuleOptions as v, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as vn, FortifiedAreaOptions as vt, BaselineFrame as w, BattlePositionOptions as wn, DEFAULT_ANTITANK_DITCH_OPTIONS as wt, getMidpointPerpendicularSignedDistance as x, PrincipalDirectionOfFireOptions as xn, AntitankWallOptions as xt, computeDefaultMidpointPerpendicularPoint as y, FinalProtectiveFireOptions as yn, DEFAULT_FORTIFIED_LINE_OPTIONS as yt, ControlMeasureRender as z, AttackByFireOptions as zt };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as getControlMeasureMetadata, $t as DEFAULT_GENERIC_LINE_OPTIONS, A as getMetersPerPixel, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, C as snapToMidpointPerpendicular, Cn as
|
|
2
|
-
export { type AirborneAttackOptions, type AmbushOptions, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, type BlockMissionTaskOptions, type BlockOptions, type BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, type TacticalArrowOptions, type TurnOptions, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
|
1
|
+
import { $ as getControlMeasureMetadata, $t as DEFAULT_GENERIC_LINE_OPTIONS, A as getMetersPerPixel, An as ControlMeasureMetadata, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, C as snapToMidpointPerpendicular, Cn as StrongPointOptions, Ct as AntitankDitchOptions, D as BaselineFrameOrigin, Dn as DEFAULT_BOUNDARY_OPTIONS, Dt as ClearOptions, E as BaselineFrameOptions, En as BoundaryOptions, Et as DelayOptions, F as resolveStyleHints, Ft as BlockMissionTaskOptions, G as cloneControlMeasure, Gt as AirborneAttackOptions, H as StyleHints, Ht as SupportByFireOptions, I as freezeOrientationOptions, It as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, J as CONTROL_MEASURE_IDS, Jt as GenericCircleOptions, K as isKind, Kt as DEFAULT_AIRBORNE_ATTACK_OPTIONS, L as RenderOptions, Lt as DEFAULT_FLOT_OPTIONS, M as SimpleStyleProps, Mn as AnchorTransformEvent, Mt as DEFAULT_BYPASS_OPTIONS, N as SimpleStyleRender, Nn as ControlMeasureDrawRule, Nt as BreachOptions, O as createBaselineFrame, On as ControlMeasureGeometry, Ot as DEFAULT_CLEAR_OPTIONS, P as toSimpleStyle, Pt as DEFAULT_BREACH_OPTIONS, Q as OptionsByKind, Qt as GenericPolygonOptions, R as renderControlMeasure, Rt as FLOTOptions, S as pointOnMidpointPerpendicularAxis, Sn as DEFAULT_STRONG_POINT_OPTIONS, St as DEFAULT_ANTITANK_WALL_OPTIONS, T as BaselineFrameNormal, Tn as DEFAULT_BATTLE_POSITION_OPTIONS, Tt as DEFAULT_DELAY_OPTIONS, U as controlMeasureIdFromFeature, Ut as AttackHelicopterOptions, V as FeaturePartProps, Vt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, W as ControlMeasure, Wt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, X as ControlMeasureId, Xt as GenericRectangleOptions, Y as CONTROL_MEASURE_METADATA, Yt as DEFAULT_GENERIC_RECTANGLE_OPTIONS, Z as ControlMeasureKind, Zt as DEFAULT_GENERIC_POLYGON_OPTIONS, _ as blockDrawRule, _n as EncirclementOptions, _t as DEFAULT_FORTIFIED_AREA_OPTIONS, a as rectangleDrawRule, an as ClassicArrowOptions, at as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, b as createMidpointPerpendicularDrawRule, bn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, bt as FortifiedLineOptions, c as line24DrawRule, cn as SupportingAttackOptions, ct as ObstacleBypassEasyOptions, d as line1DrawRule, dn as calculateMetrics, dt as DEFAULT_FIX_OPTIONS, en as GenericLineOptions, et as getControlMeasureMetadataByValue, f as ambushDrawRule, fn as computeInitialWidthPoint, ft as FixOptions, g as disruptDrawRule, gn as DEFAULT_ENCIRCLEMENT_OPTIONS, gt as DEFAULT_BLOCK_OPTIONS, h as centerRadiusDrawRule, hn as unproject, ht as BlockOptions, i as DEFAULT_AMBUSH_OPTIONS, in as ClassicArrowHeadStyle, it as ObstacleBypassImpossibleOptions, j as roundToFixed, jn as ParamDescriptor, jt as BypassOptions, k as EPSILON, kn as ControlMeasureGeometryType, kt as CanalizeOptions, l as line23DrawRule, ln as DEFAULT_MAIN_ATTACK_OPTIONS, lt as DEFAULT_TURN_OPTIONS, m as point12DrawRule, mn as project, mt as DisruptOptions, n as TacticalArrowOptions, nn as BlockArrowOptions, nt as listControlMeasureMetadata, o as axis1DrawRule, on as DEFAULT_CLASSIC_ARROW_OPTIONS, ot as ObstacleBypassDifficultOptions, p as attackByFireDrawRule, pn as Point2D, pt as DEFAULT_DISRUPT_OPTIONS, q as ControlMeasureStyle, qt as DEFAULT_GENERIC_CIRCLE_OPTIONS, r as AmbushOptions, rn as DEFAULT_BLOCK_ARROW_OPTIONS, rt as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, s as supportByFireDrawRule, sn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, st as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, t as DEFAULT_TACTICAL_ARROW_OPTIONS, tn as BlockArrowHeadStyle, tt as getDefaultOptions, u as turnDrawRule, un as MainAttackOptions, ut as TurnOptions, v as MidpointPerpendicularDrawRuleOptions, vn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, vt as FortifiedAreaOptions, w as BaselineFrame, wn as BattlePositionOptions, wt as DEFAULT_ANTITANK_DITCH_OPTIONS, x as getMidpointPerpendicularSignedDistance, xn as PrincipalDirectionOfFireOptions, xt as AntitankWallOptions, y as computeDefaultMidpointPerpendicularPoint, yn as FinalProtectiveFireOptions, yt as DEFAULT_FORTIFIED_LINE_OPTIONS, z as ControlMeasureRender, zt as AttackByFireOptions } from "./index-BHWESyWA.mjs";
|
|
2
|
+
export { type AirborneAttackOptions, type AmbushOptions, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, 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 ClassicArrowHeadStyle, type ClassicArrowOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_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_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, type TacticalArrowOptions, type TurnOptions, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as turnDrawRule, A as DEFAULT_GENERIC_POLYGON_OPTIONS, B as DEFAULT_BLOCK_OPTIONS, C as DEFAULT_FIX_OPTIONS, D as DEFAULT_DELAY_OPTIONS, E as DEFAULT_DISRUPT_OPTIONS, F as DEFAULT_BYPASS_OPTIONS, G as DEFAULT_ANTITANK_DITCH_OPTIONS, H as DEFAULT_ATTACK_HELICOPTER_OPTIONS, I as DEFAULT_BREACH_OPTIONS, J as rectangleDrawRule, K as DEFAULT_AMBUSH_OPTIONS, L as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, M as DEFAULT_GENERIC_CIRCLE_OPTIONS, N as DEFAULT_CLASSIC_ARROW_OPTIONS, O as DEFAULT_CLEAR_OPTIONS, P as DEFAULT_CANALIZE_OPTIONS, Q as line23DrawRule, R as DEFAULT_BOUNDARY_OPTIONS, S as DEFAULT_FLOT_OPTIONS, T as DEFAULT_ENCIRCLEMENT_OPTIONS, U as DEFAULT_ATTACK_BY_FIRE_OPTIONS, V as DEFAULT_BATTLE_POSITION_OPTIONS, W as DEFAULT_ANTITANK_WALL_OPTIONS, X as supportByFireDrawRule, Y as axis1DrawRule, Z as line24DrawRule, _ as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, _t as EPSILON, a as DEFINITIONS, at as disruptDrawRule, b as DEFAULT_FORTIFIED_AREA_OPTIONS, c as getDefaultOptions, ct as createMidpointPerpendicularDrawRule, d as DEFAULT_SUPPORTING_ATTACK_OPTIONS, dt as snapToMidpointPerpendicular, et as line1DrawRule, f as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, ft as createBaselineFrame, g as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, gt as unproject, h as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, ht as project, i as CONTROL_MEASURE_METADATA, it as centerRadiusDrawRule, j as DEFAULT_GENERIC_LINE_OPTIONS, k as DEFAULT_GENERIC_RECTANGLE_OPTIONS, l as listControlMeasureMetadata, lt as getMidpointPerpendicularSignedDistance, m as DEFAULT_TACTICAL_ARROW_OPTIONS, mt as computeInitialWidthPoint, n as resolveStyleHints, nt as attackByFireDrawRule, o as getControlMeasureMetadata, ot as blockDrawRule, p as DEFAULT_STRONG_POINT_OPTIONS, pt as calculateMetrics, q as DEFAULT_AIRBORNE_ATTACK_OPTIONS, r as CONTROL_MEASURE_IDS, rt as point12DrawRule, s as getControlMeasureMetadataByValue, st as computeDefaultMidpointPerpendicularPoint, t as renderControlMeasure, tt as ambushDrawRule, u as DEFAULT_TURN_OPTIONS, ut as pointOnMidpointPerpendicularAxis, v as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, vt as getMetersPerPixel, w as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, x as DEFAULT_FORTIFIED_LINE_OPTIONS, y as DEFAULT_MAIN_ATTACK_OPTIONS, yt as roundToFixed, z as DEFAULT_BLOCK_ARROW_OPTIONS } from "./renderControlMeasure-DnM2w9jS.mjs";
|
|
2
2
|
//#region src/freeze-orientation.ts
|
|
3
3
|
/**
|
|
4
4
|
* Dispatches to a measure kind's `freezeOrientation` hook (see
|
|
@@ -114,4 +114,4 @@ function toHexChannel(value) {
|
|
|
114
114
|
return Math.max(0, Math.min(255, Math.round(value))).toString(16).padStart(2, "0");
|
|
115
115
|
}
|
|
116
116
|
//#endregion
|
|
117
|
-
export { CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, EPSILON, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
|
117
|
+
export { CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_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_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, EPSILON, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
package/dist/preview/index.d.mts
CHANGED
package/dist/preview/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-
|
|
1
|
+
import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-DnM2w9jS.mjs";
|
|
2
2
|
//#region src/preview/index.ts
|
|
3
3
|
/**
|
|
4
4
|
* Unitless `previewSample` points (~`[-1, 1]`) are scaled by this degree offset
|
|
@@ -181,7 +181,7 @@ function pointToInfiniteLineDistance(p, a, b) {
|
|
|
181
181
|
}
|
|
182
182
|
/**
|
|
183
183
|
* Calculates intersection of two line segments p1-p2 and p3-p4.
|
|
184
|
-
* Returns null if parallel
|
|
184
|
+
* Returns null if parallel or if the infinite lines intersect outside either segment.
|
|
185
185
|
*/
|
|
186
186
|
function lineIntersection(p1, p2, p3, p4) {
|
|
187
187
|
const x1 = p1[0], y1 = p1[1];
|
|
@@ -191,6 +191,8 @@ function lineIntersection(p1, p2, p3, p4) {
|
|
|
191
191
|
const denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
|
|
192
192
|
if (Math.abs(denom) < 1e-6) return null;
|
|
193
193
|
const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denom;
|
|
194
|
+
const ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denom;
|
|
195
|
+
if (ua < -1e-6 || ua > 1.000001 || ub < -1e-6 || ub > 1.000001) return null;
|
|
194
196
|
return [x1 + ua * (x2 - x1), y1 + ua * (y2 - y1)];
|
|
195
197
|
}
|
|
196
198
|
//#endregion
|
|
@@ -204,8 +206,8 @@ const SHAFT_MAX_RATIO = .9;
|
|
|
204
206
|
*/
|
|
205
207
|
function processAttackGeometry(coordinates, options = {}) {
|
|
206
208
|
const shaftRatio = clamp(options.shaftWidthRatio ?? .6, SHAFT_MIN_RATIO, SHAFT_MAX_RATIO);
|
|
207
|
-
const
|
|
208
|
-
const
|
|
209
|
+
const smooth = options.smooth ?? false;
|
|
210
|
+
const smoothResolution = options.smoothResolution ?? 5;
|
|
209
211
|
const points = coordinates.map((c) => project(c[0], c[1]));
|
|
210
212
|
const numPoints = points.length;
|
|
211
213
|
const ptTip = points[0];
|
|
@@ -215,18 +217,41 @@ function processAttackGeometry(coordinates, options = {}) {
|
|
|
215
217
|
const p = points[i];
|
|
216
218
|
if (p) spinePoints.push(p);
|
|
217
219
|
}
|
|
218
|
-
return { geometry: calculateSymbolGeometry(ptTip, ptWidth, spinePoints, shaftRatio,
|
|
219
|
-
}
|
|
220
|
-
function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio,
|
|
221
|
-
const
|
|
220
|
+
return { geometry: calculateSymbolGeometry(ptTip, ptWidth, spinePoints, shaftRatio, smooth, smoothResolution) };
|
|
221
|
+
}
|
|
222
|
+
function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, smooth, smoothResolution) {
|
|
223
|
+
const initialNeck = spine[spine.length - 1];
|
|
224
|
+
if (!initialNeck) return null;
|
|
225
|
+
const initialTipDir = vecNorm(vecSub(ptTip, initialNeck));
|
|
226
|
+
if (vecMag(initialTipDir) < 1e-6) return null;
|
|
227
|
+
const headHalfWidth = pointToInfiniteLineDistance(ptWidth, initialNeck, ptTip);
|
|
228
|
+
const vecTipToWidth = vecSub(ptTip, ptWidth);
|
|
229
|
+
const requestedHeadLength = Math.max(EPSILON, vecDot(vecTipToWidth, initialTipDir));
|
|
230
|
+
const path = [...spine, ptTip];
|
|
231
|
+
let totalArcLength = 0;
|
|
232
|
+
for (let i = 1; i < path.length; i++) totalArcLength += vecMag(vecSub(path[i], path[i - 1]));
|
|
233
|
+
const minimumShaftLength = Math.max(EPSILON, totalArcLength * .01);
|
|
234
|
+
let distanceRemaining = clamp(requestedHeadLength, EPSILON, Math.max(EPSILON, totalArcLength - minimumShaftLength));
|
|
235
|
+
let ptBase = ptTip;
|
|
236
|
+
let remainingSpine = spine;
|
|
237
|
+
for (let i = path.length - 1; i > 0; i--) {
|
|
238
|
+
const segmentEnd = path[i];
|
|
239
|
+
const segmentStart = path[i - 1];
|
|
240
|
+
const segment = vecSub(segmentStart, segmentEnd);
|
|
241
|
+
const segmentLength = vecMag(segment);
|
|
242
|
+
if (segmentLength < 1e-6) continue;
|
|
243
|
+
if (distanceRemaining < segmentLength) {
|
|
244
|
+
ptBase = vecAdd(segmentEnd, vecScale(segment, distanceRemaining / segmentLength));
|
|
245
|
+
remainingSpine = path.slice(0, i);
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
distanceRemaining -= segmentLength;
|
|
249
|
+
}
|
|
250
|
+
const ptNeck = remainingSpine[remainingSpine.length - 1];
|
|
222
251
|
if (!ptNeck) return null;
|
|
223
252
|
const tipDir = vecNorm(vecSub(ptTip, ptNeck));
|
|
224
253
|
if (vecMag(tipDir) < 1e-6) return null;
|
|
225
|
-
const
|
|
226
|
-
const vecTipToWidth = vecSub(ptTip, ptWidth);
|
|
227
|
-
const maxHeadLength = Math.max(0, vecMag(vecSub(ptTip, ptNeck)) - .1);
|
|
228
|
-
const headLength = clamp(vecDot(vecTipToWidth, tipDir), EPSILON, maxHeadLength);
|
|
229
|
-
const ptBase = vecSub(ptTip, vecScale(tipDir, headLength));
|
|
254
|
+
const headLength = vecMag(vecSub(ptTip, ptBase));
|
|
230
255
|
const shaftHalfWidth = headHalfWidth * shaftRatio;
|
|
231
256
|
const perpDir = [-tipDir[1], tipDir[0]];
|
|
232
257
|
const outerLeft = vecAdd(ptBase, vecScale(perpDir, headHalfWidth));
|
|
@@ -234,7 +259,8 @@ function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, roundedBends
|
|
|
234
259
|
const innerLeft = vecAdd(ptBase, vecScale(perpDir, shaftHalfWidth));
|
|
235
260
|
const innerRight = vecAdd(ptBase, vecScale(perpDir, -shaftHalfWidth));
|
|
236
261
|
const notchDepth = headLength * shaftRatio;
|
|
237
|
-
const
|
|
262
|
+
const safeNotchDepth = Math.min(notchDepth, headLength - EPSILON);
|
|
263
|
+
const innerTip = vecAdd(ptBase, vecScale(tipDir, safeNotchDepth));
|
|
238
264
|
const shaftEndCenter = ptBase;
|
|
239
265
|
const headRing = [
|
|
240
266
|
outerLeft,
|
|
@@ -245,10 +271,10 @@ function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, roundedBends
|
|
|
245
271
|
innerLeft,
|
|
246
272
|
outerLeft
|
|
247
273
|
];
|
|
248
|
-
const fullSpine = [...
|
|
274
|
+
const fullSpine = [...remainingSpine, shaftEndCenter];
|
|
249
275
|
return {
|
|
250
|
-
shaftLeft: offsetPolyline(fullSpine, shaftHalfWidth,
|
|
251
|
-
shaftRight: offsetPolyline(fullSpine, -shaftHalfWidth,
|
|
276
|
+
shaftLeft: offsetPolyline(fullSpine, shaftHalfWidth, smooth, smoothResolution),
|
|
277
|
+
shaftRight: offsetPolyline(fullSpine, -shaftHalfWidth, smooth, smoothResolution),
|
|
252
278
|
headRing,
|
|
253
279
|
ptTip,
|
|
254
280
|
ptNeck,
|
|
@@ -949,20 +975,20 @@ const ATTACK_SHAFT_PARAMS = [
|
|
|
949
975
|
step: .05
|
|
950
976
|
},
|
|
951
977
|
{
|
|
952
|
-
key: "
|
|
953
|
-
label: "
|
|
978
|
+
key: "smooth",
|
|
979
|
+
label: "Smooth",
|
|
954
980
|
description: "Round the corners where the shaft changes direction.",
|
|
955
981
|
type: "boolean"
|
|
956
982
|
},
|
|
957
983
|
{
|
|
958
|
-
key: "
|
|
959
|
-
label: "
|
|
960
|
-
description: "Number of segments approximating each rounded bend",
|
|
984
|
+
key: "smoothResolution",
|
|
985
|
+
label: "Smooth resolution",
|
|
986
|
+
description: "Number of segments approximating each rounded bend when smooth mode is enabled.",
|
|
961
987
|
type: "number",
|
|
962
988
|
min: 1,
|
|
963
989
|
max: 20,
|
|
964
990
|
step: 1,
|
|
965
|
-
visibleWhen: (opts) => opts.
|
|
991
|
+
visibleWhen: (opts) => opts.smooth === true
|
|
966
992
|
}
|
|
967
993
|
];
|
|
968
994
|
const FIRE_ARROW_PARAMS = [
|
|
@@ -976,8 +1002,8 @@ const FIRE_ARROW_PARAMS = [
|
|
|
976
1002
|
step: .01
|
|
977
1003
|
},
|
|
978
1004
|
{
|
|
979
|
-
key: "
|
|
980
|
-
label: "
|
|
1005
|
+
key: "rearLineLengthRatio",
|
|
1006
|
+
label: "Rear line length",
|
|
981
1007
|
description: "Length of the rear flare lines as a ratio of the head",
|
|
982
1008
|
type: "number",
|
|
983
1009
|
min: .05,
|
|
@@ -985,8 +1011,8 @@ const FIRE_ARROW_PARAMS = [
|
|
|
985
1011
|
step: .01
|
|
986
1012
|
},
|
|
987
1013
|
{
|
|
988
|
-
key: "
|
|
989
|
-
label: "
|
|
1014
|
+
key: "rearLineAngle",
|
|
1015
|
+
label: "Rear line angle",
|
|
990
1016
|
description: "Angle of the rear flare lines, in degrees",
|
|
991
1017
|
type: "number",
|
|
992
1018
|
min: 0,
|
|
@@ -995,8 +1021,8 @@ const FIRE_ARROW_PARAMS = [
|
|
|
995
1021
|
}
|
|
996
1022
|
];
|
|
997
1023
|
const FORTIFIED_AREA_SIZE_PARAMS = [{
|
|
998
|
-
key: "
|
|
999
|
-
label: "
|
|
1024
|
+
key: "toothSizePixels",
|
|
1025
|
+
label: "Tooth size",
|
|
1000
1026
|
description: "Size of the fortified-area teeth, in pixels",
|
|
1001
1027
|
type: "number",
|
|
1002
1028
|
min: 5,
|
|
@@ -1004,8 +1030,8 @@ const FORTIFIED_AREA_SIZE_PARAMS = [{
|
|
|
1004
1030
|
step: 1,
|
|
1005
1031
|
unit: "px"
|
|
1006
1032
|
}, {
|
|
1007
|
-
key: "
|
|
1008
|
-
label: "
|
|
1033
|
+
key: "toothSize",
|
|
1034
|
+
label: "Tooth size",
|
|
1009
1035
|
description: "Size of the fortified-area teeth, in meters",
|
|
1010
1036
|
type: "number",
|
|
1011
1037
|
min: 1,
|
|
@@ -1072,8 +1098,8 @@ const FORTIFIED_AREA_PARAMS = [
|
|
|
1072
1098
|
//#region src/generators/cm15-maneuver-areas/airborneAttack.ts
|
|
1073
1099
|
const DEFAULT_AIRBORNE_ATTACK_OPTIONS = {
|
|
1074
1100
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
1075
|
-
|
|
1076
|
-
|
|
1101
|
+
smooth: false,
|
|
1102
|
+
smoothResolution: 5
|
|
1077
1103
|
};
|
|
1078
1104
|
const AIRBORNE_ATTACK_METADATA = {
|
|
1079
1105
|
id: "airborne-attack",
|
|
@@ -1168,7 +1194,7 @@ const DEFAULT_AMBUSH_OPTIONS = {
|
|
|
1168
1194
|
hatchLengthRatio: .15,
|
|
1169
1195
|
hatchCount: 5,
|
|
1170
1196
|
curveDepthRatio: .25,
|
|
1171
|
-
|
|
1197
|
+
arcSegments: 30
|
|
1172
1198
|
};
|
|
1173
1199
|
const AMBUSH_METADATA = {
|
|
1174
1200
|
id: "ambush",
|
|
@@ -1229,8 +1255,8 @@ const AMBUSH_METADATA = {
|
|
|
1229
1255
|
step: .01
|
|
1230
1256
|
},
|
|
1231
1257
|
{
|
|
1232
|
-
key: "
|
|
1233
|
-
label: "
|
|
1258
|
+
key: "arcSegments",
|
|
1259
|
+
label: "Arc segments",
|
|
1234
1260
|
description: "Number of segments used to render the curve",
|
|
1235
1261
|
type: "number",
|
|
1236
1262
|
min: 4,
|
|
@@ -1252,11 +1278,11 @@ const quadBezier = (t, a, b, c) => {
|
|
|
1252
1278
|
* @returns GeoJSON FeatureCollection containing LineString components
|
|
1253
1279
|
*/
|
|
1254
1280
|
function createAmbushSymbol(coordinates, options = {}) {
|
|
1255
|
-
const { arrowheadLengthRatio, arrowheadWidthRatio, hatchLengthRatio, hatchCount, curveDepthRatio,
|
|
1281
|
+
const { arrowheadLengthRatio, arrowheadWidthRatio, hatchLengthRatio, hatchCount, curveDepthRatio, arcSegments } = {
|
|
1256
1282
|
...DEFAULT_AMBUSH_OPTIONS,
|
|
1257
1283
|
...options
|
|
1258
1284
|
};
|
|
1259
|
-
const
|
|
1285
|
+
const safeArcSegments = Math.max(1, Math.floor(arcSegments));
|
|
1260
1286
|
const safeHatchCount = Math.max(0, Math.floor(hatchCount));
|
|
1261
1287
|
const safeArrowheadLengthRatio = Math.max(0, arrowheadLengthRatio);
|
|
1262
1288
|
const safeArrowheadWidthRatio = Math.max(0, arrowheadWidthRatio);
|
|
@@ -1289,8 +1315,8 @@ function createAmbushSymbol(coordinates, options = {}) {
|
|
|
1289
1315
|
vecSub(hBase, vecScale(perp, hw))
|
|
1290
1316
|
]);
|
|
1291
1317
|
const curve = [];
|
|
1292
|
-
for (let i = 0; i <=
|
|
1293
|
-
const t = i /
|
|
1318
|
+
for (let i = 0; i <= safeArcSegments; i++) {
|
|
1319
|
+
const t = i / safeArcSegments;
|
|
1294
1320
|
curve.push(quadBezier(t, p2, ctrl, p3));
|
|
1295
1321
|
}
|
|
1296
1322
|
lines.push(curve);
|
|
@@ -1337,8 +1363,8 @@ const FORTIFIED_PARAMS = [
|
|
|
1337
1363
|
visibleWhen: (opts) => Boolean(opts.smooth)
|
|
1338
1364
|
},
|
|
1339
1365
|
{
|
|
1340
|
-
key: "
|
|
1341
|
-
label: "
|
|
1366
|
+
key: "toothSizePixels",
|
|
1367
|
+
label: "Tooth size",
|
|
1342
1368
|
description: "Side length of the square crenellations",
|
|
1343
1369
|
type: "number",
|
|
1344
1370
|
min: 5,
|
|
@@ -1347,8 +1373,8 @@ const FORTIFIED_PARAMS = [
|
|
|
1347
1373
|
unit: "px"
|
|
1348
1374
|
},
|
|
1349
1375
|
{
|
|
1350
|
-
key: "
|
|
1351
|
-
label: "
|
|
1376
|
+
key: "toothSize",
|
|
1377
|
+
label: "Tooth size",
|
|
1352
1378
|
description: "Side length of the square crenellations",
|
|
1353
1379
|
type: "number",
|
|
1354
1380
|
min: 1,
|
|
@@ -1597,8 +1623,8 @@ const ANTITANK_WALL = defineControlMeasure({
|
|
|
1597
1623
|
//#region src/generators/cm15-maneuver-areas/attackByFire.ts
|
|
1598
1624
|
const DEFAULT_ATTACK_BY_FIRE_OPTIONS = {
|
|
1599
1625
|
arrowheadWidthRatio: .3,
|
|
1600
|
-
|
|
1601
|
-
|
|
1626
|
+
rearLineLengthRatio: .3,
|
|
1627
|
+
rearLineAngle: 45
|
|
1602
1628
|
};
|
|
1603
1629
|
const ATTACK_BY_FIRE_METADATA = {
|
|
1604
1630
|
id: "attack-by-fire",
|
|
@@ -1629,8 +1655,8 @@ const ATTACK_BY_FIRE_METADATA = {
|
|
|
1629
1655
|
function createAttackByFire(coordinates, options = {}) {
|
|
1630
1656
|
const featureProps = {};
|
|
1631
1657
|
const arrowheadWidthRatio = options.arrowheadWidthRatio ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.arrowheadWidthRatio;
|
|
1632
|
-
const
|
|
1633
|
-
const
|
|
1658
|
+
const rearLineLengthRatio = options.rearLineLengthRatio ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.rearLineLengthRatio;
|
|
1659
|
+
const rearLineAngle = options.rearLineAngle ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.rearLineAngle;
|
|
1634
1660
|
const c1 = coordinates[0];
|
|
1635
1661
|
const c2 = coordinates[1];
|
|
1636
1662
|
const c3 = coordinates[2];
|
|
@@ -1656,13 +1682,13 @@ function createAttackByFire(coordinates, options = {}) {
|
|
|
1656
1682
|
const lenShaft = Math.abs(signedTipDistance);
|
|
1657
1683
|
const lenBase = frame.length;
|
|
1658
1684
|
const dirBase = frame.direction;
|
|
1659
|
-
const angleRad =
|
|
1685
|
+
const angleRad = rearLineAngle * Math.PI / 180;
|
|
1660
1686
|
const baseAngle = -Math.PI / 2;
|
|
1661
1687
|
const angleLeft = baseAngle - angleRad;
|
|
1662
1688
|
const dirBackLeft = [dirBase[0] * Math.cos(angleLeft) - dirBase[1] * Math.sin(angleLeft), dirBase[0] * Math.sin(angleLeft) + dirBase[1] * Math.cos(angleLeft)];
|
|
1663
1689
|
const angleRight = baseAngle + angleRad;
|
|
1664
1690
|
const dirBackRight = [dirBase[0] * Math.cos(angleRight) - dirBase[1] * Math.sin(angleRight), dirBase[0] * Math.sin(angleRight) + dirBase[1] * Math.cos(angleRight)];
|
|
1665
|
-
const backLen = lenBase *
|
|
1691
|
+
const backLen = lenBase * rearLineLengthRatio;
|
|
1666
1692
|
const p2Back = vecAdd(p2, vecScale(dirBackLeft, backLen));
|
|
1667
1693
|
const p3Back = vecAdd(p3, vecScale(dirBackRight, backLen));
|
|
1668
1694
|
const headWidth = lenShaft * arrowheadWidthRatio;
|
|
@@ -1737,8 +1763,8 @@ const ATTACK_BY_FIRE = defineControlMeasure({
|
|
|
1737
1763
|
//#region src/generators/cm15-maneuver-areas/attackHelicopter.ts
|
|
1738
1764
|
const DEFAULT_ATTACK_HELICOPTER_OPTIONS = {
|
|
1739
1765
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
1740
|
-
|
|
1741
|
-
|
|
1766
|
+
smooth: false,
|
|
1767
|
+
smoothResolution: 5,
|
|
1742
1768
|
symbolHeightRatio: .45,
|
|
1743
1769
|
triangleSizeRatio: .25,
|
|
1744
1770
|
bottomBarWidthRatio: 1.5,
|
|
@@ -1826,7 +1852,7 @@ function createAttackHelicopter(coordinates, options = {}) {
|
|
|
1826
1852
|
type: "FeatureCollection",
|
|
1827
1853
|
features: []
|
|
1828
1854
|
};
|
|
1829
|
-
const center = lineIntersection(pL, pIR, pR, pIL);
|
|
1855
|
+
const center = lineIntersection(pL, pIR, pR, pIL) ?? geometry.ptBase;
|
|
1830
1856
|
const features = [{
|
|
1831
1857
|
type: "Feature",
|
|
1832
1858
|
properties: {},
|
|
@@ -2338,15 +2364,18 @@ function closedCatmullRom(points, samples) {
|
|
|
2338
2364
|
}
|
|
2339
2365
|
//#endregion
|
|
2340
2366
|
//#region src/internal/area-echelon.ts
|
|
2341
|
-
/**
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2367
|
+
/**
|
|
2368
|
+
* Twice the ring's signed area (shoelace). Positive when the ring winds
|
|
2369
|
+
* counter-clockwise in projected (y-up) coordinates.
|
|
2370
|
+
*/
|
|
2371
|
+
function ringSignedArea2(verts) {
|
|
2372
|
+
let area2 = 0;
|
|
2373
|
+
for (let i = 0; i < verts.length - 1; i++) {
|
|
2374
|
+
const a = verts[i];
|
|
2375
|
+
const b = verts[i + 1];
|
|
2376
|
+
area2 += a[0] * b[1] - b[0] * a[1];
|
|
2348
2377
|
}
|
|
2349
|
-
return
|
|
2378
|
+
return area2;
|
|
2350
2379
|
}
|
|
2351
2380
|
/**
|
|
2352
2381
|
* Projects `positions` and returns a closed ring (first == last), optionally
|
|
@@ -2366,7 +2395,7 @@ function buildClosedRing(positions, smooth, smoothResolution, defaultSmoothResol
|
|
|
2366
2395
|
* projected y), the side opposite the front.
|
|
2367
2396
|
*/
|
|
2368
2397
|
function buildAreaPerimeter(verts) {
|
|
2369
|
-
const
|
|
2398
|
+
const ccw = ringSignedArea2(verts) > 0;
|
|
2370
2399
|
const segs = [];
|
|
2371
2400
|
let totalLength = 0;
|
|
2372
2401
|
let anchorTarget = 0;
|
|
@@ -2379,8 +2408,7 @@ function buildAreaPerimeter(verts) {
|
|
|
2379
2408
|
if (length < 1e-6) continue;
|
|
2380
2409
|
const along = vecNorm(edge);
|
|
2381
2410
|
const mid = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
|
|
2382
|
-
|
|
2383
|
-
if (perp[0] * (mid[0] - centroid[0]) + perp[1] * (mid[1] - centroid[1]) < 0) perp = [-perp[0], -perp[1]];
|
|
2411
|
+
const perp = ccw ? [along[1], -along[0]] : [-along[1], along[0]];
|
|
2384
2412
|
segs.push({
|
|
2385
2413
|
start: a,
|
|
2386
2414
|
along,
|
|
@@ -2701,7 +2729,7 @@ const DEFAULT_SMOOTH_RESOLUTION$5 = 12;
|
|
|
2701
2729
|
const MIN_SMOOTH_RESOLUTION$1 = 2;
|
|
2702
2730
|
const MAX_SMOOTH_RESOLUTION$1 = 64;
|
|
2703
2731
|
const DEFAULT_BLOCK_ARROW_OPTIONS = {
|
|
2704
|
-
|
|
2732
|
+
shaftWidthRatio: .06,
|
|
2705
2733
|
arrowheadStyle: "triangle",
|
|
2706
2734
|
arrowheadWidthRatio: .18,
|
|
2707
2735
|
arrowheadLengthRatio: .22,
|
|
@@ -2723,7 +2751,7 @@ const BLOCK_ARROW_METADATA = {
|
|
|
2723
2751
|
drawRule: "Axis1",
|
|
2724
2752
|
params: [
|
|
2725
2753
|
{
|
|
2726
|
-
key: "
|
|
2754
|
+
key: "shaftWidthRatio",
|
|
2727
2755
|
label: "Shaft width",
|
|
2728
2756
|
description: "Shaft band width as a fraction of the total path length",
|
|
2729
2757
|
type: "number",
|
|
@@ -2816,7 +2844,7 @@ const BLOCK_ARROW_METADATA = {
|
|
|
2816
2844
|
* right side of the shaft.
|
|
2817
2845
|
*/
|
|
2818
2846
|
function createBlockArrow(coordinates, options = {}) {
|
|
2819
|
-
const {
|
|
2847
|
+
const { shaftWidthRatio, arrowheadStyle, arrowheadWidthRatio, arrowheadLengthRatio, smooth, smoothResolution, filled } = {
|
|
2820
2848
|
...DEFAULT_BLOCK_ARROW_OPTIONS,
|
|
2821
2849
|
...options
|
|
2822
2850
|
};
|
|
@@ -2829,7 +2857,7 @@ function createBlockArrow(coordinates, options = {}) {
|
|
|
2829
2857
|
const { pts, pathLength, tip, dir, perp, segLength } = axis;
|
|
2830
2858
|
const requestedHeadLen = axis1.headLength ?? pathLength * arrowheadLengthRatio;
|
|
2831
2859
|
const headLen = Math.min(requestedHeadLen, segLength * .95);
|
|
2832
|
-
const halfShaft = pathLength *
|
|
2860
|
+
const halfShaft = pathLength * shaftWidthRatio / 2;
|
|
2833
2861
|
const halfHead = axis1.headHalfWidth ?? pathLength * arrowheadWidthRatio / 2;
|
|
2834
2862
|
const onAxis = (d, side = 0) => [tip[0] - dir[0] * d + perp[0] * side, tip[1] - dir[1] * d + perp[1] * side];
|
|
2835
2863
|
let shaftEndDist;
|
|
@@ -2928,7 +2956,7 @@ const BLOCK_ARROW = defineControlMeasure({
|
|
|
2928
2956
|
[-1.5, 0],
|
|
2929
2957
|
[.95, .4]
|
|
2930
2958
|
],
|
|
2931
|
-
options: {
|
|
2959
|
+
options: { shaftWidthRatio: .2 }
|
|
2932
2960
|
}
|
|
2933
2961
|
});
|
|
2934
2962
|
function axis1Geometry(coordinates) {
|
|
@@ -4962,7 +4990,7 @@ const BLADE_LENGTH_FRACTION = .8;
|
|
|
4962
4990
|
const DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS = {
|
|
4963
4991
|
arrowheadLengthRatio: .07,
|
|
4964
4992
|
arrowheadWidthRatio: .67,
|
|
4965
|
-
|
|
4993
|
+
bladeHeightRatio: .03
|
|
4966
4994
|
};
|
|
4967
4995
|
const FPF_SHARED = {
|
|
4968
4996
|
entity: "Maneuver Lines",
|
|
@@ -4992,7 +5020,7 @@ const FPF_SHARED = {
|
|
|
4992
5020
|
step: .01
|
|
4993
5021
|
},
|
|
4994
5022
|
{
|
|
4995
|
-
key: "
|
|
5023
|
+
key: "bladeHeightRatio",
|
|
4996
5024
|
label: "Blade height",
|
|
4997
5025
|
description: "Blade's perpendicular reach into the V, as a fraction of its arm's length",
|
|
4998
5026
|
type: "number",
|
|
@@ -5022,7 +5050,7 @@ const FINAL_PROTECTIVE_FIRE_RIGHT_METADATA = {
|
|
|
5022
5050
|
* Builds the filled "blade": a uniform-width rectangle hugging the inside of
|
|
5023
5051
|
* one arm. One long edge lies on the central 80% of the arm line (connected to
|
|
5024
5052
|
* the line); the strip bulges perpendicularly into the inside of the V by
|
|
5025
|
-
* `
|
|
5053
|
+
* `bladeHeightRatio * armLength`.
|
|
5026
5054
|
*
|
|
5027
5055
|
* @param vertex - PT 1, the shared vertex of the V (projected)
|
|
5028
5056
|
* @param tip - the outward tip of the bladed arm (projected)
|
|
@@ -5030,7 +5058,7 @@ const FINAL_PROTECTIVE_FIRE_RIGHT_METADATA = {
|
|
|
5030
5058
|
* be undefined during live single-arm feedback, in which case a default side
|
|
5031
5059
|
* is chosen
|
|
5032
5060
|
*/
|
|
5033
|
-
function bladeRectangle(vertex, tip, otherTip,
|
|
5061
|
+
function bladeRectangle(vertex, tip, otherTip, bladeHeightRatio) {
|
|
5034
5062
|
const v = vecSub(tip, vertex);
|
|
5035
5063
|
const armLength = vecMag(v);
|
|
5036
5064
|
if (armLength < 1e-6) return null;
|
|
@@ -5043,7 +5071,7 @@ function bladeRectangle(vertex, tip, otherTip, bladeHeight) {
|
|
|
5043
5071
|
const gap = (1 - BLADE_LENGTH_FRACTION) / 2;
|
|
5044
5072
|
const onLineNear = vecAdd(vertex, vecScale(dir, armLength * gap));
|
|
5045
5073
|
const onLineFar = vecAdd(vertex, vecScale(dir, armLength * (1 - gap)));
|
|
5046
|
-
const height = vecScale(perp, armLength *
|
|
5074
|
+
const height = vecScale(perp, armLength * bladeHeightRatio);
|
|
5047
5075
|
return [
|
|
5048
5076
|
onLineNear,
|
|
5049
5077
|
onLineFar,
|
|
@@ -5065,7 +5093,7 @@ function bladeRectangle(vertex, tip, otherTip, bladeHeight) {
|
|
|
5065
5093
|
* @param options - Arrowhead and blade sizing parameters
|
|
5066
5094
|
*/
|
|
5067
5095
|
function createFinalProtectiveFire(coordinates, bladedArm, options = {}) {
|
|
5068
|
-
const { arrowheadLengthRatio, arrowheadWidthRatio,
|
|
5096
|
+
const { arrowheadLengthRatio, arrowheadWidthRatio, bladeHeightRatio } = {
|
|
5069
5097
|
...DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS,
|
|
5070
5098
|
...options
|
|
5071
5099
|
};
|
|
@@ -5085,7 +5113,7 @@ function createFinalProtectiveFire(coordinates, bladedArm, options = {}) {
|
|
|
5085
5113
|
const bladeTip = v.tips[bladedArm];
|
|
5086
5114
|
if (bladeTip) {
|
|
5087
5115
|
const otherTip = v.tips[bladedArm === 0 ? 1 : 0];
|
|
5088
|
-
const blade = bladeRectangle(v.vertex, bladeTip, otherTip, Math.max(0,
|
|
5116
|
+
const blade = bladeRectangle(v.vertex, bladeTip, otherTip, Math.max(0, bladeHeightRatio));
|
|
5089
5117
|
if (blade) {
|
|
5090
5118
|
const ring = [...blade, blade[0]].map((c) => unproject(c[0], c[1]));
|
|
5091
5119
|
features.push({
|
|
@@ -5271,14 +5299,14 @@ const FIX = defineControlMeasure({
|
|
|
5271
5299
|
//#region src/generators/cm14-maneuver-lines/flot.ts
|
|
5272
5300
|
const DEFAULT_RADIUS = 50;
|
|
5273
5301
|
const DEFAULT_RADIUS_PIXELS = 10;
|
|
5274
|
-
const
|
|
5302
|
+
const DEFAULT_ARC_SEGMENTS = 16;
|
|
5275
5303
|
/**
|
|
5276
5304
|
* Default options for the FLOT graphic.
|
|
5277
5305
|
*/
|
|
5278
5306
|
const DEFAULT_FLOT_OPTIONS = {
|
|
5279
5307
|
radius: DEFAULT_RADIUS,
|
|
5280
5308
|
radiusPixels: DEFAULT_RADIUS_PIXELS,
|
|
5281
|
-
|
|
5309
|
+
arcSegments: DEFAULT_ARC_SEGMENTS
|
|
5282
5310
|
};
|
|
5283
5311
|
const FLOT_METADATA = {
|
|
5284
5312
|
id: "flot",
|
|
@@ -5313,8 +5341,8 @@ const FLOT_METADATA = {
|
|
|
5313
5341
|
unit: "m"
|
|
5314
5342
|
},
|
|
5315
5343
|
{
|
|
5316
|
-
key: "
|
|
5317
|
-
label: "
|
|
5344
|
+
key: "arcSegments",
|
|
5345
|
+
label: "Arc segments",
|
|
5318
5346
|
description: "Number of points used to render each semicircle",
|
|
5319
5347
|
type: "number",
|
|
5320
5348
|
min: 4,
|
|
@@ -5334,16 +5362,16 @@ const FLOT_METADATA = {
|
|
|
5334
5362
|
* @param segmentDir - Direction vector of the segment (normalized)
|
|
5335
5363
|
* @param perpDir - Perpendicular direction vector (normalized)
|
|
5336
5364
|
* @param radius - Radius of the semicircle
|
|
5337
|
-
* @param
|
|
5365
|
+
* @param arcSegments - Number of points in the arc
|
|
5338
5366
|
* @param includeStart - Whether to include the start point
|
|
5339
5367
|
* @returns Array of arc points forming a true semicircle
|
|
5340
5368
|
*/
|
|
5341
|
-
function generateArcPoints(startPoint, segmentDir, perpDir, radius,
|
|
5369
|
+
function generateArcPoints(startPoint, segmentDir, perpDir, radius, arcSegments, includeStart) {
|
|
5342
5370
|
const points = [];
|
|
5343
5371
|
const startIndex = includeStart ? 0 : 1;
|
|
5344
5372
|
const center = vecAdd(startPoint, vecScale(segmentDir, radius));
|
|
5345
|
-
for (let i = startIndex; i <=
|
|
5346
|
-
const t = i /
|
|
5373
|
+
for (let i = startIndex; i <= arcSegments; i++) {
|
|
5374
|
+
const t = i / arcSegments;
|
|
5347
5375
|
const angle = Math.PI * (1 - t);
|
|
5348
5376
|
const alongSegment = Math.cos(angle) * radius;
|
|
5349
5377
|
const perpOffset = Math.sin(angle) * radius;
|
|
@@ -5358,11 +5386,11 @@ function generateArcPoints(startPoint, segmentDir, perpDir, radius, resolution,
|
|
|
5358
5386
|
* @param p1 - Start position (projected)
|
|
5359
5387
|
* @param p2 - End position (projected)
|
|
5360
5388
|
* @param radius - Radius of each semicircle
|
|
5361
|
-
* @param
|
|
5389
|
+
* @param arcSegments - Points per arc
|
|
5362
5390
|
* @param isFirstSegment - Whether this is the first segment (include start point)
|
|
5363
5391
|
* @returns Array of points forming the scalloped line for this segment
|
|
5364
5392
|
*/
|
|
5365
|
-
function processSegment(p1, p2, radius,
|
|
5393
|
+
function processSegment(p1, p2, radius, arcSegments, isFirstSegment) {
|
|
5366
5394
|
const segmentVec = vecSub(p2, p1);
|
|
5367
5395
|
const segmentLength = vecMag(segmentVec);
|
|
5368
5396
|
if (segmentLength < 1e-6) return isFirstSegment ? [p1] : [];
|
|
@@ -5374,14 +5402,14 @@ function processSegment(p1, p2, radius, resolution, isFirstSegment) {
|
|
|
5374
5402
|
const remainingLength = segmentLength - numFullArcs * diameter;
|
|
5375
5403
|
let currentPos = p1;
|
|
5376
5404
|
for (let arcIndex = 0; arcIndex < numFullArcs; arcIndex++) {
|
|
5377
|
-
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, radius,
|
|
5405
|
+
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, radius, arcSegments, arcIndex === 0 && isFirstSegment);
|
|
5378
5406
|
points.push(...arcPoints);
|
|
5379
5407
|
currentPos = vecAdd(currentPos, vecScale(segmentDir, diameter));
|
|
5380
5408
|
}
|
|
5381
5409
|
if (remainingLength > diameter * .1) {
|
|
5382
5410
|
const partialRadius = remainingLength / 2;
|
|
5383
|
-
const
|
|
5384
|
-
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, partialRadius,
|
|
5411
|
+
const partialArcSegments = Math.max(3, Math.round(arcSegments * (partialRadius / radius)));
|
|
5412
|
+
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, partialRadius, partialArcSegments, numFullArcs === 0 && isFirstSegment);
|
|
5385
5413
|
points.push(...arcPoints);
|
|
5386
5414
|
}
|
|
5387
5415
|
return points;
|
|
@@ -5401,22 +5429,22 @@ function processSegment(p1, p2, radius, resolution, isFirstSegment) {
|
|
|
5401
5429
|
* ```typescript
|
|
5402
5430
|
* const flot = createFLOT(
|
|
5403
5431
|
* [[-122.4194, 37.7749], [-122.4100, 37.7800], [-122.4000, 37.7750]],
|
|
5404
|
-
* { radius: 100,
|
|
5432
|
+
* { radius: 100, arcSegments: 20 }
|
|
5405
5433
|
* );
|
|
5406
5434
|
* ```
|
|
5407
5435
|
*/
|
|
5408
5436
|
function createFLOT(positions, options = {}) {
|
|
5409
|
-
const { radius = DEFAULT_RADIUS, radiusPixels, metersPerPixel,
|
|
5437
|
+
const { radius = DEFAULT_RADIUS, radiusPixels, metersPerPixel, arcSegments = DEFAULT_ARC_SEGMENTS } = options;
|
|
5410
5438
|
let effectiveRadius = radius;
|
|
5411
5439
|
if (radiusPixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveRadius = radiusPixels * metersPerPixel;
|
|
5412
5440
|
const safeRadius = Math.max(EPSILON, effectiveRadius);
|
|
5413
|
-
const
|
|
5441
|
+
const safeArcSegments = Math.max(3, Math.round(arcSegments));
|
|
5414
5442
|
const projectedPoints = positions.map((p) => project(p[0], p[1]));
|
|
5415
5443
|
const allPoints = [];
|
|
5416
5444
|
for (let i = 0; i < projectedPoints.length - 1; i++) {
|
|
5417
5445
|
const p1 = projectedPoints[i];
|
|
5418
5446
|
const p2 = projectedPoints[i + 1];
|
|
5419
|
-
const segmentPoints = processSegment(p1, p2, safeRadius,
|
|
5447
|
+
const segmentPoints = processSegment(p1, p2, safeRadius, safeArcSegments, i === 0);
|
|
5420
5448
|
allPoints.push(...segmentPoints);
|
|
5421
5449
|
}
|
|
5422
5450
|
if (allPoints.length > 0 && projectedPoints.length > 1) {
|
|
@@ -5445,15 +5473,15 @@ const FLOT = defineControlMeasure({
|
|
|
5445
5473
|
});
|
|
5446
5474
|
//#endregion
|
|
5447
5475
|
//#region src/generators/cm29-protection-lines/fortifiedLine.ts
|
|
5448
|
-
const
|
|
5449
|
-
const
|
|
5476
|
+
const DEFAULT_TOOTH_SIZE = 50;
|
|
5477
|
+
const DEFAULT_TOOTH_SIZE_PIXELS = 10;
|
|
5450
5478
|
const DEFAULT_SMOOTH_RESOLUTION$1 = 16;
|
|
5451
5479
|
/**
|
|
5452
5480
|
* Default options for the Fortified Line graphic.
|
|
5453
5481
|
*/
|
|
5454
5482
|
const DEFAULT_FORTIFIED_LINE_OPTIONS = {
|
|
5455
|
-
|
|
5456
|
-
|
|
5483
|
+
toothSize: DEFAULT_TOOTH_SIZE,
|
|
5484
|
+
toothSizePixels: DEFAULT_TOOTH_SIZE_PIXELS,
|
|
5457
5485
|
smooth: false,
|
|
5458
5486
|
smoothResolution: DEFAULT_SMOOTH_RESOLUTION$1
|
|
5459
5487
|
};
|
|
@@ -5543,9 +5571,9 @@ function processFortifiedSegment(p1, p2, size, isFirstSegment) {
|
|
|
5543
5571
|
* Calculates the effective size based on options and projection.
|
|
5544
5572
|
*/
|
|
5545
5573
|
function calculateEffectiveSize(options) {
|
|
5546
|
-
const {
|
|
5547
|
-
let effectiveSize =
|
|
5548
|
-
if (
|
|
5574
|
+
const { toothSize = DEFAULT_TOOTH_SIZE, toothSizePixels, metersPerPixel } = options;
|
|
5575
|
+
let effectiveSize = toothSize;
|
|
5576
|
+
if (toothSizePixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveSize = toothSizePixels * metersPerPixel;
|
|
5549
5577
|
return Math.max(EPSILON, effectiveSize);
|
|
5550
5578
|
}
|
|
5551
5579
|
/**
|
|
@@ -5797,8 +5825,8 @@ const ISOLATE = defineControlMeasure({
|
|
|
5797
5825
|
//#region src/generators/cm15-maneuver-areas/mainAttack.ts
|
|
5798
5826
|
const DEFAULT_MAIN_ATTACK_OPTIONS = {
|
|
5799
5827
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
5800
|
-
|
|
5801
|
-
|
|
5828
|
+
smooth: false,
|
|
5829
|
+
smoothResolution: 5
|
|
5802
5830
|
};
|
|
5803
5831
|
const MAIN_ATTACK_METADATA = {
|
|
5804
5832
|
id: "main-attack",
|
|
@@ -6703,8 +6731,8 @@ const STRONG_POINT = defineControlMeasure({
|
|
|
6703
6731
|
//#region src/generators/cm15-maneuver-areas/supportByFire.ts
|
|
6704
6732
|
const DEFAULT_SUPPORT_BY_FIRE_OPTIONS = {
|
|
6705
6733
|
arrowheadWidthRatio: .3,
|
|
6706
|
-
|
|
6707
|
-
|
|
6734
|
+
rearLineLengthRatio: .3,
|
|
6735
|
+
rearLineAngle: 45
|
|
6708
6736
|
};
|
|
6709
6737
|
const SUPPORT_BY_FIRE_METADATA = {
|
|
6710
6738
|
id: "support-by-fire",
|
|
@@ -6731,8 +6759,8 @@ const SUPPORT_BY_FIRE_METADATA = {
|
|
|
6731
6759
|
function createSupportByFire(coordinates, options = {}) {
|
|
6732
6760
|
const featureProps = {};
|
|
6733
6761
|
const arrowheadWidthRatio = options.arrowheadWidthRatio ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.arrowheadWidthRatio;
|
|
6734
|
-
const
|
|
6735
|
-
const
|
|
6762
|
+
const rearLineLengthRatio = options.rearLineLengthRatio ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.rearLineLengthRatio;
|
|
6763
|
+
const rearLineAngle = options.rearLineAngle ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.rearLineAngle;
|
|
6736
6764
|
const c1 = coordinates[0];
|
|
6737
6765
|
const c2 = coordinates[1];
|
|
6738
6766
|
const c3 = coordinates[2];
|
|
@@ -6748,13 +6776,13 @@ function createSupportByFire(coordinates, options = {}) {
|
|
|
6748
6776
|
type: "FeatureCollection",
|
|
6749
6777
|
features: []
|
|
6750
6778
|
};
|
|
6751
|
-
const angleRad =
|
|
6779
|
+
const angleRad = rearLineAngle * Math.PI / 180;
|
|
6752
6780
|
const baseAngle = -Math.PI / 2;
|
|
6753
6781
|
const angleLeft = baseAngle - angleRad;
|
|
6754
6782
|
const dirBackLeft = [dirBase[0] * Math.cos(angleLeft) - dirBase[1] * Math.sin(angleLeft), dirBase[0] * Math.sin(angleLeft) + dirBase[1] * Math.cos(angleLeft)];
|
|
6755
6783
|
const angleRight = baseAngle + angleRad;
|
|
6756
6784
|
const dirBackRight = [dirBase[0] * Math.cos(angleRight) - dirBase[1] * Math.sin(angleRight), dirBase[0] * Math.sin(angleRight) + dirBase[1] * Math.cos(angleRight)];
|
|
6757
|
-
const backLen = lenBase *
|
|
6785
|
+
const backLen = lenBase * rearLineLengthRatio;
|
|
6758
6786
|
const p1Back = vecAdd(p1, vecScale(dirBackLeft, backLen));
|
|
6759
6787
|
const p2Back = vecAdd(p2, vecScale(dirBackRight, backLen));
|
|
6760
6788
|
const vLeft = vecSub(p3, p1);
|
|
@@ -6849,8 +6877,8 @@ const SUPPORT_BY_FIRE = defineControlMeasure({
|
|
|
6849
6877
|
//#region src/generators/cm15-maneuver-areas/supportingAttack.ts
|
|
6850
6878
|
const DEFAULT_SUPPORTING_ATTACK_OPTIONS = {
|
|
6851
6879
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
6852
|
-
|
|
6853
|
-
|
|
6880
|
+
smooth: false,
|
|
6881
|
+
smoothResolution: 5
|
|
6854
6882
|
};
|
|
6855
6883
|
const SUPPORTING_ATTACK_METADATA = {
|
|
6856
6884
|
id: "supporting-attack",
|
|
@@ -7293,4 +7321,4 @@ function assertNever(value) {
|
|
|
7293
7321
|
throw new Error(`Unhandled control measure kind: ${String(value)}`);
|
|
7294
7322
|
}
|
|
7295
7323
|
//#endregion
|
|
7296
|
-
export {
|
|
7324
|
+
export { turnDrawRule as $, DEFAULT_GENERIC_POLYGON_OPTIONS as A, DEFAULT_BLOCK_OPTIONS as B, DEFAULT_FIX_OPTIONS as C, DEFAULT_DELAY_OPTIONS as D, DEFAULT_DISRUPT_OPTIONS as E, DEFAULT_BYPASS_OPTIONS as F, DEFAULT_ANTITANK_DITCH_OPTIONS as G, DEFAULT_ATTACK_HELICOPTER_OPTIONS as H, DEFAULT_BREACH_OPTIONS as I, rectangleDrawRule as J, DEFAULT_AMBUSH_OPTIONS as K, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as L, DEFAULT_GENERIC_CIRCLE_OPTIONS as M, DEFAULT_CLASSIC_ARROW_OPTIONS as N, DEFAULT_CLEAR_OPTIONS as O, DEFAULT_CANALIZE_OPTIONS as P, line23DrawRule as Q, DEFAULT_BOUNDARY_OPTIONS as R, DEFAULT_FLOT_OPTIONS as S, DEFAULT_ENCIRCLEMENT_OPTIONS as T, DEFAULT_ATTACK_BY_FIRE_OPTIONS as U, DEFAULT_BATTLE_POSITION_OPTIONS as V, DEFAULT_ANTITANK_WALL_OPTIONS as W, supportByFireDrawRule as X, axis1DrawRule as Y, line24DrawRule as Z, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as _, EPSILON as _t, DEFINITIONS as a, disruptDrawRule as at, DEFAULT_FORTIFIED_AREA_OPTIONS as b, getDefaultOptions as c, createMidpointPerpendicularDrawRule as ct, DEFAULT_SUPPORTING_ATTACK_OPTIONS as d, snapToMidpointPerpendicular as dt, line1DrawRule as et, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as f, createBaselineFrame as ft, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as g, unproject as gt, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as h, project as ht, CONTROL_MEASURE_METADATA as i, centerRadiusDrawRule as it, DEFAULT_GENERIC_LINE_OPTIONS as j, DEFAULT_GENERIC_RECTANGLE_OPTIONS as k, listControlMeasureMetadata as l, getMidpointPerpendicularSignedDistance as lt, DEFAULT_TACTICAL_ARROW_OPTIONS as m, computeInitialWidthPoint as mt, resolveStyleHints as n, attackByFireDrawRule as nt, getControlMeasureMetadata as o, blockDrawRule as ot, DEFAULT_STRONG_POINT_OPTIONS as p, calculateMetrics as pt, DEFAULT_AIRBORNE_ATTACK_OPTIONS as q, CONTROL_MEASURE_IDS as r, point12DrawRule as rt, getControlMeasureMetadataByValue as s, computeDefaultMidpointPerpendicularPoint as st, renderControlMeasure as t, ambushDrawRule as tt, DEFAULT_TURN_OPTIONS as u, pointOnMidpointPerpendicularAxis as ut, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as v, getMetersPerPixel as vt, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as w, DEFAULT_FORTIFIED_LINE_OPTIONS as x, DEFAULT_MAIN_ATTACK_OPTIONS as y, roundToFixed as yt, DEFAULT_BLOCK_ARROW_OPTIONS as z };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M21.43 34.89 L23.39 35.66 L25.90 36.34 L28.87 36.91 L32.23 37.38 L35.90 37.74 L39.25 37.96" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.61 38.14 L56.20 38.00 L60.10 37.74 L63.77 37.38 L67.13 36.91 L70.10 36.34 L72.61 35.66 L74.57 34.89 L76.12 33.91 L77.47 32.66 L78.61 31.17 L79.55 29.49 L80.27 27.66 L80.79 25.70 L81.10 23.67 L81.21 21.60 L81.10 19.54 L80.79 17.51 L80.27 15.55 L79.54 13.72 L78.61 12.03 L77.47 10.55 L76.12 9.30 L74.57 8.32 L72.61 7.55 L70.10 6.87 L67.13 6.30 L63.77 5.83 L60.10 5.47 L56.20 5.21 L52.14 5.05 L48.00 5.00 L43.86 5.05 L39.80 5.21 L35.90 5.47 L32.23 5.83 L28.87 6.30 L25.90 6.87 L23.39 7.55 L21.43 8.32 L19.88 9.30 L18.53 10.55 L17.39 12.03 L16.46 13.72 L15.73 15.55 L15.21 17.51 L14.90 19.54 L14.79 21.60 L14.90 23.67 L15.21 25.70 L15.73 27.66 L16.46 29.49 L17.39 31.17 L18.53 32.66 L19.88 33.91 L21.43 34.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.17 33.36 L42.05 42.90" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.81 33.46 L49.69 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
package/media/circle.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Circle"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M67.00 24.00 L66.91 22.14 L66.63 20.30 L66.18 18.49 L65.56 16.73 L64.76 15.04 L63.80 13.45 L62.69 11.94 L61.43 10.57 L60.06 9.31 L58.55 8.20 L56.96 7.24 L55.27 6.44 L53.51 5.82 L51.70 5.37 L49.86 5.09 L48.00 5.00 L46.14 5.09 L44.30 5.37 L42.49 5.82 L40.73 6.44 L39.04 7.24 L37.45 8.20 L35.94 9.31 L34.57 10.57 L33.31 11.94 L32.20 13.45 L31.24 15.04 L30.44 16.73 L29.82 18.49 L29.37 20.30 L29.09 22.14 L29.00 24.00 L29.09 25.86 L29.37 27.71 L29.82 29.51 L30.44 31.27 L31.24 32.96 L32.20 34.55 L33.31 36.06 L34.57 37.43 L35.94 38.69 L37.45 39.80 L39.04 40.76 L40.73 41.56 L42.49 42.18 L44.30 42.63 L46.14 42.91 L48.00 43.00 L49.86 42.91 L51.70 42.63 L53.51 42.18 L55.27 41.56 L56.96 40.76 L58.55 39.80 L60.06 38.69 L61.43 37.43 L62.69 36.06 L63.80 34.55 L64.76 32.96 L65.56 31.27 L66.18 29.51 L66.63 27.71 L66.91 25.86 L67.00 24.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Encirclement"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M30.33 32.84 L30.69 33.55 L31.12 34.20 L31.61 34.79 L32.15 35.33 L32.74 35.83 L33.37 36.27 L34.04 36.67 L34.75 37.03 L35.48 37.36 L36.23 37.66 L37.00 37.93 L37.78 38.18 L38.57 38.41 L39.37 38.62 L40.15 38.83 L40.93 39.02 L41.72 39.20 L42.55 39.36 L43.41 39.49 L44.30 39.60 L45.21 39.68 L46.13 39.74 L47.06 39.78 L48.00 39.79 L48.94 39.78 L49.87 39.74 L50.79 39.68 L51.70 39.60 L52.59 39.49 L53.45 39.36 L54.28 39.20 L55.07 39.02 L55.85 38.83 L56.63 38.62 L57.43 38.41 L58.22 38.18 L59.00 37.93 L59.77 37.66 L60.52 37.36 L61.25 37.03 L61.96 36.67 L62.63 36.27 L63.26 35.83 L63.85 35.33 L64.39 34.79 L64.88 34.20 L65.31 33.55 L65.67 32.84 L65.98 32.03 L66.25 31.10 L66.48 30.07 L66.66 28.95 L66.81 27.77 L66.92 26.54 L66.98 25.28 L67.00 24.00 L66.98 22.72 L66.92 21.46 L66.81 20.23 L66.66 19.05 L66.48 17.93 L66.25 16.90 L65.98 15.97 L65.67 15.16 L65.31 14.45 L64.88 13.80 L64.39 13.21 L63.85 12.67 L63.26 12.17 L62.63 11.73 L61.96 11.33 L61.25 10.97 L60.52 10.64 L59.77 10.34 L59.00 10.07 L58.22 9.82 L57.43 9.59 L56.63 9.38 L55.85 9.17 L55.07 8.98 L54.28 8.80 L53.45 8.64 L52.59 8.51 L51.70 8.40 L50.79 8.32 L49.87 8.26 L48.94 8.22 L48.00 8.21 L47.06 8.22 L46.13 8.26 L45.21 8.32 L44.30 8.40 L43.41 8.51 L42.55 8.64 L41.72 8.80 L40.93 8.98 L40.15 9.17 L39.37 9.38 L38.57 9.59 L37.78 9.82 L37.00 10.07 L36.23 10.34 L35.48 10.64 L34.75 10.97 L34.04 11.33 L33.37 11.73 L32.74 12.17 L32.15 12.67 L31.61 13.21 L31.12 13.80 L30.69 14.45 L30.33 15.16 L30.02 15.97 L29.75 16.90 L29.52 17.93 L29.34 19.05 L29.19 20.23 L29.08 21.46 L29.02 22.72 L29.00 24.00 L29.02 25.28 L29.08 26.54 L29.19 27.77 L29.34 28.95 L29.52 30.07 L29.75 31.10 L30.02 32.03 L30.33 32.84 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M29.81 31.29 L27.43 34.32 L31.15 34.24" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M34.18 36.74 L34.45 40.46 L37.18 37.98" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M40.99 39.03 L42.09 42.58 L44.20 39.59" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M48.15 39.79 L49.90 43.00 L51.40 39.63" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.29 38.96 L57.72 41.70 L58.43 38.11" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M62.08 36.60 L65.51 38.19 L64.59 34.55" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.27 31.01 L69.80 29.95 L66.81 27.80" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.99 23.85 L70.20 22.07 L66.84 20.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.19 16.71 L68.57 13.68 L64.85 13.76" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M61.82 11.26 L61.55 7.54 L58.82 10.02" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.01 8.97 L53.91 5.42 L51.80 8.41" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M47.85 8.21 L46.10 5.00 L44.60 8.37" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M40.71 9.04 L38.28 6.30 L37.57 9.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M33.92 11.40 L30.49 9.81 L31.41 13.45" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.73 16.99 L26.20 18.05 L29.19 20.20" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.01 24.15 L25.80 25.93 L29.16 27.40" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
package/media/line.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Line"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.78 43.00 L48.00 5.00 L90.22 34.56" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Polygon"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M23.93 43.00 L67.00 40.47 L72.07 12.60 L36.60 5.00 L23.93 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Rectangle"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M16.91 43.00 L79.09 43.00 L79.09 5.00 L16.91 5.00 L16.91 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Strong Point"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M28.58 33.73 L30.01 34.29 L31.84 34.78 L34.00 35.20 L36.45 35.54 L39.13 35.81 L41.58 35.97" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M51.31 36.10 L53.93 36.00 L56.78 35.81 L59.45 35.54 L61.90 35.20 L64.07 34.78 L65.89 34.29 L67.32 33.73 L68.45 33.01 L69.44 32.10 L70.27 31.02 L70.95 29.79 L71.48 28.45 L71.86 27.03 L72.08 25.55 L72.16 24.04 L72.08 22.54 L71.86 21.06 L71.48 19.63 L70.95 18.29 L70.27 17.07 L69.44 15.99 L68.45 15.07 L67.32 14.36 L65.89 13.79 L64.07 13.30 L61.90 12.88 L59.45 12.54 L56.78 12.28 L53.93 12.09 L50.97 11.98 L47.95 11.94 L44.93 11.98 L41.97 12.09 L39.13 12.28 L36.45 12.54 L34.00 12.88 L31.84 13.30 L30.01 13.79 L28.58 14.36 L27.45 15.07 L26.46 15.99 L25.63 17.07 L24.95 18.29 L24.42 19.63 L24.04 21.06 L23.82 22.54 L23.74 24.04 L23.82 25.55 L24.04 27.03 L24.42 28.45 L24.95 29.79 L25.63 31.02 L26.46 32.10 L27.45 33.01 L28.58 33.73" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M31.89 34.80 L30.57 41.63" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M38.78 35.77 L38.09 42.70" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.68 36.04 L52.95 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M59.62 35.52 L60.58 42.41" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.41 34.09 L68.98 40.56" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M71.15 29.30 L77.62 31.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M72.08 22.47 L78.96 21.42" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M69.53 16.11 L75.05 11.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M63.38 13.17 L64.70 6.33" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M56.49 12.26 L56.95 5.31" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.54 11.96 L49.62 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.58 12.07 L42.31 5.11" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M35.65 12.65 L34.69 5.76" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M28.89 14.23 L26.32 7.77" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M24.52 19.39 L18.05 16.83" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M23.92 26.25 L17.04 27.30" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M26.82 32.43 L22.09 37.53" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M43.70 32.61 L43.62 39.57" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.27 32.68 L49.18 39.64" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orbat-mapper/control-measures",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.8",
|
|
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",
|